千家信息网

HBase如何调优

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,小编给大家分享一下HBase如何调优,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 表的设计1.1 提前创建多个Reg
千家信息网最后更新 2024年11月23日HBase如何调优

小编给大家分享一下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如何调优"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0