一、HBase特点
- 分布式基于列式存储的数据结构,基于Hadoop的hdfs、zookeeper进行管理
- HBase 适合存储半结构化或非结构化的数据,对于数据字段不够确定或者杂乱无章很难按一个概念去抽取
- HBase 为null的记录不会被存储
- 基于的表包含 rowkey,时间戳,和列族。新写入数据时,时间戳更新,同事可以查询到更以前的版本
- HBase 是主从架构,hmaster 作为主节点,hregionserver作为从节点
二、HBase 如何导入数据
- 通过HBase的API进行批量数据导入
- 使用Sqoop工具批量导入到HBase集群
- 使用MapReduce批量导入
- HBase BuckLoad的方式导入
三、HBase 存储结构
- hbase 每张表都通过行键(rowkey)按照一定范围被分成多个子表(HRegion),HRegion的大小超过256M就要被分成两个,由HRegionServer管理,管理哪些HRegion 由 HMaster分配。
- HRegion存取一个子表时,会创建一个HRegion对象,然后对表的列族会创建一个store实例,每个store由0个或多个storeFile与之对应,每个storeFile会对应一个HFile,一个HRegion还拥有一个Memstore 实例
四、HBase实时查询原理
- 实时查询可以认为是从内存中查询,一般响应时间在1秒内。
- HBase的机制是数据先写入到内存中,当数据量达到一定量时,再写入磁盘是不进行数据的更新或者合并操作的,只增加数据,这样可以保证用户的写操作只要进入内存就可以返回,保证了HBase的IO 高性能
五、HBase的rowkey设计原则
1. 长度原则
rowkey是一个二进制码流,可以任意字符串,最大长度64kb,实际应用中一般为10-100bytes,用byte[] 保存,一般设计为定长 ,越短越好 最长不超过16个字节,原因如下
数据持久化文件HFile中按照KeyValue存储的,如果rowKey过大会极大的影响HFile存储效率,MemStore 将缓存部分数据到内存,如果rowKey过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率
2. rowKey 散列原则
如果rowKey按照时间戳方式递增,不要将时间放在二进制码前面,建议将 rowKey 的高位作为散列字段,由程序随机生成,低位放时间字段,这样会提高数据均衡分布在HRegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer中,这样检索的时候负载会集中在个别的 RegionServer中,造成热点问题,会降低查询效率
3. rowKey唯一原则
必须在设计上保证唯一性,rowKey是按照字典顺序排序存储的,因此设计rowkey的时候要充分利用这个特点将经常读取的数据存储到一起,将最近可能会被访问的数据放到一块
六、get 和 scan 功能的异同
- 按照RowKey获取唯一记录,get方法的处理方法有两种:设置了ClosestRowBefore 和没有设置的 rowlock主要用来保证事务性,即每个get是以一个row来标记的,一个row有很多family 和 column
- 按照指定条件获取一记录,scan方法实现条件查询功能使用的就是scan方式
七、HBase的cell结构
HBase 中通过 row和columns确定的为一个存贮单元称为 cell
Cell:由{row key, column(= + ), version}是唯一确定的单元cell 中的数据是没有类型的,全部是字节码形式存贮。
八、HBase中的compact的用途是什么
在hbase中每当有memstore 数据刷到flush磁盘中,就行程一个storefile,当storefile 的数量达到一定程度后,就需要将storefile文件来进行compact操作
compact的作用:
- 合并文件
- 清楚过期,多余版本的数据
- 提高读写数据的效率
九、HBase实现compaction的方式
- Minor:只用来做部分文件的合并操作以及包括minVersion = 0 并且设置TTL过期版本清理,不做任何删除数据,多版本数据的清理工作。
- Major:对 Region 下的HStore 下的所有 StoreFile 进行合并操作,最终的整理结果是合并出一个文件
十、HBase filter实现原理
HBase 为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中数据的多个维度(行、列、数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键、列名、时间戳定位)。
RowFilter、PrefixFilter。hbase 的filter是由scan 设置的,所以基于scan的查询结果进行过滤。过滤器的类型很多,但是可以分为两大类——比较过滤器、专用过滤器。过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端。
十一、HBase的内部机制
在HBase中无论是增加新行还是修改已有的行,它的内部流程是相同的。HBase 接到命令后存下变化信息或者写入失败跑出异常。默认情况下,执行写入时会写到两个地方:预写日志和MemStore。HBase的默认方式是把写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化都写入并确认后才认为写动作完成。
MemStore 是内存里的写入缓冲区,HBase 中数据在永久写入磁盘之前在这里累计。当MemStore填满后,其中数据会刷写到硬盘,生成一个HFile。HFile 是HBase 使用的底层存储格式。HFile 对应于列族,一个列族可以有多个HFile 但是一个HFile不能存储多个列族的数据。在集群的每个节点,每个列族有一个MemStore。
如果MemStore还没有刷写,服务器就崩溃了,内存中没有写入硬盘的数据丢失,HBase的应对办法是在写动作之前先写入WAL。HBase集群中每台服务器维护一个WAL 来记录发生的变化,WAL是底层文件系统上的一个文件。直到WAL新纪录成功写入后,写动作才被认为成功完成。这可以保证HBasw和支撑它的文件系统满足持久性
在大多数情况下,HBase使用hadoop分布式文件系统(HDFS)来作为底层文件系统。如果HBase宕机,没有从Memstore 里刷写到HFile的数据可以通过回放WAL来恢复。
十二、HBase 宕机如何处理
HRegisoner 宕机,HMaster会将其关联的region重新分布到其他活动的RegionServer上,由于数据和日志都持久化在HDFS中,该操作不会导致数据丢失,所以数据的一致性和安全性是有保障的。
如果是HMaster宕机,HMaster没有单点问题,HBase 中可以启动多个HMaster,通过zookeeper的Master 机制保证总有一个Master运行。即Zookeeper会保证总会有一个HMaster在对台提供服务。
十三、HRegionServer 宕机如何处理
- Zookeeper 会监控 HRegionServer的上下线情况,当ZK发现某个HRegionServer宕机后会通知master做失效备缓
- HRegionServer 会对外停止服务,它负责的region暂时停止对外提供服务
- HMaster会将该 HRegionServer 负责的region转义到其他的HRegionServer 中,并且会对 HRegionServer上memstore中还未持久化到磁盘中的数据尽心恢复
- 这个恢复工作是由WAL完成
十四、HBase读数据和写数据的过程
获取region存储信息
写数据和读数据都获取region的信息,大概步骤为:
- 从zookeeper中获取.ROOT表的位置信息
- 根据.ROOT中表的信息获取.META表的位置信息
- .META表中存储的数据为每一个region存储位置
向HBase表中插入数据
- hbase缓存分为两层:MemStore 和 BlockCache
- 首先写入到WAL文件中,为了数据不丢失
- 再把数据写入到 MemStore 缓存中,当 MemStore 达到设置大小阈值时,会进行flush操作
- flush 过程中,需要获取每个region的位置
从 HBase中读取数据
- BlockCache 主要给读使用。读请求到 MemStore 中查数据,查不到就到 MemStore 中查询,如果再查询不到就会到磁盘上读,并把读的结果放入到BlockCache 中。
- BlockCache 采用算法最近最少使用算法(LRU),因此当BlockCache达到上限后,会启动淘汰机制,淘汰掉最老的数据
- 一个RegionServer上有一个BlockCache 和N个MemStore,他们之间和不能大于等于 heapsize * 0.8,否则hbase不能启动。默认 BlockCache 为0.2,而MemStore为0.4。对于注重读响应时间的系统,应该将BlockCache 设大些,比如设置BlockCache =0.4,Memstore=0.39。这会加大缓存命中率。