【十八掌●武功篇】第八掌:HBase之性能调优
2017-12-01 08:47
225 查看
这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:
大数据技术●降龙十八掌
系列文章:
:【十八掌●武功篇】第八掌:HBase之基本概念
【十八掌●武功篇】第八掌:HBase之Shell
【十八掌●武功篇】第八掌:HBase之基本操作Java API
【十八掌●武功篇】第八掌:HBase之过滤器总结
【十八掌●武功篇】第八掌:HBase之性能调优
【十八掌●武功篇】第八掌:HBase之安装与集成 [草稿]
虽说HBase可以运行在Linux、Unix、甚至Windows上,但是选用64位的Linux是最好的选择。
(2) 指定noatime参数
另外在Linux上挂载磁盘时,默认的选项是atime,atime选项是指当对磁盘的每次写入或者写入时都会产生一个记录。而Hadoop使用NameNode管理HDFS上的元数据,操作系统对文件的访问时间对Hadoop是无意义的,所有可以禁止每次读写都产生记录来提高HDFS的访问性能,进而提高HBase的性能。可以在挂载磁盘时指定noatime选项来达到这个目的。
指定noatime参数的步骤:
1) 编辑/etc/fstab文件
2) 在对应分区的defaults后面添加noatime参数
3) 用mount命令重新加载分区
4) 关闭系统交换分区
Linux内存的反复交换会影响JVM的性能,从而影响集群的整体性能。可以将交换分区关闭,vm.swappiness是交换分区利用率的参数,范围为[0,100],值越小表示尽量使用物理内存,为0表示尽量不用交换分区。
关闭方法:
sysctl –w vm.swappiness=0
(2) 确保应用服务器尽量靠近HBase集群。
(3) 考虑交换机的容量。
设置步骤:
(1) 编写机架感知的脚本
机架感知的脚本是用Python写的,输入一个域名或者IP,返回所在机架。
(2) 配置脚本路径
将脚本放在NameNode所在的机器上,然后在core-site.xml中配置
(3) 重启NameNode,使得机架感知生效。
为了解决上述问题,可以在创建表的时候就预创建Region,提前划分好很多Region,一是避免了前期频繁的分裂Region的过程,二是解决了到期时候操作集中到少数机器上的问题。
预创建Region的方法:
(1) 创建表的时候预创建
参考前面的预分区那一小节。
(2) 对存在的表创建
HBase自带了一个预创建Region的工具org.apache.hadoop.hbase.util.RegionSplitter。
${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.util.RegionSplitter tablename HexStringSplit –c 10 –f cfname
这个例子是将表tablename使用HexStringSplit算法拆分为10个Region,列族名为cfname。
(3) 使用自定义的算法创建
这个参数设置的大小跟RegionSever的内存大小息息相关,当对HBase的操作消耗内存不大的时候,可以将这个参数调大。
数据写入时会先写入MemStore,RegionServer会给每个Region提供一个MemStore。
数据读取时会先到MemStore中查数据,查不到就到BlockCache中查找,再查不到就到磁盘上读取,并把读取的结果放入BlockCache。
在调整BlockCache时要注意:
● BlockCache和MemStore占比总和不能超过堆内存的
● 以读为主要业务时则调大值,写为主的调小值。
● 不要关闭BlockCache,因为关闭后RegionServer会花很多时间不停加载HFile索引。
hbase.regionserver.global.memstore.upperLimit表示RegionSever上所有Region的MemStore大小上限,当RegionServer上所有的Region的MemStore大小到这个比例时就会触发全局的flush操作。
hbase.hregion.memstore.flush.size用于单个Region内所有MemStore大小总和超过时触发flush
(2) MemStore下限
hbase.regionserver.global.memstore.lower.limit表示RegionSever上所有Region的MemStore的大小下限。当RegionServer上所有的Region的MemStorm到达下限时不会触发全局的flush,而是会寻找一个MemStorm最大的Region进行flush。
合并操作会阻塞写请求,但是文件数过多会影响读的性能。
可以调低这个参数。
启用过滤器可以节省读磁盘的过程,可以有助于降低读取操作的延迟。所以应该针对经常发生读取操作的列族添加布隆过滤器。
当RowKey的长度较小时(例如小于100B),应该调小块的大小,这样块内查找时间较少,但是增加了索引的大小,增加了内存开销。
(1) Single:如果一个Block第一次被访问,则写入这一级队列
(2) Multi:如果一个Block被多次访问,则从Single队列移动到Multi中。
(3) In Memory:如果一个Block是In Memory的,则放到该队列里。
对于经常访问的列族,可以将其In Memory属性设置为true,单独使用一个缓存队列。但是这增加了内存开销。
这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:
大数据技术●降龙十八掌
大数据技术●降龙十八掌
系列文章:
:【十八掌●武功篇】第八掌:HBase之基本概念
【十八掌●武功篇】第八掌:HBase之Shell
【十八掌●武功篇】第八掌:HBase之基本操作Java API
【十八掌●武功篇】第八掌:HBase之过滤器总结
【十八掌●武功篇】第八掌:HBase之性能调优
【十八掌●武功篇】第八掌:HBase之安装与集成 [草稿]
一、 硬件和操作系统的调优
1、 内存
HBase服务器对内存的消耗是很大的, 主要是因为HBase的树状结构树、缓存机制、日志记录机制导致的。所以服务器的内存尽量要大。2、 CPU
HBase中的过滤器、组合扫描、压缩都是CPU密集型的操作,提高CPU的核数和性能也是HBase优化的重要措施。3、 操作系统
(1) 选用64位Linux虽说HBase可以运行在Linux、Unix、甚至Windows上,但是选用64位的Linux是最好的选择。
(2) 指定noatime参数
另外在Linux上挂载磁盘时,默认的选项是atime,atime选项是指当对磁盘的每次写入或者写入时都会产生一个记录。而Hadoop使用NameNode管理HDFS上的元数据,操作系统对文件的访问时间对Hadoop是无意义的,所有可以禁止每次读写都产生记录来提高HDFS的访问性能,进而提高HBase的性能。可以在挂载磁盘时指定noatime选项来达到这个目的。
指定noatime参数的步骤:
1) 编辑/etc/fstab文件
2) 在对应分区的defaults后面添加noatime参数
3) 用mount命令重新加载分区
4) 关闭系统交换分区
Linux内存的反复交换会影响JVM的性能,从而影响集群的整体性能。可以将交换分区关闭,vm.swappiness是交换分区利用率的参数,范围为[0,100],值越小表示尽量使用物理内存,为0表示尽量不用交换分区。
关闭方法:
sysctl –w vm.swappiness=0
二、 网络调优
4、 配置交换机
(1) 尽可能使用TOR(Top of Rank)交换机。同一个机架上的服务器通过短跳线连接到一个交换机上(2) 确保应用服务器尽量靠近HBase集群。
(3) 考虑交换机的容量。
5、 添加机架感知
配置Hadoop的机架感知,可以让Hadoop中的HDFS的副本存放的更合理、读取更快,因为HBase的数据就是存储在Hadoop的HDFS上的,所以设置好了机架感知也是提高HBase性能的一种方法。设置步骤:
(1) 编写机架感知的脚本
机架感知的脚本是用Python写的,输入一个域名或者IP,返回所在机架。
#!/usr/bin/python #-*-coding:UTF-8 -*- import sys rack = {"hadoop-node-31":"rack1", "hadoop-node-32":"rack1", "hadoop-node-33":"rack1", "hadoop-node-34":"rack1", "192.168.1.50":"rack2", "192.168.1.51":"rack2", "192.168.1.52":"rack2", "192.168.1.53":"rack2", "192.168.1.54":"rack2", } if __name__=="__main__": print "/" + rack.get(sys.argv[1],"rack0")
(2) 配置脚本路径
将脚本放在NameNode所在的机器上,然后在core-site.xml中配置
<property> <name>topology.script.file.name</name> <value>/opt/topology.py</value> </property>
(3) 重启NameNode,使得机架感知生效。
三、 JVM优化
6、 垃圾回收算法
7、 JVM参数设置
四、 HBase查询优化
8、 设置Scan缓存
可以设置Scan查询时的缓存,定义一次交互从服务器端传输到客户端的行数,设置的方法是使用Scan.setCaching()方法,这样虽然能减少和HBase RegionServer的交互次数,但是却增加了客户端和RegionServer的内存消耗,所以一味地增加缓存的大小并一定是最优的。9、 显示地指定列
当使用Scan或者Get读取行的数据时,最好确定下客户端所需要的列,以减少服务器到客户端的网路传输数据量。使用Scan的addColumn()方法来指定需要读取的列。10、 关闭ResultScanner
ResultScanner是HBase读取的结果,如果不及时关闭可能会出现服务器端一段时间内一直保存连接。在使用完后关闭ResultScanner是个好的习惯。11、 禁用块缓存
在Scan扫描时,启用和禁用块缓存是使用setCacheBlocks()方法设置,如果启用了块缓存,那么HBase会将每次读取的数据缓存在块缓存中,以提高下次对这个数据的读取,但是有时候一条数据在未来一定时间内只读取一次(比如在用MapReduce全表遍历的时候),没有必须缓存,可以禁用块缓存。12、 优化RowKey的查询
尽量使用过滤器根据RowKey进行过滤数据13、 使用批量读
Table.get()方法可以根据一个Get列表读取多行记录,使用这个方法可以在服务器端执行完所有的查询操作后一块返回结果。五、 HBase写入优化
14、 关闭写WAL日志
15、 预创建Region
HBase中创建一个新表,默认只有一个Region,当随着表中数据量的增加,Region不断增大,当达到一定的阀值时,就会将Region平分为两个Region。在分裂为很多Region之前的很长的时间内,读写操作就会集中在那几个RegionServer上,造成少数几台机器压力过大。这个问题在导入原始数据时候特别突出。为了解决上述问题,可以在创建表的时候就预创建Region,提前划分好很多Region,一是避免了前期频繁的分裂Region的过程,二是解决了到期时候操作集中到少数机器上的问题。
预创建Region的方法:
(1) 创建表的时候预创建
参考前面的预分区那一小节。
(2) 对存在的表创建
HBase自带了一个预创建Region的工具org.apache.hadoop.hbase.util.RegionSplitter。
${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.util.RegionSplitter tablename HexStringSplit –c 10 –f cfname
这个例子是将表tablename使用HexStringSplit算法拆分为10个Region,列族名为cfname。
(3) 使用自定义的算法创建
16、 使用批量写
Table.put()方法可以支持传入一个List,以实现批量地put数据,这样减少网络的I/O开销。六、 HBase基本核心服务优化
17、 优化分裂操作
18、 优化合并操作
七、 HBase配置参数优化
19、 设置RegionServer Handler数量
hbase.regionserver.handler.count参数可以设置每台RegionServer的Handler的数量,这个参数是指定RegionSever可以同时处理多少个请求的线程数。这个参数设置的大小跟RegionSever的内存大小息息相关,当对HBase的操作消耗内存不大的时候,可以将这个参数调大。
20、 调整BlockCache大小
hfile.block.cache.size用于RegionSever查询时读缓存占用堆内存大小的百分比。RegionSever的堆内存分为两部分,一部分是MemStore,主要用来写;另一部分做为BlockCache,主要用于读。数据写入时会先写入MemStore,RegionServer会给每个Region提供一个MemStore。
数据读取时会先到MemStore中查数据,查不到就到BlockCache中查找,再查不到就到磁盘上读取,并把读取的结果放入BlockCache。
在调整BlockCache时要注意:
● BlockCache和MemStore占比总和不能超过堆内存的
● 以读为主要业务时则调大值,写为主的调小值。
● 不要关闭BlockCache,因为关闭后RegionServer会花很多时间不停加载HFile索引。
21、 调整MemStore的上下限
(1) MemStore上限hbase.regionserver.global.memstore.upperLimit表示RegionSever上所有Region的MemStore大小上限,当RegionServer上所有的Region的MemStore大小到这个比例时就会触发全局的flush操作。
hbase.hregion.memstore.flush.size用于单个Region内所有MemStore大小总和超过时触发flush
(2) MemStore下限
hbase.regionserver.global.memstore.lower.limit表示RegionSever上所有Region的MemStore的大小下限。当RegionServer上所有的Region的MemStorm到达下限时不会触发全局的flush,而是会寻找一个MemStorm最大的Region进行flush。
22、 调整影响合并的文件数
flush操作时,如果一个Region中Store内有超过N个StoreFile,则进行合并以减少StoreFile文件的数量,参数为hbase.hstore.blockingStoreFiles是设置阀值。合并操作会阻塞写请求,但是文件数过多会影响读的性能。
23、 调整MemStore的flush因子
当Region的MemStore占用的内存大小超过hbase.hregion.memstore.flush.size参数的值(单位bytes)时,触发flush操作将数据写入硬盘,此时阻塞该Region的所有的操作。24、 调整单个文件大小
hbase.hregion.max.filesize用于定义单个HStoreFile文件的大小,当单个Region文件大小超过该值时就会触发Split操作。八、 Zookeeper优化
25、 调整Zookeeper Session的有效时长
参数zookeeper.session.timeout用于定义连接zookeeper的session有效时长,默认是3分钟,也就是说默认下,如果RegionSever宕机了,Master在3分钟后才能发现并进行自动恢复,这恢复之前,这个RegionServer不能对外提供服务,很多场景下对这么长时间的故障是不能被容忍的。可以调低这个参数。
26、 配置Zookeeper节点数
由于Zookeeper的选举机制,Zookeeper的节点数最少是3个,并且Zookeeper的节点数应该是奇数,节点数越多越可靠,但是节点数越多性能会下降。27、 独立Zookeeper集群
HBase自带了Zookeeper,但是线上环境不建议使用HBase自带的Zookeeper,而是使用独立的Zookeeper集群。因为Zookeeper承担了HBase消息通讯和Failover机制的重要角色,必须保证Zookeeper的可靠性和高效性。九、 表设计优化
28、 开启布隆过滤器
布隆过滤器是针对每个列族单独启用的,有三种类型:NONE、ROW、ROWCOL。默认是NONE,即不启用布隆过滤器;ROW表示RowKey的哈希在每次插入行时被添加进布隆过滤器;ROWCOL表示RowKey、列族、列名三者的哈希将在每次插入行的时候添加进布隆过滤。启用过滤器可以节省读磁盘的过程,可以有助于降低读取操作的延迟。所以应该针对经常发生读取操作的列族添加布隆过滤器。
29、 调整HFile块的大小
HBase的数据是存储在StoreFile中的,StoreFile是由HFile块组成的,HFile是HBase从StoreFile中读取数据的最小数据单位,HFile块大小的是一个重要的调优参数。当RowKey的长度较小时(例如小于100B),应该调小块的大小,这样块内查找时间较少,但是增加了索引的大小,增加了内存开销。
30、 设置In Memory属性
HBase RegionServer的读缓存BlockCache是分级的,包含三个级别的优先队列:(1) Single:如果一个Block第一次被访问,则写入这一级队列
(2) Multi:如果一个Block被多次访问,则从Single队列移动到Multi中。
(3) In Memory:如果一个Block是In Memory的,则放到该队列里。
对于经常访问的列族,可以将其In Memory属性设置为true,单独使用一个缓存队列。但是这增加了内存开销。
31、 调整列族最大版本数
列族的最大版本数是指列族内单元格数据能存储的最多的版本,默认值是3,版本越多,占用空间越多,检索越慢。有些应用中需要保存多个版本或者全部版本,但是有些应用只需要一个版本就可以了。可以根据业务需要,设置合理的版本数量。32、 设置TTL属性
TTL(Time To Live)是列族的属性,是指列族中单元格的数据存储的时间,过期后数据就会被自动删除。单位是秒,当一个RowKey中所有的列都失效,这一行的数据都会被删除。这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:
大数据技术●降龙十八掌
相关文章推荐
- 【十八掌●武功篇】第八掌:HBase之Shell
- 【十八掌●武功篇】第八掌:HBase之基本概念
- 【十八掌●武功篇】第八掌:HBase之基本操作Java API
- 【十八掌●武功篇】第八掌:HBase之过滤器总结
- 【十八掌●武功篇】第八掌:HBase之安装与集成
- [转]大数据性能调优之HBase的RowKe…
- 大数据性能调优之HBase的RowKey设计
- HBase写入性能改造(续)--MemStore、flush、compact参数调优及压缩卡的使用
- HBase写入性能改造(续)--MemStore、flush、compact参数调优及压缩卡的使用
- 大数据性能调优之HBase的RowKey设计
- HBase在淘宝主搜索的Dump中的性能调优
- 大数据性能调优之HBase的RowKey设计
- HBase配置性能调优
- HBase配置性能调优
- 【HBase调优】Hbase万亿级存储性能优化总结
- 大数据性能调优之HBase的RowKey设计
- 【HBase调优】Hbase万亿级存储性能优化总结
- HBase在淘宝主搜索的Dump中的性能调优
- HBase性能调优
- HBase数据库性能调优(1)