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

posted @ 2022-08-24 23:03  xiaotian278  阅读(179)  评论(0编辑  收藏  举报