客户端API:最佳实践
1. 禁止自动刷写 setAutoFlush(false)
这时,添加的put实例会被添加到一个相同的写入缓存中,在禁用自动刷写时,这些操作直到写缓冲区被填满时才会被送出。
或者用户调用flushCommits()方法
或调用HTable实例的close方法隐式调用flushCommits()方法
2. 使用扫描缓存setCaching()
如果使用默认值1,则map任务会在处理每条记录时都请求region服务器。
而如果设置为500,则一次可以传送500行数据到客户端进行处理。
这里要权衡传输数据的开销和内存的开销。
表级别的扫描缓存 setScannerCaching()
3. 限定扫描范围
Scan扫描的范围尽可能的小
4. 关闭ResultScanner
HTabel.getScanner()返回的ResultScanner实例会消耗大量资源。
一定要在try/catch的finally块中关闭ResultScanner
5. 块缓存用法
对Scan实例能够通过setCacheBlocks()方法来设置使用region服务器的块缓存。
如果在MapReduce作业中使用扫描,这个方法应当被设置成false。
对于那些频繁访问的行,建议使用块缓存。
6. 优化获取行健的方式
适当的选用过滤器,最快捷的返回数据
7. 关闭Put上的WAL(关闭日志)
服务器端不会把这个Put写到WAL中,而只把它写到memstore里。
使用put的wrireToWAL(false)来关闭WAL
配置上的一些优化措施:
1. 减少ZooKeeper超时的发生
Zookeeper.session.timeout 属性来设置
2. 增加处理线程
Hbase.regionserver.handler.count属性定义了响应外部用户访问数据表请求的线程数。
默认值10有点小。
3. 增加堆大小
在hbase-env.sh文件中调整HBASE_HEAPSIZE的设置
4. 启用数据压缩
推荐使用Snappy或者LZO
配置启动region服务器时检查压缩是否正确安装:
<property> <name>hbase.regionserver.codecs</name> <value>snappy,lzo</value> </property>
启用压缩:
hbase支持列族级别上的数据压缩。
create ‘testtable’,{name=>’colfam1’,compression=>’GZ’} //创建表,并对’colfam1’列族上的数据启用GZ压缩 describe ‘testtable’ //修改表,并启用压缩 create ‘testtable2’,’colfam1’ disable ‘testtable2’ --修改表的属性时,一定要先禁用表 alter ‘testtable2’.{name=>’colfam1’,compression=>’GZ’} enable ‘testtable2’
5. 增加region大小
更大的region可以减少集群总的region数目。
管理较少的region可以让集群的运行更平稳。
默认情况下,region的大小事256MB。可以配置1GB或者更大的region。
Hbase.hregion.max.filesize属性的值
6. 调整块缓存大小
控制堆中块缓存大小的属性是一个用浮点数类型的百分比,默认值是20%。
perf.hfile.block.cache.size
增大块缓存的情况:
Ø 如果块缓存的使用中,发现有很多的块被换出
Ø 用户负载大多数为读请求时,hbase将更加需要块缓存
7. 调整memstore限制
memstore占用内存中堆大小的比例:
上限:hbase.regionserver.global.memstore.upperLimit (默认值为40%,设置为0.4)
下限:hbase.regionserver.global.memstore.lowerLimit(设置为0.35),用来控制服务器清空memstore之后剩余的大小。将上限和下限设置的接近一些可以避免过度刷写。
处理读请求时,可以考虑同时减少memstore的上下限来增加块缓存的空间。
8. 增加阻塞时存储文件数目
Hbase.hstore.blockingStoreFiles
决定了当存储文件的数目达到阀值时,更新操作(put,delete)将会被阻塞,并以此来给合并操作留出来时间减少存储文件的数目。
大负载的突发写入请求时,可以增加这个值。(默认值是7)
9. 增加阻塞倍率
Hbase.hregion.memstore.block.multiplier的默认值是2
阻塞客户端更新数据的请求的安全阀值。
增加这个值,可以更加平滑地处理写入突发流量:可以临时接受更多的数据
10. 减少最大日志文件限制
Hbase.regionserver.maxlogs=32 (默认值32)
控制基于磁盘的WAL文件数目,进而控制刷写频率。
对于写压力比较大的服务器,降低这个值会强迫服务器更频繁地将数据刷写到磁盘。这样刷写到磁盘上的数据所对应的日志就可以被丢弃了。
第11章 集群管理
减少节点
Shell命令:
Balance_switch false --关闭负载均衡 Hbase-daemon.sh stop regionserver --停止集群中的一个region服务器 Balance_switch true --启用负载均衡
过程分析:
关闭节点的负载均衡,避免负载均衡和master回复刚才下线的region服务器之间可能产生的竞争。
Region服务器会先将它所有的region关闭,然后再把自己的进程停止。Region服务器在ZooKeeper中对应的临时节点将会过期。Master会注意到region服务器停止服务并将其按崩溃的服务器处理:master会将这台服务器上的region重新分配到其他机器上。
坏处:region会下线一段时间,时间的长度由ZooKeeper的超时时间决定。
第一个被关闭的region要等所有region都关闭,且master注意到region服务器的znode被删除之后才能上线。
Hbase0.90.2之后,下线方式:
Graceful_stop.sh hostname
--hostname是用户要卸载的region服务器。
会把region从对应的服务器上一个个移出来以减少扰动。它会在移动到下一个region前先检查新位置上的region是否已经部署好。直到对应的要关闭的服务器上没有region了。
此时,脚本会让对应的服务器关闭。
Master会察觉到服务器停止了服务。
由于服务器关闭时没有region,所以不会有WAL切分的相关操作。