HBase配置优化
允许在HDFS的文件中追加内容
hdfs-site.xml、hbase-site.xml
1
2
3
4
5<!-- 开启HDFS追加同步,可以优秀的配合HBase的数据同步和持久化。默认值为true。 -->
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>优化DataNode允许的最大文件打开数
hdfs-site.xml
1
2
3
4
5<!-- HBase一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作,设置为4096或者更高。默认值:4096 -->
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>优化延迟高的数据操作的等待时间
hdfs-site.xml
1
2
3
4
5<!-- 如果对于某一次数据操作来讲,延迟非常高,socket需要等待更长的时间,建议把该值设置为更大的值(默认60000毫秒),以确保socket不会被timeout掉 -->
<property>
<name>dfs.image.transfer.timeout</name>
<value>60000</value>
</property>优化数据的写入效率
mapred-site.xml
1
2
3
4
5
6
7
8
9
10<!-- 开启数据压缩可以大大提高文件的写入效率,减少写入时间 -->
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>设置RPC监听数量
hbase-site.xml
1
2
3
4
5<!-- 指定RPC监听的数量,可以根据客户端的请求数进行调整,读写请求较多时,增加此值 -->
<property>
<name>hbase.regionserver.handler.count</name>
<value>30</value>
</property>优化HStore文件大小
hbase-site.xml
1
2
3
4
5<!-- 如果需要运行HBase的MR任务,可以减小此值,因为一个region对应一个map任务,如果单个region过大,会导致map任务执行时间过长。该值的意思就是,如果HFile的大小达到这个数值,则这个region会被切分为两个Hfile -->
<property>
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value>
</property>优化hbase客户端缓存
hbase-site.xml
1
2
3
4
5<!-- 指定HBase客户端缓存,增大该值可以减少RPC调用次数,但是会消耗更多内存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少RPC次数的目的 -->
<property>
<name>hbase.client.write.buffer</name>
<value>5242880</value>
</property>指定scan.next扫描HBase所获取的行数
hbase-site.xml
1
2
3
4
5<!-- 指定scan.next方法获取的默认行数,值越大,消耗内存越大 -->
<property>
<name>hbase.client.scanner.caching</name>
<value>1</value>
</property>flush、compact、split机制
当MemStore达到阈值,将Memstore中的数据Flush进Storefile;compact机制则是把flush出来的小文件合并成大的Storefile文件。split则是当Region达到阈值,会把过大的Region一分为二。即:128M就是Memstore的默认阈值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<!-- 当单个HRegion内所有的Memstore大小总和超过指定值时,flush该HRegion的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模型来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM -->
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
<!-- 当MemStore使用内存总量达到hbase.regionserver.global.memstore.upperLimit指定值时,将会有多个MemStores flush到文件中,MemStore flush 顺序是按照大小降序执行的,直到刷新到MemStore使用内存略小于lowerLimit -->
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.4</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.38</value>
</property>