Hadoop HBase性能优化学习

24 篇文章 0 订阅
[size=large]一、调整参数[/size]

入门级的调优可以从调整参数开始。投入小,回报快。

[color=red][b]1. Write Buffer Size[/b][/color]
快速配置
HTable htable = new HTable(config, tablename);   
htable.setWriteBufferSize(6 * 1024 * 1024);
htable.setAutoFlush(false);

设置buffer的容量,例子中设置了6MB的buffer容量。
[color=red][b]* 必须禁止auto flush。[/b][/color]
[color=blue][b]* 6MB是经验值,可以上下微调以适应不同的写场景。[/b][/color]

[b]原理[/b]
HBase Client会在数据[color=red][b]累积到设置的阈值后才提交Region Server。这样做的好处在于可以减少RPC连接次数。[/b][/color]同时,我们得计算一下服务端因此而消耗的内存:hbase.client.write.buffer * hbase.regionserver.handler.count。在减少PRC次数和增加服务器端内存之间找到平衡点。

[size=medium][color=red][b]2. RPC Handler[/b][/color][/size]
快速配置
修改hbase-site.xml的[b]hbase.regionserver.handler.count[/b]配置项:

<property>  
<name>hbase.regionserver.handler.count</name>
<value>100</value>
</property>


[b]原理[/b]
该配置定义了每个Region Server上的RPC Handler的数量。Region Server通过RPC Handler接收外部请求并加以处理。[b]所以提升RPC Handler的数量可以一定程度上提高HBase接收请求的能力。[/b]当然,handler数量也不是越大越好,这要取决于节点的硬件情况。

[size=medium][b]3. Compression 压缩[/b][/size]
快速配置
HColumnDescriptor hcd = new HColumnDescriptor(familyName);   
hcd.setCompressionType(Algorithm.SNAPPY);


[b]原理[/b]
数据量大,边压边写也会提升性能的,毕竟IO是大数据的最严重的瓶颈,哪怕使用了SSD也是一样。众多的压缩方式中,推荐使用SNAPPY。从压缩率和压缩速度来看,性价比最高。

[size=medium][b]4. WAL[/b][/size]
快速配置
Put put = new Put(rowKey);  
put.setWriteToWAL(false);


[b]原理[/b]
其实不推荐关闭WAL,不过关了的确可以提升性能...因为HBase在写数据前会先写WAL,以保证在异常情况下,HBase可以按照WAL的记录来恢复还未持久化的数据。

[size=medium][b]5. Replication[/b][/size]
虽然推荐replica=3,不过当数据量很夸张的时候,[color=red][b]一般会把replica降低到2[/b][/color]。当然也不推荐随便降低replica。

[color=red][size=medium][b]6. Compaction[/b][/size][/color]
在插数据时,打开HMaster的web界面,查看每个region server的request数量。确保大部分时间,写请求在region server层面大致平均分布。

在此前提下,我们再考虑compaction的问题。继续观察request数量,你会发现在某个时间段,若干region server接收的请求数为0(当然这也可能是client根本没有向这个region server写数据,所以之前说,要确保请求在各region server大致平均分布)。这很有可能是region server在做compaction导致。compaction的过程会block写。

优化的思路有两种,一是提高compaction的效率,二是减少compaction发生的频率。

提高以下两个属性的值,以增加执行compaction的线程数:
hbase.regionserver.thread.compaction.large  
hbase.regionserver.thread.compaction.small

推荐设置为2。

[size=medium][color=red][b]7. 减少Region Split次数[/b][/color][/size]
region split是提升写性能的一大障碍。减少region split次数可以从两方面入手,一是预分配region(该内容会在下章节表设计优化里详述)。[color=red][b]其二是适当提升hbase.hregion.max.filesize[/b][/color]

提升region的file容量也可以减少split的次数。具体的值需要按照你的数据量,region数量,row key分布等情况具体考量。一般来说,3~4G是不错的选择。

[size=medium][color=red][b]8. HFile format version[/b][/color][/size]
0.92.0后的version都应该是2。v2比v1支持更大的region大小。一般经验是Region越大越少,性能更好(当然也不能过分大,否则major compaction的时候时间长的吃不消)。所以推荐把hfile.format.version改成2,并提高hfile大小。对于使用v1 format的用户,不用担心,数据迁移到v2上是有工具的。具体参见HBASE-1621。

[color=red][b]9. hbase.ipc.client.tcpnodelay[/b][/color]
设置成True。关闭Nagle,可能提高latency。当然HDFS也关掉TPC Nagle。

[size=large][b]二、表设计优化[/b][/size]
[color=red][size=medium][b]1. 预分配Region[/b][/size][/color]
之前有说防止region split的两大手段其中之一就是预分配region。

在此不重复region split的原理,请参见[url]http://blog.sina.com.cn/s/blog_9cee0fd901018vu2.html[/url]。按数据量,row key的规则预先设计并分配好region,可以大幅降低region split的次数, 甚至不split。这点非常重要。

[size=medium][color=red][b]2. Column Family的数量[/b][/color][/size]
实测发现column family的数量对性能会有直接影响。建议减少column family的数量。[b]单个cf是最好[/b]

[color=red][b]3. Column Family MAX_VERSIONS/MAX_LENGTH[/b][/color]
前者确定保存一个cell的最大历史份数,后者确定多少byte可以存进一个cell 历史记录。所以我们可以减低这些值。

[color=red][b]4. Row Key的设计[/b][/color]
Region的数据边界是start key和end key。如果记录的row key落在某个region的start key和end key的范围之内,该数据就会存储到这个region上。在写数据的时候,尤其是导入客户原有数据的时候,如果row key设计不当,很可能导致性能问题。之前我们也介绍了row key和region的关系。如果在某个时段内,很多数据的row key都处在某个特定的row key范围内。那这个特定范围row key对应的region会非常繁忙,而其他的region很可能非常的空闲,导致资源浪费。

那么,如何设计row key呢?举个比较实际的例子,如果有张HBase表来记录每天某城市的通话记录, 常规思路下的row key是由电话号码 + yyyyMMddHHmmSS(通话开始时间) + ... 组成。按电话号码的规律来划分region。但是这样很容易导致某时段row key极其不均匀(因为电话通话呈随机性)。但是,如果把电话号码倒序,数据在region层面的分布情况就大有改观。

设计row key的方法千变万化,宗旨只有一条,尽量保证单位时间内写入数据的row key对于region呈均匀分布。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值