• 1. Hbase架构和调优作者:骆志杰 2016.8.15
  • 2. 内容大纲简介 主要特性 数据模型 系统架构 性能调优-客户端 性能调优-服务端
  • 3. 简介Hbase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。HBase是一个开源的,分布式的,多版本的,面向列的存储模型。它存储的是松散型数据。
  • 4. HBase是Google BigTable的开源实现,其相互对应如下: Google Hbase 文件存储系统     GFS           HDFS 海量数据处理  MapReduce Hadoop MapReduce 协同服务管理  Chubby         Zookeeper
  • 5. (本页无文本内容)
  • 6. 主要特性高可靠性 高性能 面向列 可伸缩 可在廉价PC Server搭建大规模结构化存储集群
  • 7. 数据模型
  • 8. Row Key:Table主键 ,Table中记录按RowKey排序 Timestamp:每次对数据操作对应的时间戳,也即数据的version number Column Family:列簇,一个table在水平方向有一个或者多个列簇,列簇可由任意多个Column组成,列簇支持动态扩展,无须预定义数量及类型,二进制存储,用户需自行进行类型转换 Column:列,类似 关系数据库中的一列 
  • 9. Table&Region
  • 10. Table随着记录增多不断变大,会自动分裂成多份Splits,成为Regions 一个region由[startkey,endkey)表示 不同region会被Master分配给相应的RegionServer进行管理
  • 11. 两张特殊表:-ROOT- & .META(0.9.6之前)
  • 12. 系统架构
  • 13. 组成部件说明 Client: 使用HBase RPC机制与HMaster和HRegionServer进行通信 Client与HMaster进行通信进行管理类操作 Client与HRegionServer进行数据读写类操作 Zookeeper: Zookeeper Quorum存储meta表地址、HMaster地址 HRegionServer把自己以Ephemeral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况 Zookeeper避免HMaster单点问题
  • 14. HMaster: 主要负责Table和Region的管理工作: 1 管理用户对表的增删改查操作 2 管理HRegionServer的负载均衡,调整Region分布 3 Region Split后,负责新Region的分布 4 在HRegionServer停机后,负责失效HRegionServer上Region迁移
  • 15. HRegionServer: HBase中最核心的模块,主要负责响应用户I/O请求,向 HDFS文件系统中读写数据 HRegionServer管理一些列HRegion对象;HRegion由多个HStore组成; 每个HStore对应Table中一个Column Family的存储; Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效
  • 16. (本页无文本内容)
  • 17. HStore: HBase存储的核心。由MemStore和StoreFile组成。 MemStore是Sorted Memory Buffer,属于内存存储。用户写入数据的流程:
  • 18. Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 触发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上,HBase只是增加数据,所有更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能
  • 19. Hlog 引入HLog原因: 在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer以外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况
  • 20. 工作机制: 每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
  • 21. 性能调优-客户端写入优化: Auto Flush:通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭,这样可以批量写入数据到HBase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存时,才实际向HBase服务端发起写请求。默认情况下auto flush是开启的,适合离线应用 Write Buffer:通过调用HTable.setWriteBufferSize(writeBufferSize)方法可以设置HTable客户端的写buffer大小,如果新设置的buffer小于当前写buffer中的数据时,buffer将会被flush到服务端。
  • 22. WAL Flag:在HBae中,客户端向集群中的RegionServer提交数据时(Put/Delete操作),首先会先写WAL(Write Ahead Log)日志(即HLog,一个RegionServer上的所有Region共享一个HLog),只有当WAL日志写成功后,再接着写MemStore,然后客户端被通知提交数据成功;如果写WAL日志失败,客户端则被通知提交失败。这样做的好处是可以做到RegionServer宕机后的数据恢复。因此,对于相对不太重要的数据,可以在Put/Delete操作时,通过调用Put.setWriteToWAL (false)或Delete.setWriteToWAL(false)函数,放弃写 WAL日志,从而提高数据写入的性能,存在丢失数据的问题
  • 23. 批量读写: HTable.put(List), HTable.get(List) 多线程并发读写:在客户端开启多个Htable读写线程,每个读写线程负责一个HTable对象的操作 Scanner Caching:HTable.setScannerCaching(int scannerCaching)可以设置HBase scanner一次从服务端抓取的数据条数,默认情况下一次一条 Scan Attribute Selection: scan时指定需要的Column Family,可以减少网络传输数据量和IO消耗。
  • 24. 性能调优-服务端Pre-Creating Regions:默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡。 压缩:支持GZIP,SNAPPY,LZO
  • 25. Max Version:创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。 主要参数设置:  hbase.hregion.max.filesize 说明:HStoreFile的最大值。如果任何一个Column Family)的HStoreFiles的大小超过这个值,那么,其所属的HRegion就会Split成两个,默认256M。 调优:
  • 26. a当hbase.hregion.max.filesize比较小时,触发split的机率更大,而split的时候会将region offline,因此在split结束的时间前,访问该region的请求将被block住,客户端自我block的时间默认为1s。当大量的region同时发生split时,系统的整体访问服务将大受影响。因此容易出现吞吐量及响应时间的不稳定现象     
  • 27. b 当hbase.hregion.max.filesize比较大时,单个region中触发split的机率较小,大量region同时触发split的机率也较小,因此吞吐量较之小hfile尺寸更加稳定些。但是由于长期得不到split,因此同一个region内发生多次compaction的机会增加了。compaction的原理是将原有数据读一遍并重写一遍到hdfs上,然后再删除原有数据。无疑这种行为会降低以io为瓶颈的系统的速度,因此平均吞吐量会受到一些影响而下降。
  • 28. hbase.regionserver.handler.count:RegionServer端开启的RPC监听器实例个数,也即RegionServer能够处理的IO请求线程数,默认是10。 hbase.hregion.max.filesize:region的大小与集群支持的总数据量有关系,如果总数据量小,则单个region太大,不利于并行的数据处理,如果集群需支持的总数据量比较大,region太小,则会导致region的个数过多,导致region的管理等成本过高。 hbase.hregion.majorcompaction:配置major合并的间隔时间,默认为1天,可设置为0,禁止自动的major合并,可手动或者通过脚本定期进行major合并
  • 29. hbase.hstore.compactionThreshold:HStore的storeFile数量>= compactionThreshold配置的值,则可能会进行compact,默认值为3。 hbase.regionserver.global.memstore.upperLimit:当ReigonServer内所有region的memstores所占用内存总和达到heap的40%时,HBase会强制block所有的更新并flush这些region以释放所有memstore占用的内存。 hbase.hregion.memstore.flush.size:单个region内所有的memstore大小总和超过指定值时,flush该region的所有memstore。
  • 30. hbase.regionserver.global.memstore.lowerLimit:默认值0.35,RS的所有memstore占用内存在总内存中的lower比例,当达到该值,则会从整个RS中找出最需要flush的region进行flush,配置时需结合memstore.upperLimit和block cache的配置 hfile.block.cache.size:由于blockcache是一个LRU,因此blockcache达到上限(heapsize * hfile.block.cache.size)后,会启动淘汰机制,淘汰掉最老的一批数据。对于注重读响应时间的系统,应该将blockcache设大些。