首页   快速返回

Hbase     所属分类 bigdata
HBase 构建在HDFS上的分布式列存储系统,主要用于海量结构化数据存储

HDFS适合批处理场景
不支持数据随机查找
不适合增量数据处理
不支持数据更新


HDFS VS HBASE

write pattern  
appendOnly   
random write ,bulk incremental

read pattern
full table scan , partition table scan
Random read , small range scan , table scan


hive(hsql) performance 
very good
4-5x slower

structured storage  
do-it-yourself , sequence file 
sparse column family data model

max data size 
30+PB
1PB

Hbase表特点
        大:一个表可以有数十亿行,上百万列;
        无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
        面向列:面向列(族)的存储和权限控制,列(族)独立检索;
        稀疏:对于空(null)的列,并不占用存储空间,表可以设计的非常稀疏;
        数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
        数据类型单一:Hbase中的数据都是字符串,没有类型。

行存储和列存储的比较

传统行式数据库
        数据按行存储的
        没有索引的查询使用大量I/O
        建立索引和物化视图需要花费大量时间和资源
        按行读取

列式数据库
        数据是按列存储-每一列单独存放
        数据即是索引
        只访问查询涉及的列-大量降低系统I/O
        每一列由一个线程来处理-查询并发处理
        数据类型一致,数据特征相似-高效压缩

基本概念
    Row Key
        Byte array
        表中每条记录的“主键”
        方便快速查找
    Column Family
        拥有一个名称(string)
        包含一个或者多个相关列
    Column
        属于某一个Column Family
        包含在某一列中
                familyName:columnName
    Version Number
        每个rowkey唯一
        默认值: 系统时间戳
        类型为Long
    Value (Cell)
        Byte array

数据模型
        HBase schema可以有多个 Table
        每个表可由多个Column Family组成
        HBase 可以有 Dynamic Column
                列名称是编码在cell中的
                不同的cell可以拥有不同的列
        version number 可由用户提供
                无需以递增的顺序插入
                每一行的rowkey必须是唯一的
        Table 可能非常稀疏
                很多 cell 可以是空的 
        Row Key是主键

HBase支持操作
    所有操作都是基于rowkey的
    支持crud和scan
    单行操作:put、get、scan
    多行操作:MultiPut、scan
    没有内置join操作,可以使用MapReduce解决


物理模型
    rowkey和version number在每个column family中都有一份
    每个column family存储在HDFS上的一个单独文件中
    
    
物理存储
1、Table中的所有行都按照row key的字典序排列; 
2、Table 在行的方向上分割为多个Region;
3、Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;
4、Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上;
5、Region虽然是分布式存储的最小单元,但并不是存储的最小单元。
      Region由一个或者多个Store组成,每个store保存一个columns family;
      每个Strore又由一个memStore和0至多个StoreFile组成;
      memStore存储在内存中,StoreFile存储在HDFS上。


HBase基本组件
    Client
            包含访问HBase的接口,并维护cache来加快对HBase的访问
    Zookeeper
            Hbase依赖Zookeeper,hbase会管理zookeeper的实例
            保证任何时候,集群中只有一个master
            存储所有region的寻址入口
            实时监控region server的上线和下线信息,并实时通知给master
            存储hbase的schema和table元数据
    Master
            为region server分配region
            负责region server的负载均衡
            发现失效的region server并重新分配其上的region
            管理用户对table的增删改查操作
    Region Server
            维护region,处理对这些region的IO请求
            负责切分在运行过程中变得过大的region

HBase容错性
    Master容错:zookeeper重新选择一个新的master
            无master过程中,数据读取仍照常运行
            无master过程中,region切分、负载均衡等无法进行
    region server容错:定时向zookeeper汇报心跳,如果一段时间内未出现心跳
            master将该region server上的region重新分配到其他region server上
            失效服务器上预写日志由主服务器进行分割并派送给新的region server
    zookeeper容错:zookeeper是一个可靠的服务
            一般配置3或5个zookeeper实例



Region定位

早期(0.96.0之前) 三层查询架构

zk / -ROOT- / .META.

Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存。

-ROOT- 存储.META.表的表,记录了.META.表的Region信息,-ROOT-只有一个region
.META. 元数据表,记录表Region信息以及RegionServer的服务器地址,.META.可以有多个regoin。
       .META.表中的一行记录就是一个Region,记录了该Region的起始行、结束行和该Region的连接信息。


查找zk(zookeeper)的/hbase/root-region-server节点来确定-ROOT-表在什么RegionServer上。
访问-ROOT-表,查看数据在哪个.META.表上,这个.META.表在什么RegionServer上。
访问.META.表查看查询的行健在什么Region范围里面。
连接具体的数据所在的RegionServer 

0.96版本之后,改为二层架构
-ROOT-表被去掉, zk中的/hbase/root-region-server 也去掉了

.META.表所在的RegionServer信息存储到 zk的 /hbase/meta-region-server
后来引入namespace,.META.表 名字 改成 hbase:meta


二层架构查询步骤

zk /hbase/meta-region-server  确定 hbase:meta表 位于哪个 RegionServer
Hbase:meta表存储了所有Region的行健范围信息 , 根据 rowkey 定位 Region RegionServer信息
客户端 缓存 meta信息


Hbase 与传统关系数据库比较

列存储 vs 行存储
单行事务 vs 跨行事务
get/put/scan  vs   sql 

hbase 只有 rowkey  ,  不支持辅助索引

上一篇     下一篇
hdfs

YARN

MapReduce

zookeeper

redis脚本实例

redis pipeline 与 lua 比较