HBase性能调优
(1)创建表预分区
针对原始数据实时ETL落地hbase,设置好预分区,解决数据热点问题,当已知rowkey的值的时候,设置预分区可以根据rowkey的区间进行分区。
# 创建预分区语法
create 'VEHICLE_NS:VEHICLE_SPLIT','INFO', {SPLITS => ['40000','70000']}
# rowkey所在的范围
分区1:startKey 为空,endKey为10000
分区2:startKey 10000,endKey为70000
分区3:startKey 70000,endKey为空
# 正常情况下,创建表预分区个数不少3个,一定时在创建表的时候指定,并不是表创建以后。
(2)表数据压缩
HBase数据库,底层数据存储在HFile文件中,放置在HDFS文件系统上,可以对其设置数据压缩,比如gzip、snappy或lz4等,减少磁盘存储空间。
预分区字段要符合rowkey前缀匹配
• 查看系统支持压缩格式
hbase org.apache.hadoop.util.NativeLibraryChecker
# 创建表示指定压缩格式
create 'vehicle_src_gz',{NAME => 'info', COMPRESSION => 'gz'}
• 不同压缩方式对比
同等数据98192 row(s),虚拟机服务环境压缩率顺序为
gz > snappy > lz4
压缩率对比,还应该看压数据总量,压缩速度和解压速度,也就是压缩和解压消耗的时间
数据量更大的情况下,可能snappy压缩率更高,按实际情况测试选择压缩算法
(3)数据块Block编码
当从HBase表读取数据时,先读MemStore,然后再读BlockCache的。那么Block越小,能放到BlockCache中的数据就越多,命中率就越高,对Scan就越友好。
Block Encoding:通过某种算法,对Data Block中的数据进行压缩,Block Size小,放到Block Cache中就多。
create 'VEHICLE_NS:VEHICLE_SRC_BLOCK', { NAME => 'INFO', DATA_BLOCK_ENCODING => 'FAST_DIFF'}
(4)内存优化
(1) MemStore:写缓存
hbase.regionserver.global.memstore.size = 0.4
如果memstore达到这个阈值,Flush到HDFS
(2) BlockCache:读缓存
hfile.block.cache.size = 0.4
如果blockcache达到这个阈值,通过LRU淘汰算法,将最近最少被使用的数据从缓存中剔除
总结:
读多写少,增加BlockCache比例,减少MEMStore比例
读少写多,增加MEMStore比例,减少BlockCache比例
(5)布隆过滤
在写入数据时,建立布隆索引;读取数据时,根据布隆索引加快数据的检索
功能:什么是布隆过滤器?
列族的一个属性,用于数据查询时对数据的过滤
列族属性:BLOOMFILTER => NONE | 'ROW' | ROWCOL
NONE :不开启布隆过滤器
ROW:行级布隆过滤
生成StoreFile文件时,会将这个文件中有哪些Rowkey的数据记录在文件的头部
当读取StoreFile文件时,会从文件头部获取这个StoreFile中的所有rowkey,自动判断是否包含需要的rowkey,如果包含就读取这个文件,如果不包含就不读这个文件
ROWCOL:行列级布隆过滤
生成StoreFile文件时,会将这个文件中有哪些Rowkey的以及对应的列族和列的信息数据记录在文件的头部
当读取StoreFile文件时,会从文件头部或者这个StoreFile中的所有rowkey以及列的信息,自动判断是否包含需要的rowkey以及列,如果包含就读取这个文件,如果不包含就不读这个文件
(6)【基础环境优化】
> Linux系统优化
- 开启文件系统的预读缓存可以提高读取速度
blockdev --setra 32768 /dev/sda
- 最大限度使用物理内存
sysctl -w vm.swappiness=0
- 调整文件及进程句柄数
vim /etc/security/limits.conf 修改打开文件数限制
末尾添加:
soft nofile 1024000
hard nofile 1024000
- nofile 1024000
- nproc 1024000
vim /etc/security/limits.d/20-nproc.conf 修改用户打开进程数限制
修改为:
soft nproc 4096
root soft nproc unlimited
soft nproc 40960
root soft nproc unlimited
> HDFS文件系统级别优化,在hdfs-site.xml中添加
- 保证RPC调用会有较多的线程数
dfs.namenode.handler.count = 20
dfs.datanode.handler.count = 20
- 文件块大小的调整
dfs.blocksize = 256M
- 文件句柄数
dfs.datanode.max.transfer.threads = 4096
- 超时时间
dfs.image.transfer.timeout = 60000
- 避免DN错误宕机
dfs.datanode.failed.volumes.tolerated = 1
> Zookeeper 优化
- 优化Zookeeper会话超时时间
zookeeper.session.timeout = 90000
> Hbase属性优化
- 设置RPC监听数量
hbase.regionserver.handler.count = 50
- 优化hbase客户端缓存
hbase.client.write.buffer = 2097152
- 指定scan.next扫描HBase所获取的行数
hbase.client.scanner.caching = 2147483647