Ø
创建自定义的预分区
默认情况下,在创建
HBase
表的时候会自动创建一个
region
分区,当导入数据的时候,所有的
HBase
客户端都向这一个
region
写数据,直到这个
region
足够大了才进行切分。一种可以加快批量写入速度的方法是通过预先创建一些空的
regions
,这样当数据写入
HBase
时,会按照
region
分区情况,在集群内做数据的负载均衡。
Ø
增加
Regionserver
的处理线程
hbase.regionserver.handler.count
是
RegionServer
端开启的
RPC
监听器实例个数,也即
RegionServer
能够处理的
IO
请求线程数。默认是
10.
此参数与内存息息相关。该值设置的时候,以监控内存为主要参考。
对于 单次请求内存消耗较高的
Big PUT
场景(大容量单次
PUT
或设置了较大
cache
的
scan
,均属于
Big PUT
)或
ReigonServer
的内存比较紧张的场景,可以设置的相对较小。
对于 单次请求内存消耗低,
TPS
(
TransactionPerSecond
,每秒事务处理量)要求非常高的场景,可以设置的相对大些。
Ø
使用
noatime
和
nodiratime
挂载磁盘
如果你以
noatime
挂载磁盘,访问时间戳不会更新,当一个文件在文件系统中被读的时候。在这个
nodiratime
属性情况中,挂载磁盘不会更新文件系统中目录的
inode
访问时间。因为它们没有更多的磁盘
I/O
更新访问时间戳,这提升了文件系统的访问速度。
Ø
把
vm.swappiness
设置成
0
来避免
swap
Linux
移动那些一段时间没有被访问的内存页到
swap
空间,即使它由足够可用的内存。这叫做
swap out。
换一句话说,从
swap
空间读
swapped out
的数据到内存中叫做
swap
。如果
HBase
使用的内存被
swapped
了,
HBase
运行可能会遇到问题,如会增加
GC
时间等。
ØJava GC
和
HBase
堆设置
因为
HBase
运行在
JVM,JVM
的
Garbage Collection(GC)
设置对于
HBase
流畅的运行,更高的性能是非常重要的。建议
HBase
的最大堆内存不要超过
16 GB
,并将垃圾回收机制设置为
CMS
。
同时
HBase
进程输出到它们的
GC
日志中是同样重要的,可以根据
GC
日志来定位问题,或调整
JVM
设置。
另外可以设置
hbase.hregion.memstore.mslab.enabled
为
true
,来预防老年代堆碎片,减少因内存碎片导致的
Full GC
,提高整体性能
Ø
增加
HBase
用户的
File handles
和
process limits
操作系统默认的
nofile
、
nproc
对于
HBase
来说偏小,在高并发的情况下会使用
HBase
出现问题。建议增大
nofile
、
nproc
设置。
Ø
增加
DATANODE
处理线程数
HBase
以
Datanode
做为底层的存储,可能会同时打开较多的
hdfs
文件,因些需要增大默认的
dfs.datanode.max.transfer.threads
参数。
Øhbase.hregion.max.filesize
在当前
ReigonServer
上单个
Reigon
的最大存储空间,单个
Region
超过该值时,这个
Region
会被自动
split
成更小的
region
。对于
0.90.x
版本该参数的最大值为
4GB
,之后的版本最大值 可以达到
20GB
,
5
到
10GB
是最优的。
Ø
增大
zookeeper
的
maxClientCnxns
默认
zookeeper
给每个客户端
IP
使用的连接数为
10
个,可能会出现连接不够用的情况。可以增大
maxClientCnxns
参数。
Ø
增大
hbase.hstore.blockingStoreFiles
在
flush
时,当一个
region
中的
Store(Coulmn Family)
内有超过
7
个
storefile
时,则
block
所有的写请求进行
compaction,
以减少
storefile
数量。可以增加为
20
。
Øhfile.block.cache.size
storefile
的读缓存占用
Heap
的大小百分比,
0.2
表示
20%
。该值直接影响数据读的性能。如果写比读少很多,可以开到
0.4-0.5
。如果读写较均衡,
0.3
左右。如果写比读多,可以使用默认值。