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

  • 时间:
  • 浏览:1
  • 来源:5分排列5官方_极速5分排列3

done!

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

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

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

说明:线上该参数都需用调大一点,不然hfile达到指定数量时就会block等到compact。

需用注意的是MemStore的最小flush单元是Region而后会单个MemStore。有另另三个 Region中Memstore没人来越多每次flush的开销越大,即ColumnFamily控制越少越好,一般不超过5个。

是是意味他们他们他们他们有益于使用的硬盘非要18T,好多好多 都需用适当调小内存,并重新调整以上参数。

这顶端两种对HBase Client的Put接口包装了一层,因此当线上有大量实时请求,一并线下又有大量数据需用更新时,直接没人写会对线上的服务造成冲击,具体表现是是意味为持续一段时间的短暂延迟,严重的甚至是是意味会把RS节点整挂。

以默认配置为例:

过大的Region

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

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

实时写入

校验项

B理论上都需用将192-40=152G删改给到堆外缓存,考虑到HDFS线程池池运行运行、一点服务以及预留内存,这里只分配到72G。 HBase两种启动时对参数会有校验限制(详见下文检验项)。

是是意味都需用做到有另另三个 Streaming中所有批次、所有数据始终复用有另另三个 连接池是最理想的情况汇报。

Spark中提供了Broadcast這個重要工具都需用你都需用 们实现這個想法,因此将创建的HBase Connection广播出去所有节点就都能复用,因此真实运行代码时你都需用发现HBase Connection是不可序列化的对象,无法广播。。。

选用完硬件方面的部署形态,下有另另三个 关键步骤是对HBase的配置进行优化调整,尽是是意味发挥硬件的最大优势。

首先HBase的内存模式都需用分为两种:

TIPS:任何软件使用的硬件资源安全线是150%以下,一旦超出是是意味否有法预料的现象,这是个传统的运维玄学。原先在Redis前置层上应验过,相同的数据量相同的写入带宽,Redis集群的内存使用率达到了90%直接挂了。

先从硬件混合型来说,另三个 劲以来Hadoop后会以宣称有益于用低廉、老旧的机器撑起一片天。是的没错,这两种是Hadoop的有另另三个 大优势。然而前提是作为离线系统使用。首先说明一下离线系统的定义,就是跑批的系统,Spark、Hive、MapReduce等等,哪几种都算,没人很强的时间要求,显著的吞吐量大,延迟高。是是意味没人实时性要求,几台拖拉机跑着也没人现象,因此最都需用出结果因此结果正确就ok。

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

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

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

实时查询

配置了G1垃圾回收器和一点相关属性

Memstore他们他们他们他们主要关注Memstore、Region和RegionServer级别的刷写,其中Memstore和Region级别的刷写不用会对线上造成没人来越多影响,因此需用控制其阈值和刷写频次来进一步提高性能,而RegionServer级别的刷写是是意味阻塞请求直至刷写完成,对线上影响巨大,需用尽量处理。

批量写入

讨论具体配置前一天,从HBase最佳实践-集群规划引入有另另三个 Disk / JavaHeap Ratio的概念来帮助他们他们他们他们设置内存相关的参数。

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

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

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

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

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

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

服务端配置完成前一天,如保更好的使用HBase集群也需用花点心思测试与调整。

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

是是意味仅仅HBase是有另另三个 非“线上”的系统,是是意味充当有另另三个 历史冷数据存储的大数据库,原先的集群两种一点现象也没人,是是意味对其没人任何苛刻的性能要求。

过小的Region

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

HBase集群一旦部署使用,再想对其作出调整需用付出惨痛代价,好多好多 如保部署HBase集群是使用的第有另另三个 关键步骤。

因此是是意味希望HBase作为有另另三个 线都需用够承载海量并发、实时响应的系统,這個集群随着使用时间的增加越来太快就会崩溃。

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

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

说明:默认值没人来越多了,一旦应用层连接不上HBse服务端是是意味进行近乎无限的重试,从就是意味线程池池运行堆积应用假死等,影响比较严重,都需用适当减少。

批量查询

现在根据公式和前一天的配置:

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

简单公式解释(删改解释见上链接):

另外Zookeeper节点不建议只设置3台,5个节点能保证快速选举,都需用使用虚拟机,是是意味ZK节点两种消耗资源不用大,因此5个虚拟节点非要在有另另三个 物理机上,一旦物理机挂了最少5个ZK全挂,会有单点现象,因此ZK节点没了一并都需用处理跨网络访问时,结构请求非要的现象。

还有两种情况汇报是离线任务大量读写磁盘、读写HDFS,是意味HBase IO连接异常也会造成RegionServer异常(HBase日志反应HDFS connection timeout,HDFS日志反应IO Exception),造成线上故障。

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

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

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

响应配置的优化有益于提升HBase服务端的处理性能,一般情况汇报下默认配置后会无法满足高并发需求的。

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

说明:是是意味设置小了,高并发的情况汇报下,应用层是是意味收到HBase服务端抛出的无法创建新线程池池运行的异常从就是意味应用层线程池池运行阻塞。

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

配置的重要参数如下:

没人原先的集群有哪几种现象呢?

一点硬件配置,集群使用万兆网卡(千兆对于大数据集群来说两种太小,很容易打满,影响较大),磁盘尽是是意味大,内存不用太高,一般128G就是是意味特别多了HBase两种对内存的需求并后会配的越大越好(详见下文)。CPU核数没人来越多越好,HBase两种压缩数据、compaction线程池池运行等后会很吃CPU资源的。

问既然老早就知道是意味了,为什么我么我在么在没人多机器了不分几台出来搭个独立的HBase集群?

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

而后期线上交易是是意味无法允许暂停迁移,非要支援现有集群,现在看来早分离HBase是个明智的选用,然而他们他们他们他们错过了這個选用。

D JavaHeap大小:40G

手动split region配置

這個集群不管是规模、还是服务部署最好的土方法相信后会好多好多 后会公司的”标准“配置。

这两种模式的说明都需用参考CDH官方文档。

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

当前内存信息如下:

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

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

他们他们他们他们是是意味选用BucketCache的内存模型来配置HBase,该模式下有益于最大化利用内存,减少GC影响,对线上的实时服务较为有利。

同理安利组件

原先一来,有另另三个 Streaming Job是是意味使用同有另另三个 数据库连接池,在Structured Streaming中的foreachWrite也都需用直接应用。

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

以流式计算为例,Spark Streaming中,他们他们他们全是实时查询HBase非要通过HBase Client API(没人队友提供服务的情况汇报下)。

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

HBase上线至今,承载了线上所有实时交易量,两种大主次请求都有益于保证服务稳定(99.56%响应时间毫秒级),因此一旦HBase跳出 现象就是鸡飞狗跳的灾难。

从老机器到新集群,从老机房到新机房,期间经历过各种现象和珍产故障,总结一番以备不时之需。

原先的集群还有哪几种现象呢?

两种利用scala的lazy关键字都需用绕个弯子来实现:

DiskSize / JavaHeap = RegionSize / MemstoreSize ReplicationFactor HeapFractionForMemstore * 2

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

是是意味目前第二阶段HBase仍然居于一点现象,后会很稳定,在第三阶段投入使用前一天,他们他们他们他们加进去去了有另另三个 Redis前置缓存层(8台共1150G内存集群),将HBase中最重要最热点的数据写入Redis中,Redis集群异常应用层可直接穿透查询HBase,原先一来对于用户来说他们他们他们他们的服务是是意味是另三个 劲稳定的(然而这仅仅也是理论稳定,后续仍然跳出 了故障,详见下文)。

没人他们他们他们他们现在对HBase的要求特别高,对它的定义是是意味后会有另另三个 离线系统就是有另另三个 实时系统了。对于有另另三个 硬性要求很高的实时系统来说,是是意味其中几台老机器拖了后腿也会引起线上响应的延迟。

这里都需用取0.6+40G的配置,是是意味JavaHeap越大,GC起来就越痛苦,他们他们他们他们都需用将多余的内存给到堆外读缓存BucketCache中,原先就都需用保证JavaHeap并没人实际浪费。

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

Region过大过小后会有不良影响:

Spark有对应的API都需用批量读取HBase数据,因此使用过程比较繁琐,这里安利有另另三个 小组件Spark DB Connector,批量读取HBase的代码都需用没人简单:

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

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

按照官方推荐的配置最多都需用存储的数据量最少为150 * 150G * 3= 18T。是是意味存储的数据量超过18T,一点会一点性能现象。从Region规模這個厚度讲,当前单台RegionServer有益于合理利用起来的硬盘容量上限基本为18T(已提出Sub-Region的概念来满足超大硬盘的需求)。

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

没人HBase Connection每条数据创建一次肯定是不允许的,带宽太低,对服务压力比较大,因此ZK的连接数会暴增影响服务。

比较可行的方案是每个批次创建有另另三个 链接(這個foreachPartiton中每个分区创建有另另三个 链接,分区中数据共享链接)。因此這個方案也会造成主次连接浪费、带宽低下等。

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

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