0%

HBase配置优化

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>