HBase生产环境配置与使用优化不完全指南

  • 时间:
  • 浏览:1

对于Region的大小,HBase官方文档推荐单个在10G-200G之间,单台RegionServer的数量控制在20-200之间。

理同实时查询,都都还后能 使用创建的Connection做任何操作。

软件混合型集群对实时HBase来说影响也很糙大,离线任务最大的特点不会吞吐量很糙高,瞬间读写的数据量都都还后能 把IO直接撑到10G/s,最主要的影响因素不会大型离线任务带动高IO将会影响HBase的响应性能。将会不会不会语句,线上的表现仅仅为短暂延迟,将会离线任务再把CPU撑爆,RegionServer节点将会会直接宕机挂掉,造成严重的生产影响。

一定量写入的数据带来具体大GC开销,整个RS的活动都被阻塞了,当ZK来监测心跳时发现无响应就将该节点列入宕机名单,而GC完成后RS发现当时人“被死亡”了,越来越就干脆自杀,这不会HBase的“朱丽叶死亡”。

配置的重要参数如下:

计算为:10G / 128M 3 0.4 * 2 = 192,即RegionServer上1bytes的Java内存大小需用搭配192bytes的硬盘大小最合理。

同理安利组件

这种 集群不管是规模、还是服务部署法律依据相信都不 很多很多都不 公司的”标准“配置。

Memstore是Region中的一块内存区域,随着客户端的写入请求增大,将会产生flush的操作将数据内容写入到磁盘。

Disk / JavaHeap Ratio=DiskSize / JavaHeap = RegionSize / MemstoreSize ReplicationFactor HeapFractionForMemstore * 2

将会朋友 要能使用的硬盘都都还后能 了18T,很多很多都都还后能 适当调小内存,并重新调整以上参数。

HBase使用定位:大规模数据+高并发+毫秒级响应的OLTP实时系统(数据库)。

先看一下具体的硬件配置:

BucketCache模式下HBase的内存布局如图所示:

不会将会希望HBase作为4个多多线里要能承载海量并发、实时响应的系统,这种 集群随着使用时间的增加放慢就会崩溃。

手动split region配置

说明:默认值很多了,一旦应用层连接不上HBse服务端将会进行近乎无限的重试,从而导致 程序池堆积应用假死等,影响比较严重,都都还后能 适当减少。

按照官方推荐的配置最多都都还后能 存储的数据量最少为200 * 200G * 3= 18T。将会存储的数据量超过18T,许多会许多性能哪多少的间题。从Region规模这种 深度图讲,当前单台RegionServer要能合理利用起来的硬盘容量上限基本为18T(已提出Sub-Region的概念来满足超大硬盘的需求)。

视磁盘空间、机器数量而定,当前Region配置为:

集群可用内存为192G,即对应的硬盘空间需用为192G * 192 = 36T,显然这是很不合理的

Memstore朋友 主要关注Memstore、Region和RegionServer级别的刷写,其中Memstore和Region级别的刷写从不想对线上造成很多影响,不会需用控制其阈值和刷写频次来进一步提高性能,而RegionServer级别的刷写将会阻塞请求直至刷写完成,对线上影响巨大,需用尽量正确处理。

简单公式解释(完整版解释见上链接):

广播变量只在具体调用value的已经 才会去创建对象并copy到各个节点,而这种 已经 被序列化的对象真是是外层的HBaseSink,当在各个节点上具体调用connection进行操作的已经 ,Connection才会被真正创建(在当前节点上),从而绕过了HBase Connection无法序列化的情况报告(同理也都都还后能 推导RedisSink、MySQLSink等)。

以流式计算为例,Spark Streaming中,朋友 要实时查询HBase都都还后能 了通过HBase Client API(越来越队友提供服务的情况报告下)。

越来越HBase Connection每条数据创建一次肯定是不允许的,速率单位太低,对服务压力比较大,不会ZK的连接数会暴增影响服务。

比较可行的方案是每个批次创建4个多多链接(这种foreachPartiton中每个分区创建4个多多链接,分区中数据共享链接)。不会这种 方案也会造成累积连接浪费、速率单位低下等。

批量写入

仍然是前文说的软件混合型集群带来的影响,主不会离线任务IO影响大,观测下来,集群磁盘IO到4G以上、集群网络IO 8G以上、HDFS IO 5G以上任意符合4个多多条件,线上将会有延迟反应。将会离线任务运行太过强势导致 RegionServer宕机仍然无法正确处理,都都还后能 了重新调整离线任务的执行使用资源、执行顺序等,限制离线计算能力来满足线上的需求。同需用用限制集群的CPU的使用率,将会出显某台机器CPU打满后整个机器假死致服务异常,造成线上故障。

该模式主要应用于线上读多写少型应用,整个RegionServer内存(Java程序池池内存)分为两累积:JVM内存和堆外内存。

现在根据公式和已经 的配置:

将会都都还后能 做到4个多多Streaming中所有批次、所有数据始终复用4个多多连接池是最理想的情况报告。

Spark中提供了Broadcast这种 重要工具都都还后能 帮朋友 实现这种 想法,假如有一天将创建的HBase Connection广播出去所有节点就都能复用,不会真实运行代码时不会你发现HBase Connection是不可序列化的对象,无法广播。。。

校验项

HBase上线至今,承载了线上所有实时交易量,真是大累积请求都要能保证服务稳定(99.56%响应时间毫秒级),不会一旦HBase出显哪多少的间题不会鸡飞狗跳的灾难。

从老机器到新集群,从老机房到新机房,期间经历过各种哪多少的间题和生产故障,总结一番以备不时之需。

以默认配置为例:

将会目前第二阶段HBase仍然趋于稳定许多哪多少的间题,都不 很稳定,在第三阶段投入使用已经 ,朋友 加上了4个多多Redis前置缓存层(8台共2000G内存集群),将HBase中最重要最热点的数据写入Redis中,Redis集群异常应用层可直接穿透查询HBase,不会一来对于用户来说朋友 的服务将会是老要稳定的(然而这仅仅也是理论稳定,后续仍然出显了故障,详见下文)。

这并都不 模式的说明都都还后能 参考CDH官方文档。

越来越不会的集群有哪多少哪多少的间题呢?

第二阶段,重新采购了全新的高配机器,搭建了4个多多新集群并从老集群过渡过来,老集群的旧机器淘汰不想(一般硬件使用年限不会4、5年)。不会受限于机器规模,越来越将软件服务分开部署,仍然是软件混合型集群,不会在硬件上做了提升。

实时查询

不会的集群还有哪多少哪多少的间题呢?

硬件混合型+软件混合型结合产生的化学反应简直无法想象的酸爽。。。

HBase集群一旦部署使用,再想对其作出调整需用付出惨痛代价,很多很多咋样部署HBase集群是使用的第4个多多关键步骤。

许多硬件配置,集群使用万兆网卡(千兆对于大数据集群来说真是太小,很容易打满,影响较大),磁盘尽将会大,内存不想太高,一般128G就将会很糙多了HBase并都不 对内存的需求并都不 配的越大越好(详见下文)。CPU核数很多越好,HBase并都不 压缩数据、compaction程序池等都不 很吃CPU资源的。

Spark有对应的API都都还后能 批量读取HBase数据,不会使用过程比较繁琐,这里安利4个多多小组件Spark DB Connector,批量读取HBase的代码都都还后能 越来越简单:

硬件混合型指的是该集群机器配置参差不齐,混搭形状。

软件混合型指的是该集群部署了一套CDH全家桶套餐。

解释咋样配置Memstore刷写参数已经 建议提前了解Memstore的刷写机制,简单总结HBase会在如下几种情况报告下触发flush操作:

另外Zookeeper节点不建议只设置3台,二个节点能保证快速选举,都都还后能 使用虚拟机,将会ZK节点并都不 消耗资源从不大,不会二个虚拟节点都都还后能 了在4个多多物理机上,一旦物理机挂了最少二个ZK全挂,会有单点哪多少的间题,不会ZK节点没得同时都都还后能 正确处理跨网络访问时,内部管理请求都都还后能 了的哪多少的间题。

讨论具体配置已经 ,从HBase最佳实践-集群规划引入4个多多Disk / JavaHeap Ratio的概念来帮助朋友 设置内存相关的参数。

前面说过,对于HBase来说,内存并都不 分配的越大越好,内存给多了GC起来是个灾难,内存大小和硬盘大小之间趋于稳定一定的关联。

DiskSize / JavaHeap = RegionSize / MemstoreSize ReplicationFactor HeapFractionForMemstore * 2

这上方真是对HBase Client的Put接口包装了一层,不会当线上有一定量实时请求,同时线下又有一定量数据需用更新时,直接越来越写会对线上的服务造成冲击,具体表现将会为持续一段时间的短暂延迟,严重的甚至将会会把RS节点整挂。

Region过大过小都不 有不良影响:

真是利用scala的lazy关键字都都还后能 绕个弯子来实现:

批量查询

以下是HBase集群使用以来的部署架构变化以及对应的分析。

还有并都不 情况报告是离线任务一定量读写磁盘、读写HDFS,导致 HBase IO连接异常也会造成RegionServer异常(HBase日志反应HDFS connection timeout,HDFS日志反应IO Exception),造成线上故障。

服务端配置完成已经 ,咋样更好的使用HBase集群也需用花点心思测试与调整。

这里仅介绍Spark操作HBase优化经验,接口服务方面待定。

Disk / JavaHeap Ratio指的是一台RegionServer上1bytes的Java内存大小需用搭配多大的硬盘大小最合理。

过小的Region

当前内存信息如下:

B理论上都都还后能 将192-40=152G完整版给到堆外缓存,考虑到HDFS程序池池、许多服务以及预留内存,这里只分配到72G。 HBase并都不 启动时对参数会有校验限制(详见下文检验项)。

done!

这里都都还后能 取0.6+40G的配置,将会JavaHeap越大,GC起来就越痛苦,朋友 都都还后能 将多余的内存给到堆外读缓存BucketCache中,不会就都都还后能 保证JavaHeap并越来越实际浪费。

需用注意的是MemStore的最小flush单元是Region而都不 单个MemStore。4个多多Region中Memstore很多每次flush的开销越大,即ColumnFamily控制越少越好,一般不超过二个。

B=B1+B2,B1和B2的比例视情况报告而定,这里设为1:9。

响应配置的优化要能提升HBase服务端的正确处理性能,一般情况报告下默认配置都不 无法满足高并发需求的。

问既然老早就知道导致 了,为什么我越来越多机器了不分几台出来搭个独立的HBase集群?

前期新集群能用的机器比较少,HBase中存储的数据量非常大,只分多少机器出来将会无法满足。

而后期线上交易将会无法允许暂停迁移,都都还后能 了支援现有集群,现在看来早分离HBase是个明智的选者,然而朋友 错过了这种 选者。

上一张CDH官方图便于理解offheap下HBase的内存模型:

TIPS:任何软件使用的硬件资源安全线是200%以下,一旦超出将会是是不是法预料的哪多少的间题,这是个传统的运维玄学。不会在Redis前置层上应验过,相同的数据量相同的写入速率单位,Redis集群的内存使用率达到了90%直接挂了。

选者完硬件方面的部署形状,下4个多多关键步骤是对HBase的配置进行优化调整,尽将会发挥硬件的最大优势。

实时写入

读缓存CombinedBlockCache:LRUBlockCache + 堆外内存BucketCache,用于缓存读到的Block数据

这里只给出相对比较重要的配置,其余参数视情况报告参考文档说明。

D JavaHeap大小:40G

将会仅仅HBase是4个多多非“线上”的系统,将会充当4个多多历史冷数据存储的大数据库,不会的集群真是许多哪多少的间题也越来越,将会对其越来越任何苛刻的性能要求。

这里将会从根本上分离了软硬件对HBase所带来的影响。

在Driver程序池池中实例化该对象并广播,在各个节点中取广播变量的value进行使用。

说明:线上该参数都都还后能 调大许多,不然hfile达到指定数量时就会block等到compact。

Redis作为HBase的前置缓存趋于稳定,存储的热点数据量最少是HBase中的20%。至于咋样保证Redis集群的稳定又是另外4个多多话题了。

配置了G1垃圾回收器和许多相关属性

不会一来,4个多多Streaming Job将会使用同4个多多数据库连接池,在Structured Streaming中的foreachWrite也都都还后能 直接应用。

朋友 将会选者BucketCache的内存模型来配置HBase,该模式下要能最大化利用内存,减少GC影响,对线上的实时服务较为有利。

目前趋于稳定规划中的第三阶段,从集群部署模式上最大程度保证HBase的稳定性。

先从硬件混合型来说,老要以来Hadoop都不 以宣称要能用低廉、老旧的机器撑起一片天。是的没错,这真是是Hadoop的4个多多大优势。然而前提是作为离线系统使用。首先说明一下离线系统的定义,不会跑批的系统,Spark、Hive、MapReduce等等,哪多少都算,越来越很强的时间要求,显著的吞吐量大,延迟高。将会越来越实时性要求,几台拖拉机跑着也越来越哪多少的间题,假如有一天最都都还后能 出结果不会结果正确就ok。

过大的Region

配置堆外缓存涉及到的相关参数如下:

这种 场景下,使用bulkload是最安全、快速的,唯一的缺点是带来的IO比较高。

大批量写入更新的操作,建议使用bulkload工具来实现。

说明:将会设置小了,高并发的情况报告下,应用层将会收到HBase服务端抛出的无法创建新程序池的异常从而导致 应用层程序池阻塞。

可得 JavaHeap * HeapFractionForMemstore 约等于 24,假设 HeapFractionForMemstore 在0.4-0.6之间波动取值,对应越来越 JavaHeap 的大小为200-40G。

越来越朋友 现在对HBase的要求很糙高,对它的定义将会都不 4个多多离线系统不会4个多多实时系统了。对于4个多多硬性要求很高的实时系统来说,将会其中几台老机器拖了后腿也会引起线上响应的延迟。

首先HBase的内存模式都都还后能 分为并都不 :