文档章节

HBase基本命令与新版本Java API

trayvon
 trayvon
发布于 06/25 19:59
字数 1458
阅读 40
收藏 3

简介

有关HBase的安装可以参考hbase安装

我们可以通过hbase shell和hbase数据库进行交互,也可以通过Java-api和hbase数据库交互,这里我们使用的是hbase-client。

主要是介绍2.0重大重构之后的api的基本使用。

hbase-java-api

命名空间

#列出所有命名空间
list_namespace    
#新建命名空间
create_namespace 'namespaceName' 
#删除命名空间
drop_namespace 'namespaceName'    
#修改命名空间

表操作

create:创建表

exists:检查表是否存在

list:查看所有表

alter:修改表

delete:删除列

disable:禁用表

is_enabled:查看表是否禁用

desc\describe:查看表结构

drop:删除表

put:插入数据

count:统计表有多少行

get:获取数据

scan:扫描表或者列

#列出所有表
list    
#列出指定命名空间下的所有表
list_namespace_tables 'namespaceName'    
#新建一个以命名空间namespaceName的表tableName,列族为cf1。
create 'namespaceName:tableName', 'cf1'
create 'tablename','columnFamily1','columnFamily2'
create 'tablename',{NAME => 'columnFamily1',VERSIONS => 1, TTL => 214783647, BLOCKCACHE => false,IN_MEMORY=>false},{NAME=>'columnFamily2',VERSIONS=>1,TTL=>259200,BLOCKCACHE=>false,IN_MEMORY=>false}      
disable 'tableName'
#删除表
drop 'tableName'
#查看表内容,查看前5行数据
scan 'namespaceName:tableName', {LIMIT=>5} 
#插入  put tableName rowkey,"columnFamily:column","value"
put 'tableName', 'rowkey', 'columnFamilyName:columnName', 'value'
#查看 get rowKey
get 'tableName', 'rowkey'

删除表中的列簇,先disable表,修改后enable表,严格区分大小写

scan

查询user表中的所有信息
scan 'user'

查询user表中列族为info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}

查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
 
查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}
 
查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

查询user表中row key为rk0001,cell的值为中国
scan 'user', 'rk0001', {FILTER => "ValueFilter(=,'binary:中国')"}

查询user表中row key为rk0001,列标示符中含有a的信息
scan 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

查询user表中row key以rk字符开头的
scan 'user',{FILTER=>"PrefixFilter('rk')"}

查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

get命令也可以使用如上所示的scan命令方式

基本命令

help:查看命令帮助

status:查看hbase状态

version:查看hbase版本

快照

修改表名HBase没有rename命令,可以通过快照功能修改表名

//为表创建快照,这时还没有复制数据
clone_snapshot 'tableSnapshot', 'newTableName'

//根据某个快照而创建新表,此时复制数据
snapshot 'tableName', 'tableSnapshot'

//删除快照
delete_snapshot 'tableSnapshot'

Java API

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.2.0</version>
</dependency>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class HBaseTest {

    private static final String ZOOKEEPER_QUORUM = "127.0.0.1:2181";

    public static final String TABLE_NAME = "test_tb";

    private Connection connection;

    private Configuration configuration;

    @Before
    public void setUp() throws IOException {
        configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", ZOOKEEPER_QUORUM);
        connection = ConnectionFactory.createConnection(configuration);
    }

    @Test
    public void createTable() throws Exception {
        Admin admin = connection.getAdmin();
        TableName tableName = TableName.valueOf(TABLE_NAME);

        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
        ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");
        ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info");
        tableDescriptorBuilder.setColumnFamily(baseInfo);
        tableDescriptorBuilder.setColumnFamily(extInfo);

        TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
        admin.createTable(tableDescriptor);
    }

    @Test
    public void dealTable() throws IOException {
        Admin admin = connection.getAdmin();
        String tableNameString = "test_user";
        TableName tableName = TableName.valueOf(tableNameString);
        if(admin.tableExists(tableName)){
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
        }
    }

    @Test
    public void descTable() throws IOException {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        TableDescriptor tableDescriptor = table.getDescriptor();
        ColumnFamilyDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
        for(ColumnFamilyDescriptor cfd : columnFamilies){
            System.out.println(Bytes.toString(cfd.getName()));
        }
    }

    @Test
    public void put() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Put put=new Put(Bytes.toBytes("user_info_1"));
//        put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes("tim"));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes("123"));
        table.put(put);
    }

    @Test
    public void puts() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        LinkedList<Put> puts = new LinkedList<>();
        puts.add(getPut("user_info_2"));
        puts.add(getPut("user_info_3"));
        puts.add(getPut("user_info_4"));
        table.put(puts);
    }

    private static Put getPut(String rowKey){
        Put put=new Put(Bytes.toBytes(rowKey));
        Random random = new Random();
        String name = String.valueOf(random.nextInt(1000000));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes(name));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes(name));
        return put;
    }


    @Test
    public void get() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Get get =new Get(Bytes.toBytes("user_info_1"));
        get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"));
        Result result=table.get(get);

        List<Cell> cells = result.listCells();
        for(Cell cell: cells){
            System.out.println(Bytes.toString(cell.getFamilyArray()));
            System.out.println(Bytes.toString(cell.getQualifierArray()));
            System.out.println(Bytes.toString(cell.getValueArray()));
            System.out.println(cell.getTimestamp());
        }
    }

    @Test
    public void gets() throws IOException {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        LinkedList<Get> gets = new LinkedList<>();
        gets.add(getGet("user_info_1"));
        gets.add(getGet("user_info_2"));
        gets.add(getGet("user_info_3"));
        gets.add(getGet("user_info_4"));
        Result[] results = table.get(gets);
        for(Result result : results){
            System.out.println(new String(result.getRow()));
            System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"))));
            System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("tel"))));
        }
    }

    private static Get getGet(String rowKey){
        Get get =new Get(Bytes.toBytes(rowKey));
        get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"));
        get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"));
        return get;
    }

    @Test
    public void scan() throws IOException {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Scan s = new Scan();
        ResultScanner resultScanner = table.getScanner(s);
        for(Result result : resultScanner){
            byte[] row = result.getRow();
            System.out.println(new String(row));
            System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"))));
        }
    }

    @Test
    public void deleteRowKey() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Delete de =new Delete(Bytes.toBytes("rowKey"));
        table.delete(de);
    }

    @Test
    public void deleteColumn() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Delete de =new Delete(Bytes.toBytes("rowKey"));
        de.addColumn(Bytes.toBytes(""), Bytes.toBytes(""));
        table.delete(de);
    }

    @Test
    public void disableTable() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Admin admin = connection.getAdmin();
        admin.disableTable(tableName);
    }

    @Test
    public void listNamespace() throws Exception {
        Admin admin = connection.getAdmin();
        NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();
        for(NamespaceDescriptor namespaceDescriptor : namespaceDescriptors){
            System.out.println(namespaceDescriptor.getName());
        }
    }

    @Test
    public void listTables() throws IOException {
        Admin admin = connection.getAdmin();
        List<TableDescriptor> tableDescriptors = admin.listTableDescriptors();
        for(TableDescriptor tableDescriptor : tableDescriptors){
            System.out.println(tableDescriptor.getTableName().getNameAsString());
        }
    }
}

重点就是构建连接:

Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "127.0.0.1:2181");
Connection connection = ConnectionFactory.createConnection(configuration);

相关的操作基本和Admin有关,通过Connection获取Admin:

Admin admin = connection.getAdmin();

不再使用字符串表明,而是使用TableName抽象:

TableName tableName = TableName.valueOf("tableName");

表描述构建:

TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);

列簇构建:

ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");

下面的createTable基本把表相关的抽象都使用到了:

@Test
public void createTable() throws Exception {
    Admin admin = connection.getAdmin();
    TableName tableName = TableName.valueOf(TABLE_NAME);

    TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
    ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");
    ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info");
    tableDescriptorBuilder.setColumnFamily(baseInfo);
    tableDescriptorBuilder.setColumnFamily(extInfo);

    TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
    admin.createTable(tableDescriptor);
}

© 著作权归作者所有

trayvon
粉丝 16
博文 139
码字总数 212026
作品 1
程序员
私信 提问
大数据(HBase-分布式安装和基本命令使用)

分布式搭建 1:下载官网对应的hbase的版本 地址:http://archive.apache.org/dist/hbase/1.2.3/ 2:上传对应的版本到主节点并解压 3:配置hbase的环境变量 export HBASEHOME=/home/hadoop/bd...

这很耳东先生
06/26
0
0
2018-08-12期 Hbase本地模式安装部署

说明: Hbase部署模式有以下三种 (1)本地模式:本地模式不依赖于HDFS存储,将文件存储到操作系统本地目录,好处是我们不需要搭建HDFS集群,即可学些HBase相关命令及客户端操作。 (2)伪分...

JackmaSong
2018/08/12
0
0
HBase实操 | 如何使用Java连接Kerberos的HBase

一.文档编写目的 出于CDH集群安全考虑,在CDH集群中增加了Kerberos认证机制。因为HBase的存储系统是基于Hadoop的存储,所以通过HBase客户端访问HBase数据库时需要进行身份认证。在Linux下使用...

封神
2018/11/27
0
0
Windows HBase2.2.0安装部署踩坑

下载安装 hbase下载 解压之后根目录,没有什么要修改的。 配置文件目录,主要修改hbase-env.cmd和hbase-site.xml hbase-env.cmd HBASEMANAGESZK值为false表示zookeeper外装,HBASEMANAGESZK的...

trayvon
06/25
0
0
CentOS 下 Hadoop+Hbase 安装手册

安装前必看 因为Hadoop本身的优势的将 文件的存储 和 任务处理 分布化,Hadoop分布式架构中有如下两种负责不同功能的服务器,master服务器 和 slave服务器。所以,本安装手册将从二者 的 共体...

鉴客
2011/07/18
9.7K
3

没有更多内容

加载失败,请刷新页面

加载更多

kotlin中奖概率

fun main() { var wins = 0 var chance = 0.2 var playTime = 10// 1000万次 val n = 10000000 (1..n).forEach { if (play(chance, playTime)) win......

oschina4cyy
9分钟前
0
0
第十一讲:爬取猫眼网站上的前100名电影

本次我们来通过翻页爬取的方式爬取猫眼电影里面推荐的前100名电影,并存储到数据库。 1、我们登录猫眼,看下我们的数据在哪里 然后点击今日TOP100,看下具体的网页数据 最下面我们看到底部有...

刘日辉
9分钟前
8
0
git 设置全局用户名/邮箱和某个项目用户名/邮箱/密码

一、特定项目设置用户名/邮箱/密码的方法 找到项目所在目录下的 .git,进入.git文件夹,然后执行如下命令分别设置用户名和邮箱 git config user.name "dawn.he" git config user.email "1...

hexiaoming123
9分钟前
0
0
好程序员分享Linux重器vi编辑器

创建练习文件 [root@tianyun ~]# ll -a > list.txt 文件编辑器 gedit 文件编辑器 vi, vim, nano vi编辑器工作模式 命令模式: a. 光标定位 hjkl 0 $ gg G 3G 进入第三行 /string (n N 可以循...

好程序员IT
11分钟前
2
0
Git整理(五) git cherry-pick的使用

概述 git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行...

嘿嘿嘿IT
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部