HBase简介
- HBase的原型是BigTable
- HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,可以廉价搭建大规模结构化存储集群
- HBase的目标是存储并处理大数据
- 利用HDFS作为文件存储系统,利用MapReduce处理数据,利用Zookeeper协同服务
- 扩展HRegionServer,处理能力,扩展DataNode,存储能力
HBase架构
Client、Zookeeper、HMaster(管理许多HRegionServer)、HRegionServer
HRegionServer:多个HRegion(一个或多个HRegion负责一张表)、HLog(操作日志)
HRegion:多个Store(一个或多个Store一个列族)
Store:mem store(本地缓存区,内存)、StoreFile
底层:数据先写入mem store,当mem store满了,就flush到磁盘,形成StoreFile文件,其中StoreFile文件以Hfile格式存储在HDFS上。
原先是一个HRegion负责一个表,当HRegion达到阈值,则会切分为两个HRegion。有可能HRegion会分给另一个HRegionServer以防止数据倾斜。
- Zookeeper:HBase通过Zookeeper来保证Master的高可用性、RegionServer的监控
- HMaster:为RegionServer分配Region,维护集群的负载均衡,维护集群的元数据信息,-ROOT-表和.META.表,发现失效的Region,将其分配到正常的RegionServer。
- HRegionServer:直接对接用户的读写请求,管理Region,负责和HDFS的交互,负责Region的拆分,负责StoreFile文件的合并
- HLog,WAL,预写式日志,现在日志记录操作,避免引起数据丢失,系统出现故障,根据此日志重建。
HBase Shell
- 创建表create
- 添加数据put
put 'table','rowkey','columnfamily:qualiter','value'
- 查询表scan
- 查看单行get
get 'table','rowkey',{COLUMN=>'info:name',VERSION=>n}
- 删除数据delete
- 删除表disable table,drop table
HBase数据结构
RowKey
记录的主键,RowKey可以是任意字符串,按字典序排序存储,设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储到一起。
Column Family
列族,包含多个列。必须在使用表前定义。
Cell
由{rowkey,columnfamily:column,version}确定的单元
TimeStamp
时间戳,版本通过时间戳来索引。
HBase读写数据流程
读数据流程
- Client连接ZK获取元数据信息(.META.表,meta-region-server表),即获取元数据所在的RegionServer在哪里。
- ZK返回客户端查询元数据所在的RegionServer位置。
- 客户端请求访问所在的RegionServer
- RegionServer同意访问
- 客户端发送读请求
- RegionServer返回结果(先内存后磁盘)
写数据流程
- 客户端发送请求给ZK,获取META表所在RegionServer
- ZK返回META表所在的RegionServer
- 获取RegionServer的META表
- 返回元数据所在的RegionServer
- 向RegionServer发送写数据请求
- 写入Hlog,WAL
- HRegion根据Hlog写入mem store
- 反馈客户端,写入成功
Flush过程
- 当Memstore数据达到阈值,将数据刷到硬盘,将内存中数据删除,同时删除HLog中的历史数据
- 并将数据存储到HDFS
数据合并过程
- 数据块达到4块,HMaster触发合并操作,Region将数据块加载到本地,进行合并
- 合并数据超过256M,进行拆分,拆分后的Region分配给不同RegionServer
- 当HRegionServer死机后,将HLog拆分,分配给不同HRegionServer,同时修改.META.表