(大数据分析-3)HBASE Review
2015-09-16 10:43
447 查看
1 HBASE基本原理及介绍
1.1 基本原理
1.1.1 HBASE基本概念
HBASE特点多版本并发控制,数据随机读写操作,数据强一致性
数据多版本:每个单元中的数据可以有多个版本,通过timestamp区别
数据类型单一:所有数据都是byte数组,没有类型
稀疏、分布式、持久、多维有序map
稀疏:空(null)列不占存储空间,表可以非常稀疏
分布式:视图其他行没有关系,可以横切为多个region,分别部署在多个节点
多维度:5个维度,row key、column family、column、value、timestamp
有序:不管hbase跨多少机器,row key都是有序(B+树索引结构,支持快速定位)
基本概念
名词 | 含义 | |
---|---|---|
表table | Hbase以表为单位组织数据。 | |
行row | 表中数据以行为单位,byte[]存储。 | |
RowKey相当于额外的列,是每条记录的主键。 | ||
各行数据按RowKey排序,用于快速查找。 | ||
列族column family | 各行数据列族相同,但不是每个列族中都需要有数据。 | |
列限定符Column Qualifier | 一个列族拥有一或多列数据,各行数据列不需要相同。 | |
单元格Cell | 行、列族和列限定符的组合指定的单元格。 | |
单元格存放的数据成为单元格的值,没有类型,byte[]存储。 | ||
时间戳Timstamp | 单元格的值可以有多个版本,各个版本由版本号区分。 | |
默认版本号为值被写入的时间戳。 |
组织方式:多级索引,按row key升序,按timestamp降序
key | key | key | key | ||
---|---|---|---|---|---|
key value | row key | column family | column qualifier | timestamp | value |
物理模型 v.s. 数据模型
HBASE物理模型
table中所有行按RowKey排序
单个table一开始只有一个region
随着记录越来越多,单个region太大,达到阈值,分裂成2个region(region split)
region是Hbase中分布式存储和负载的最小单元
不同region分布在不同的RegionServer上
HBASE数据模型
HBASE架构
组件 | 功能 |
---|---|
HMaster | 管理用户对table的创建删除修改操作 |
为Region server分配region | |
负责Region server的负载均衡 | |
发现失效的Region server并重新分配其上的region(通过zookeeper实现) | |
不负责实际数据操作 | |
Region Server | 维护region,处理对这些region的IO请求,直接与client进行数据通信 |
负责切分(split)在运行过程中变得过大的region | |
对region进行compact操作 | |
在运行中可以动态添加、删除 | |
Client | 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息 |
ZooKeeper | 通过选举,保证任何时候,集群中只有一个HMaster |
HMaster与RegionServer启动时会向ZooKeeper注册 | |
存贮所有Region的寻址入口 | |
实时监控Region server的上线和下线信息。并实时通知给HMaster | |
存储HBase的schema和table元数据,如column family | |
Zookeeper的引入使得Master不再是单点故障 |
物理结构 | 功能 | |
---|---|---|
store | HRegion虽然是分布式存储的最小单元,但不是存储的最小单元 | |
HRegion由多个store组成,每个store保存一个Column Family | ||
每个store由1个MemStore和0到多个StoreFile组成 | ||
MemStore存储在内存中 | ||
StoreFile存储在HDFS上,底层称为HFile | ||
compact | 把小的HFile合并成大的,减少HFile数量,提升读效率 | |
执行时严重影响HBase性能 | ||
触发后不能停止 | ||
Minor Compact | 把多个HFile合成一个 | |
Major Compact | 一个store下的所有文件合并 | |
删除过期版本数据 | ||
删除delete marker数据 | ||
指定间隔时间或手动执行 | ||
splitling | 当region中的数据过大时,触发splitting。 | |
用middle key分割成两个相邻region。速度很快,毫秒级。可以手动触发。 | ||
真正split:创建现有HFile的引用文件,未真正分开;Compaction时才重写数据。 | ||
hmaster容错 | 多个HMaster,同一时间只有一个active | |
HMaster失效,由ZooKeeper选择另一个HMaster | ||
无Hmaster过程中: | ||
1)读操作正常进行,因为region信息还在 | ||
2);region切分、负载均衡无法进行 | ||
Region Server容错 | 定时向Zookeeper汇报心跳 | |
超时则HMaster将该RegionServer上的Region重新分配到其他RegionServer | ||
Hbase恢复-hlog | HLog是一个实现Write Ahead Log类,每次写MemStore前写入HLog | |
每个RegionServer维护一个HLog | ||
HLog定期删除旧的文件(已经持久化到HFile的数据) | ||
Hbase恢复-RegionServer意外中止 | HMaster通过ZooKeeper感知 | |
处理HLog,针对不同的Region拆分Log数据 | ||
重新分配失效region | ||
通过HLog信息重新写进MemStore,然后flush到HFile |
Hbase写流程
Client向RegionServer提交请求
找到目标region
数据更新先写进MemStore和HLog中,保持有序
MemStore达到阈值,创建新的MemStore,并将老的添加进flush队列,有单独的线程flush到磁盘的StoreFile
当StoreFile达到阈值进行合并compact,形成大的StoreFile
StoreFile大小达到阈值进行分裂split,等分成两个region
Hbase读流程
通过三层结构寻找对应的region
先在MemStore中查找
建立storeHeap堆,从对应region下的所有StoreFile寻找
索引
Rowkey作为索引,字典排序。当通过rowkey不再满足应用的需求,如select * from table where col=val,建立二级索引加速查找
数据库设计理论:
ACID理论:原子性、持久性、一致性、隔离性
CAP理论:一致性、可用性、网络隔离性。对每个集群选择PA或PC
hbase选择一致性(行一致性)、网络隔离性,任何时候网络副本都一样,放弃可用性。即一旦发生网络隔离,在返回失败错误。
部分数据库(对一致性不高)选择可用性、网络隔离性,放弃一致性。如google搜索网页,返回较旧的网页。
hbase按row key范围横切(就是region),第1台机器 hbase的row key不要用递增序列、递减序列,如关系型数据库里面的时间等,会导致写入热 点问题(集群部分写入的机器只有1台)
二级索引,创建二级倒排表。 hbase是无字符类型数据库,全部按照二进制内容。索引只有两列,值和位置
1.2 相关指令
创建hbase表table1,column family为family1,row key以10、20划分3段[root@hadoop1 ~]# hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.6-transwarp, r14622, Wed Aug 12 16:26:42 CST 2015
hbase(main):001:0> create 'table1','family1',SPLITS=>['10','20']
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/lib/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
0 row(s) in 2.4820 seconds
=> Hbase::Table - table1
hbase(main):002:0> list
TABLE
table1
tablexf
2 row(s) in 0.0310 seconds
=> ["table1", "tablexf"]
插入数据,column分别为name、sex
hbase(main):003:0> put 'table1','row1','family1:name','BILL'
0 row(s) in 0.1950 seconds
hbase(main):004:0> put 'table1','row1123','family1:name','BILL'
0 row(s) in 0.0090 seconds
hbase(main):005:0> put 'table1','row1','family1:sex','male'
0 row(s) in 0.0130 seconds
hbase(main):006:0> put 'table1','row2','family1:name','Lily'
0 row(s) in 0.0100 seconds
hbase(main):007:0> put 'table1','row2','family1:sex','female'
0 row(s) in 0.0110 seconds
打印table1
hbase(main):008:0> scan 'table1' //打印所有记录
ROW COLUMN+CELL
row1 column=family1:name, timestamp=1442298988538, value=BILL
row1 column=family1:sex, timestamp=1442299027575, value=male
row1123 column=family1:name, timestamp=1442299025041, value=BILL
row2 column=family1:name, timestamp=1442299027641, value=Lily
row2 column=family1:sex, timestamp=1442299032441, value=female
3 row(s) in 0.1860 seconds
hbase(main):009:0> scan 'table1',{LIMIT=>1}
ROW COLUMN+CELL
row1 column=family1:name, timestamp=1442298988538, value=BILL
row1 column=family1:sex, timestamp=1442299027575, value=male
1 row(s) in 0.0390 seconds
hbase(main):010:0> scan 'table1',{LIMIT=>1,STARTROW=>'row2'}
ROW COLUMN+CELL
row2 column=family1:name, timestamp=1442299027641, value=Lily
row2 column=family1:sex, timestamp=1442299032441, value=female
1 row(s) in 0.0200 seconds
删除记录,row key为row1123;删除表table1
hbase(main):011:0> delete 'table1','row1123','family1:name'
0 row(s) in 0.0580 seconds
hbase(main):012:0> scan 'table1'
ROW COLUMN+CELL
row1 column=family1:name, timestamp=1442298988538, value=BILL
row1 column=family1:sex, timestamp=1442299027575, value=male
row2 column=family1:name, timestamp=1442299027641, value=Lily
row2 column=family1:sex, timestamp=1442299032441, value=female
2 row(s) in 0.0410 seconds
hbase(main):013:0> deleteall 'table1','row1'
0 row(s) in 0.0210 seconds
hbase(main):021:0> list
TABLE
0 row(s) in 0.0160 seconds
=> []
相关文章推荐
- Facebook's New Real-time Messaging System: HBase to Store 135+ Billion Messages a Month
- Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- 康诺云推出三款智能硬件产品,为健康管理业务搭建数据池
- MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原教程
- 基于HBase Thrift接口的一些使用问题及相关注意事项的详解
- php+ajax导入大数据时产生的问题处理
- C# 大数据导出word的假死报错的处理方法
- 如何解决struts2日期类型转换
- hbase shell基础和常用命令详解
- 用Python实现协同过滤的教程
- Python利用多进程将大量数据放入有限内存的教程
- mongodb常遇到的错误。
- 手把手教你配置Hbase完全分布式环境
- 实战:在Java Web 项目中使用HBase
- HBase RowKey设计的那些事
- HBase基本原理
- Stack数据结构的特点后进先出的应用:大数据运算
- YARN或将成为Hadoop新发力点
- Hadoop 1.x版本伪单机配置
- HBase中的基本概念