一、图形化理解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过程占用大量网络出口带宽的问题