hadoop生态--Hbase

一、什么是Hbase

一种特殊的数据库,nosql(非关系型数据库)、分布式。

数据的最终持久化存储基于HDFS,存储容量支持在线扩容。

支持实时操作数据:增删改查

是一种基于列的数据库

二、Hbase特性

2-1 表的逻辑结构

Hbase表包括:表名  行键(rowkey) 列族

rowkey决定了哪一行,列族决定了哪几列。

列族中数据以key-value形式存储,一个键值对称一个cell

同一个列族中的可以包含的列的数量和列的key都不固定。

同一个数据可以保留多个版本

2-2 Hbase工作机制及存储结构

Hbase是一种分布式数据库,服务器搭建在集群之上,多个请求被分配到不同的服务器上。请求的划分是通过region来区分的。

Hbase服务器仅仅负责完成增删改查的逻辑,不负责数据存储。一个hbase服务器叫一个region server,一个regionserver可以管理多个region。

Hbase集群中的角色:

region server :管理自己所负责的region数据的读写,负责接收并执行数据的增删改查请求,读写hdfs,受master调度。可以有多个,视region的数量和数据量而定。

除了存储表中数据,还存储表的元数据(如哪个region存在哪个region server上,即索引信息)。这个元数据也存储在一个meta_region中,这个meta_region在哪个region server中呢?zk记录。

master:负责调度和存储region与region server的对应关系,监控region server健康状态。不负责接受请求进行查询(不与请求客户端节点通信)。例如,如果有region server宕机,则把其负责的region分配给其他region server。master节点存在单点故障问题,通过HA进行解决,一个active ,一个standby。Admin职能:创建、删除、修改Table的定义。实现DDL操作(namespace和table的增删改,column familiy的增删改等)。管理namespace和table的元数据(实际存储在HDFS上)

zookeeper:master通过zk监控region server的状态。

HDFS:负责数据的存储

HDFS中表的存储结构

Hbase的数据存储在HDFS中,数据存储按照列族来分,一个存储目录示例:

/hbase/库目录/表目录/region1/列族1/数据文件
        ……                /列族2/数据文件
                  /region2/

数据的存储类型:存储的是二进制数组byte[] ,包括了rowkey、key、value、列族、表名等。

Hbase中的数据是有序的,先按rowkey排序,然后按照列名的key的字典序排序。

数据的存储过程

每个region在region server中先存入内存,缓存写满时持久化到HDFS。其实,如果数据量较小的话,会在region  server中存储一些热数据(最近访问)。

如果宕机,数据还没持久化到HDFS怎么办?在写数据的时候会把数据操作写到日志中,一旦宕机,通过日志进行恢复。

那么又要如何区分数据是否已经持久化到HDFS中了呢?

参考另一篇,布隆过滤器。

 数据查询时的路由过程:

1、客户端先到zk上查询meta 表所在的 redion server

2、到meta 表查询自己需要的数据所在的region server

3、到目标region server请求自己的数据。

客户端查询数据时经过zk 和 region server,与master无关。

布隆过滤器:

从爬虫说起,为防止爬去重复url,通过hash算法,把urlbian'cehng

判断是否已经爬过,如果1的位置相同,可能爬过,位置不同,一定没有爬过,

三、操作HBase

3-1 建表 

create 't_表名','列族1','列族2'

3-2 插入数据

进入hbase命令行

put 't_表名','rowkey''列族1:key','value'

eg:

hbase(main):011:0> put 't_user_info','001','base_info:username','zhangsan'
0 row(s) in 0.2420 seconds

hbase(main):012:0> put 't_user_info','001','base_info:age','18'
0 row(s) in 0.0140 seconds

hbase(main):013:0> put 't_user_info','001','base_info:sex','female'
0 row(s) in 0.0070 seconds

hbase(main):014:0> put 't_user_info','001','extra_info:career','it'
0 row(s) in 0.0090 seconds

3-3 数据查询

1、scan 扫描表

hbase(main):017:0> scan 't_user_info'
ROW                               COLUMN+CELL                                                                                     
 001                              column=base_info:age, timestamp=1496567924507, value=18                                         
 001                              column=base_info:sex, timestamp=1496567934669, value=female                                     
 001                              column=base_info:username, timestamp=1496567889554, value=zhangsan                              
 001                              column=extra_info:career, timestamp=1496567963992, value=it                                     
 002                              column=base_info:username, timestamp=1496568034187, value=liuyifei                              
 002                              column=extra_info:career, timestamp=1496568008631, value=actoress                               
2 row(s) in 0.0420 seconds

2、get 获取单行数据

hbase(main):020:0> get 't_user_info','001'
COLUMN                            CELL                                                                                            
 base_info:age                    timestamp=1496568160192, value=19                                                               
 base_info:sex                    timestamp=1496567934669, value=female                                                           
 base_info:username               timestamp=1496567889554, value=zhangsan                                                         
 extra_info:career                timestamp=1496567963992, value=it                                                               
4 row(s) in 0.0770 seconds

3-4 

3-1DDL 数据定义

  • 创建表

1、构造与Hbase配置对象,以配置文件为参数构造Hbase连接对象(这个连接对象可以是公用的

2、从连接中构造一个DDL操作器Admin类对象

3、创建表定义描述对象HTableDescriptor类对象、

4、创建列族定义描述对象HColumnDescriptor ,通过列族定义描述对象可以设置数据的最大版本数等(最大默认是1)

5、将列族添加到表中

6、用DDL操作器对象admin,来建表

7、关闭admin,关闭conn

  • 删除表

3-2 DML 数据操作

1、构造与Hbase配置对象,以配置文件为参数构造Hbase连接对象(这个连接对象可以是公用的

2、从连接中构造一个DDL操作器Admin类对象

3、停用表

4、删除表

  • 修改表定义(新增一个列族)

1、构造与Hbase配置对象,以配置文件为参数构造Hbase连接对象(这个连接对象可以是公用的

2、从连接中构造一个DDL操作器Admin类对象

3、取出表的定义信息

4、新构造一个列族定义

并通过列族定义设置该列族的布隆过滤器类型

5、将列族定义添加到表定义对象

6、将修改过的表定义交给admin提交

    public void testAlterTable() throws Exception{
        
        Admin admin = conn.getAdmin();
        
        // 取出旧的表定义信息
        HTableDescriptor tableDescriptor = admin.getTableDescriptor(TableName.valueOf("user_info"));
        
        
        // 新构造一个列族定义
        HColumnDescriptor hColumnDescriptor = new HColumnDescriptor("other_info");
        hColumnDescriptor.setBloomFilterType(BloomType.ROWCOL); // 设置该列族的布隆过滤器类型
        
        // 将列族定义添加到表定义对象中
        tableDescriptor.addFamily(hColumnDescriptor);
        
        
        // 将修改过的表定义交给admin去提交
        admin.modifyTable(TableName.valueOf("user_info"), tableDescriptor);
        
        
        admin.close();
        conn.close();
        
    }
View Code

 补充:布隆过滤器

原文地址:https://www.cnblogs.com/Jing-Wang/p/10942940.html