您好,登录后才能下订单哦!
小编给大家分享一下HBase如何调优,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1. 表的设计
1.1 提前创建多个Region
默认情况下,在创建HBase表的时候会自动创建一个Region分区,当导入数据的时候,所有的HBase客户端都向这一个Region写数据,直到这个Region足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的Regions,这样当数据写入HBase时,会按照Region分区情况,在集群内做数据的负载均衡。
1.2 Row Key设计
HBase中row key用来检索表中的记录,支持以下三种方式:
(1) 通过单个RowKey访问:即按照某个RowKey键值进行Get操作;
(2) 通过RowKey的Range进行Scan:即通过设置Start RowKey和End RowKey,在这个范围内进行扫描;
(3) 全表扫描:即直接扫描整张表中所有行记录。
在HBase中,RowKey可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes,存为byte[]字节数组,一般设计成定长的。
RowKey是按照字典序存储,因此,设计RowKey时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为RowKey的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE – timestamp作为RowKey,这样能保证新写入的数据在读取时可以被快速命中。
1.3 Column Family设计
不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个Column family的表。因为某个Column Family在Flush的时候,它邻近的Column Family也会因关联效应被触发Flush,最终导致系统产生更多的I/O。
1.4 In Memory设置(可选)
创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到RegionServer的缓存中,保证在读取的时候被cache命中。
1.5 版本限制
创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,对于一些不是特别重要的数据,可以设置setMaxVersions(1)。
1.6 数据生命周期限制
创建表的时候,可以通过HColumnDescriptor.setTimeToLive(int timeToLive)设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 * 24 * 60 * 60)。
1.7 Compact 和Split(可选)
实际应用中,如果有必要可以手动触发Compact和split。
1.8 采用压缩(可选)
压缩需要根据实际业务和机器性能来衡量是否要采用牺牲CPU来换取存储上的节约,并且能节省I/O和网络开销,可以使用Lzo或Snappy压缩的方式,大致可以压缩4~5倍。
2. 读取优化
2.1 扫描缓存
在进行扫描时可以设置一次读取多条,缓存数据,减少I/O开销。代码实现:
hTable.setScannerCaching(50); // 参数50表示一次性扫描50条
2.2 扫描指定列
Scan时指定需要的Column Family,可以减少网络传输数据量,否则默认scan操作会返回整行所有Column Family的数据。
2.3 释放资源
通过scan取完数据后,记得要关闭ResultScanner,否则RegionServer可能会出现问题(对应的Server资源无法释放)。
3. 写入优化
3.1 写入缓存
写入HBase表的时候最好不要一条一条的写,采用批量的方式,在代码里设置:
hTable.setAutoFlush(false, false); // 不让hbase自动刷新数据到数据库
hTable.setWriteBufferSize(1024 * 1024 * 10);// 缓存大小10M
当缓存的数据达到10M的时候会触发flush操作,另外当hTable.flushCommits();或hTable.close();时也会flush数据到数据库中。而且Hbase的API中支持数据已list的方式插入。
4. 参数优化
4.1 连接时间
参数:zookeeper.session.timeout
RegionServer与Zookeeper间的连接超时时间,默认值:3分钟(180000ms),我们配置:300000ms(5min)。
4.2 线程数控制
参数:hbase.regionserver.handler.count
RegionServer的请求处理IO线程数,默认值:10,我们配置:200。
4.3 split阈值
参数:hbase.hregion.max.filesize
单个region触发split的大小阈值,默认值:256M,我们配置:4G。
4.4 开启mslab方案
参数:hbase.hregion.memstore.mslab.enabled
减少因内存碎片导致的Full GC,提高整体性能,默认值:true。
4.5 扫描缓存
参数:hbase.client.scanner.caching
scanner调用next方法一次获取的数据条数,默认值:1。
4.6 MemStore大小控制
参数:hbase.regionserver.global.memstore.upperLimit/lowerLimit
hbase.regionserver.global.memstore.upperLimit :防止memstore来不及flush成storefile,堆积对内存占用过大,当某region的所有memstore占用大于40%,hbase会强制block所有的更新(请求)并flush这些memstore释放内存。
hbase.regionserver.global.memstore.lowerLimit 默认值就可以,不用调。
以上是“HBase如何调优”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。