day08 ---- Hbase 操作,进一步了解HBase结构

在这里插入图片描述
QuorumPeerMain :是zookeeper集群的启动入口类,是用来加载配置启动QuorumPeer线程的。

Store
memstore 128m 满了 刷盘
storefile 是对HFile 的上层封装
HFile 真正存储的文件

在这里插入图片描述
为什么order数据就在01节点

在这里插入图片描述
在这里插入图片描述

HBase shell操作

1、进入HBase客户端命令操作界面

$ bin/hbase shell

2、查看帮助命令

hbase(main):001:0> help

3、查看当前数据库中有哪些表list

hbase(main):002:0> list

4、创建一张表

创建user表,包含info、data两个列族

hbase(main):010:0> create 'user', 'info', 'data'

或者

hbase(main):010:0> create 'user1', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}

在这里插入图片描述
在这里插入图片描述

5、添加数据操作

向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan

hbase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'

在这里插入图片描述

向user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为female

hbase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female'

向user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20

hbase(main):013:0> put 'user', 'rk0001', 'info:age', 20

向user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为picture

hbase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'

6、查询数据操作

1、通过rowkey进行查询
获取user表中row key为rk0001的所有信息

hbase(main):015:0> get 'user', 'rk0001'

在这里插入图片描述
查到的内容是在缓存中,还未上传

在这里插入图片描述

手动刷盘
或隔1小时,或存满128m 自动刷盘
在这里插入图片描述

2、查看rowkey下面的某个列族的信息

获取user表中row key为rk0001,info列族的所有信息

hbase(main):016:0> get 'user', 'rk0001', 'info'

3、查看rowkey指定列族指定字段的值

获取user表中row key为rk0001,info列族的name、age列标示符的信息

hbase(main):017:0> get 'user', 'rk0001', 'info:name', 'info:age'

4、查看rowkey指定多个列族的信息
获取user表中row key为rk0001,info、data列族的信息

hbase(main):018:0> get 'user', 'rk0001', 'info', 'data'

或者你也可以这样写

hbase(main):019:0> get 'user', 'rk0001', {COLUMN => ['info', 'data']}

或者你也可以这样写,也行

hbase(main):020:0> get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}

5、指定rowkey与列值查询 FILTER
获取user表中row key为rk0001,cell的值为zhangsan的信息
cell:单元格

hbase(main):030:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}

6、指定rowkey与列值模糊查询
获取user表中row key为rk0001,列标示符中含有a的信息

hbase(main):031:0> get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

在这里插入图片描述

继续插入一批数据

hbase(main):032:0> put 'user', 'rk0002', 'info:name', 'zhangfei'
hbase(main):033:0> put 'user', 'rk0002', 'info:gender', 'female'
hbase(main):034:0> put 'user', 'rk0002', 'info:nationality', '中国'
hbase(main):035:0> get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}

7、查询所有数据
查询user表中的所有信息

scan 'user'

8、列族查询
查询user表中列族为info的信息

scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

在这里插入图片描述

9、多列族查询
查询user表中列族为info和data的信息

scan 'user', {COLUMNS => ['info', 'data']}

scan 'user', {COLUMNS => ['info:name', 'data:pic']}

10、指定列族与某个列名查询
查询user表中列族为info、列标示符为name的信息

scan 'user', {COLUMNS => 'info:name'}

11、指定列族与列名以及限定版本查询
查询user表中列族为info、列标示符为name的信息,并且版本最新的5个

scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

12、指定多个列族与按照数据值模糊查询
查询user表中列族为info和data且列标示符中含有a字符的信息

scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

13、rowkey的范围值查询
查询user表中列族为info,rk范围是[rk0001, rk0003)的数据

scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

14、指定rowkey模糊查询
查询user表中row key以rk字符开头的

scan 'user',{FILTER=>"PrefixFilter('rk')"}

15、指定数据范围值查询
查询user表中指定范围的数据

scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

7 更新数据操作

  1. 更新数据值
    更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加

  2. 更新版本号
    将user表的info列族版本号改为5

    hbase(main):050:0> alter 'user', NAME => 'info', VERSIONS => 4
    

8 删除数据以及删除表操作

注意:
HBase 不是立即删除 (逻辑删除)

真正的删除是在合并时才会删除(物理删除),默认每隔一个小时合并一次

在这里插入图片描述

  1. 指定rowkey以及列名进行删除
    删除user表row key为rk0001,列标示符为info:name的数据

    hbase(main):045:0> delete 'user', 'rk0001', 'info:name'
    
  2. 指定rowkey,列名以及字段值进行删除
    删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据

    delete 'user', 'rk0001', 'info:name', 1392383705316
    
  3. 删除一个列族
    删除一个列族:

    alter 'user', NAME => 'info', METHOD => 'delete' 
    
    或 alter 'user', 'delete' => 'info'
    
  4. 清空表数据

    hbase(main):017:0> truncate 'user'
    
  5. 删除表
    首先需要先让该表为disable状态,使用命令:

    hbase(main):049:0> disable 'user'
    

    然后才能drop这个表,使用命令:

    hbase(main):050:0> drop 'user'
    

    (注意:如果直接drop表,会报错:Drop the named table. Table must first be disabled)

9 统计一张表有多少行数据

hbase(main):053:0> count 'user'

10 查看表结构信息

hbase(main):053:0> describe 'user'

desc

HBase 的 java 开发

依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.7</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

创建表myuser

    @Test
    public void createTable() throws IOException {
        //创建配置文件对象,并指定zookeeper的连接地址
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.property.clientPort", "2181");
        configuration.set("hbase.zookeeper.quorum", "hadoop01,hadoop02,hadoop03");
        //集群配置
        //configuration.set("hbase.zookeeper.quorum", "101.236.39.141,101.236.46.114,101.236.46.113");

        Connection connection = ConnectionFactory.createConnection(configuration);
        Admin admin = connection.getAdmin();

        //添加列族
        //创建myuser表,包括f1,f2两个列族
        //创建两个列族的表述符
        ColumnFamilyDescriptor f1 = ColumnFamilyDescriptorBuilder.newBuilder("f1".getBytes()).build();
        ColumnFamilyDescriptor f2 = ColumnFamilyDescriptorBuilder.newBuilder("f2".getBytes()).build();
        //通过TableDescriptorBuilder来实现我们表的参数设置,包括表名,列族等等
        TableDescriptor tb = TableDescriptorBuilder
                .newBuilder(TableName.valueOf("myuser"))
                .setColumnFamily(f1)
                .setColumnFamily(f2)
                .build();

        //创建表
        boolean myuser = admin.tableExists(TableName.valueOf("myuser"));
        if(!myuser){
            admin.createTable(tb);
        }
        //关闭客户端连接
        admin.close();
    }

在这里插入图片描述

向表中添加数据

    @Test
    public void addData() throws IOException {
        //连接
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "hadoop01:2181");
        Connection connection = ConnectionFactory.createConnection(conf);

        //dml操作
        Table myuser = connection.getTable(TableName.valueOf("myuser"));
        //put 对象的定义
        Put put = new Put("0001".getBytes());
        put.addColumn("f1".getBytes(), "id".getBytes(), Bytes.toBytes(1));//
        put.addColumn("f1".getBytes(), "name".getBytes(), Bytes.toBytes("zhangsan"));
        put.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(20));

        put.addColumn("f2".getBytes(), "address".getBytes(), "北京".getBytes());
        put.addColumn("f2".getBytes(), "phone".getBytes(), "123231212".getBytes());

        //插入数据
        myuser.put(put);
        //关闭资源
        myuser.close();
        connection.close();
    }

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

全盘扫描

在这里插入图片描述

在这里插入图片描述

    @Test
    public void scanAllData() throws IOException {
        //连接
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "hadoop01:2181");
        Connection connection=ConnectionFactory.createConnection(conf);

        //获取table对象
        Table myuser=connection.getTable(TableName.valueOf("myuser"));
        //定义一个Scan对象
        Scan scan=new Scan();
        //查询范围是左闭右开
        //scan.setStartRow("0002".getBytes());
        //scan.setStopRow("0005".getBytes());

        ResultScanner scanner = myuser.getScanner(scan);
        //for循环获取每一个result结果集
        for (Result result : scanner) {
            System.out.println(
                    Bytes.toString(result.getValue("f1".getBytes(),"name".getBytes() )));
            System.out.println(
                    Bytes.toInt(result.getValue("f1".getBytes(),"age".getBytes() )));
            System.out.println(
                    Bytes.toString(result.getValue("f2".getBytes(),"address".getBytes() )));
        }

        //关闭资源
        myuser.close();
        connection.close();
    }

在这里插入图片描述

根据rowkey 删除数据

    @Test
    public  void  deleteByRowKey() throws IOException {
        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "hadoop01:2181,hadoop02:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        //
        Table myuser = connection.getTable(TableName.valueOf("myuser"));
        Delete delete = new Delete("0001".getBytes());

        //
        myuser.delete(delete);

        //
        myuser.close();
        connection.close();

    }

删除表

注意:删除表要先disableTable

    @Test
    public void  deleteTable() throws IOException {
        //获取连接
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "hadoop01:2181,hadoop02:2181");
        Connection connection = ConnectionFactory.createConnection(configuration);

        Admin admin = connection.getAdmin();
        
        admin.disableTable(TableName.valueOf("myuser"));
        admin.deleteTable(TableName.valueOf("myuser"));
        //
        admin.close();
        connection.close();
    }

HBase的表数据模型

在这里插入图片描述
数据的排序是按照字典排序
注意:
字典序对int排序的结果是
1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。

Row Key 的设计

hbase rowkey设计原则查找相关问题

数据量非常大时 ,避免产生热点问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值