日期:2014-05-16  浏览次数:20375 次

HBase Compaction (2)

一、图形化理解HBase数据写和合并操作过程

? ? ? ?HBase 写数据的过程是:先写到内存中(memstore),当内存中的数据达到一定大小,将内存中的数据一次性flush到磁盘上形成一个新的数据文件。期间对每一次写操作,都会记一个持久化的日志。那些 flush 到磁盘上的文件,会定时进行合并。下图形像地说明这一系列过程:

? ? ? ?

? ? ? ?原文链接:http://goo.gl/jwKdj

二、性能优化

? ? ? ?1.关闭主合并的自动运行功能(关闭定时器)

vi $HBASE_HOME/conf/hbase-site.xml  
<property>  
<name>hbase.hregion.majorcompaction</name>  
<value>0</value>  
</property>  

? ? ? ?2.为了提高性能,在低负载的时候通过HBase Shell手动执行主合并

major_compact 'table name or region name'  

? ? ? ?major_compact命令会把所指定的表或区域放入主合并的队列中,主合并将在该区域所属服务器的后台执行。 ?

? ? ? ?2.1.这只要在一个cron作业中调用major_compact命令就可以轻松地做到。

? ? ? ?2.2.调用主合并的另一种方法是使用org.apache.hadoop.hbase.client.HBaseAdmin类提供的majorCompact API。在Java中调用这个API很容易,因此你可以在Java中管理较复杂的主合并时间安排。

        final String tableName = tableNameString(tableNameOrRegionName, ct);
        List<Pair<HRegionInfo, ServerName>> pairs =
          MetaReader.getTableRegionsAndLocations(ct,
              tableName);
        for (Pair<HRegionInfo, ServerName> pair: pairs) {
          if (pair.getFirst().isOffline()) continue;
          if (pair.getSecond() == null) continue;
          try {
            compact(pair.getSecond(), pair.getFirst(), major, columnFamily);
          } catch (NotServingRegionException e) {
            if (LOG.isDebugEnabled()) {
              LOG.debug("Trying to" + (major ? " major" : "") + " compact " +
                pair.getFirst() + ": " +
                StringUtils.stringifyException(e));
            }
          }
        }
? ? ? ?把表的所有region一次性提交主合并,没有做一些细节控制。例如:一张表有240个region,这样就会产生大量的磁盘I/O和网络通信,严重影响性能。

? ? ? ?优化设计方案:

? ? ? ? ? ? ? 首先,把表的所有region按所属RegionServer进行分组;

? ? ? ? ? ? ? 然后,设定等待时间,按时对分组进行轮询(负载均衡算法)提交主合并。

? ? ? ?3.减少compaction的发生

? ? ? ? ? ? ?HBase解决Region Server Compact过程占用大量网络出口带宽的问题

? ? ? ? ? ? ?选择性地关闭small compaction或large compaction。

? ? ? ? ? ? ?两个线程池,选择性地关闭一个,留下一个,这样使得并发处理能力减半,来减轻磁盘I/O和网络通信的压力。

? ? ? ?4.减少major compaction的发生

? ? ? ? ? ? ??compaction配置参数

? ? ? ? ? ? ? ? ? ? ?Max Compaction Size ? ? ? ? ?[HBASE-3290]

? ? ? ? ? ? ? ? ? ? ?Add ability to specify a maximum storefile size for compaction. After this limit, we will not include this file in compactions. This is useful for large object stores and clusters that pre-split regions.

? ? ? ? ? ? ? ? ? ? ?hbase.hstore.compaction.max.size (.92) (bytes) Any StoreFile larger than this setting with automatically be excluded from compaction (default Long.MAX_VALUE).

? ? ? ? ? ? ? ? ? ? ?hbase.hstore.compaction.max.size=4294967296(4×1024×1024×1024) hfile达到4G就不参与合并

? ? ? ? ? ? ? ? ? ? ?hbase.hstore.compaction.max.size(defaults to Long.MAX_VALUE ):Any file larger than the maximum compaction size is always excluded.

? ? ? ? ? ? ? ? ? ? ?超过4G的文件不参与compaction会降低major compaction的概率

三、参考资料

? ? ? ?1.图形化理解 HBase 数据写操作、压缩操作过程

? ? ? ?2.HBase解决Region Server Compact过程占用大量网络出口带宽的问题