Hbase优化:内存分配
-
目标
- 了解Hbase中内存的管理及分配
-
分析
- 写缓存:Memstore
- 读缓存:BlockCache
- 使用的RegionServer的JVM堆内存
- 注意:所有使用JVM堆内存工具,都会有一个共同的问题:GC停顿
- 合理设计垃圾回收的机制来回收内存,避免GC停顿
-
实现
-
MemStore:写缓存
hbase.regionserver.global.memstore.size = 0.4
- 如果存多了,Flush到HDFS
-
BlockCache:读缓存
hfile.block.cache.size = 0.4
- LRU淘汰算法,将最近最少被使用的数据从缓存中剔除
-
读多写少,降低MEMStore比例
-
读少写多,降低BlockCache比例
-
-
总结
- 可以根据实际的工作场景的需求,调整内存比例分配,提高性能
Hbase优化:压缩机制
-
目标
- 了解Hbase中支持的压缩类型及配置实现
-
分析
-
Hbase的压缩源自于Hadoop对于压缩的支持
-
检查Hadoop支持的压缩类型
hadoop checknative
-
需要将Hadoop的本地库配置到Hbase中
-
-
实现
-
关闭Hbase的服务
配置Hbase的压缩本地库: lib/native/Linux-amd64-64
cd /export/server/hbase-2.1.0/ mkdir lib/native
-
将Hadoop的压缩本地库创建一个软链接到Hbase的lib/native目录下
ln -s /export/server/hadoop-2.7.5/lib/native /export/server/hbase-2.1.0/lib/native/Linux-amd64-64
-
启动Hbase服务
start-hbase.sh hbase shell
-
创建表
create 'testcompress',{NAME=>'cf1',COMPRESSION => 'SNAPPY'} put 'testcompress','001','cf1:name','laoda'
-
-
总结
- Hbase提供了多种压缩机制实现对于大量数据的压缩存储,提高性能
- 压缩属于列族的属性:基于列族设计压缩
Hbase优化:布隆过滤
-
目标
- 了解布隆过滤器的功能及使用
-
分析
- 什么是布隆过滤器?
- 是列族的一个属性,用于数据查询时对数据的过滤,类似于ORC文件中的布隆索引
- 什么是布隆过滤器?
-
实现
- 列族属性:BLOOMFILTER => NONE | ‘ROW’ | ROWCOL
- NONE :不开启布隆过滤器
- ROW:开启行级布隆过滤
- 生成StoreFile文件时,会将这个文件中有哪些Rowkey的数据记录在文件的头部
- 当读取StoreFile文件时,会从文件头部或者这个StoreFile中的所有rowkey,自动判断是否包含需要的rowkey,如果包含就读取这个文件,如果不包含就不读这个文件
- ROWCOL:行列级布隆过滤
- 生成StoreFile文件时,会将这个文件中有哪些Rowkey的以及对应的列族和列的信息数据记录在文件的头部
- 当读取StoreFile文件时,会从文件头部或者这个StoreFile中的所有rowkey以及列的信息,自动判断是否包含需要的rowkey以及列,如果包含就读取这个文件,如果不包含就不读这个文件
-
总结
- Hbase通过布隆过滤器,在写入数据时,建立布隆索引,读取数据时,根据布隆索引加快数据的检索
Hbase优化:列族属性
-
目标
- 了解其他常用列族属性
-
分析
{NAME => 'cf1', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'SNAPPY', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
-
实现
- NAME:表示列族的名称
- VERSIONS:最大版本数
- 表示这个列族中的列最多可以存储几个版本的值
- TTL:设置版本的自动过期时间,默认永不过期的,修改单位为秒
- VERSIONS = 5
- MIN_VERSIONS = 2
- 一旦到达TTL时间,会自动清理过期的版本,只保留2个版本
- MIN_VERSIONS:最小版本数
- BLOCKCACHE:开启缓存,如果列族开启了缓存,这个列族从HDFS的查询就会放入缓存中
- 默认就开启的
- 工作中要将不是经常读的列族的缓存关闭
- 使用LRU算法淘汰过期的数据
- IN_MOMERY:最高缓存级别,meta表就是这个级别,一般情况下不建议开启
- 不会被优先淘汰
- BLOCKSIZE:存储文件的块的大小
- 块越小,索引越多,查询越快,占用内存越多
- 块越大,索引越少,查询相对较慢,占用内存越少
- 一般不建议调整
Hbase优化:其他优化
-
目标
- 了解Linux、HDFS、Zookeeper、Hbase其他属性优化
-
实现
-
Linux系统优化
-
开启文件系统的预读缓存可以提高读取速度
sudo blockdev --setra 32768 /dev/sda
-
最大限度使用物理内存
sudo sysctl -w vm.swappiness=0
-
调整文件及进程句柄数
sudo vi /etc/security/limits.conf 修改打开文件数限制 末尾添加: * soft nofile 1024000 * hard nofile 1024000 Hive - nofile 1024000 hive - nproc 1024000 $ sudo vi /etc/security/limits.d/20-nproc.conf 修改用户打开进程数限制 修改为: #* soft nproc 4096 #root soft nproc unlimited * soft nproc 40960 root soft nproc unlimited
-
-
HDFS优化
-
保证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
-
-