在使用hbase过程中发现在写入hbase的数据量很大时,经常发生写不进去的情况。而我们基于hbase的应用是对实时性要求很高的,一旦hbase不能读写则会大大影响系统的使用。下面将记录hbase写优化的过程。
1.禁止Major Compaction
在hbase进行Major Compaction时,该region将合并所有的storefile,因此整个region都不可读,所有对此region的查询都会block。HBase默认一天左右执行一次Major Compaction。我们将Major Compaction禁掉并用Cron脚本每天在系统空闲时对所有表执行major compaction。
Major Compaction的配置:
<property>
<name>hbase.hregion.majorcompaction</name>
<value>0</value>
</property>
默认是1天,每个region会在创建时以当前时间初始化regionMajorCompactionTime,并将下一次的major compaction时间设为1+-0.2天。配置中将此值设为0禁止major compaction。
major_compaction的脚本:取出所有table,一一执行major_compact:
TMP_FILE=tmp_tables
TABLES_FILE=tables.txt
echo "list" | hbase shell > tmp_tables
sleep 2
sed '1,6d' $TMP_FILE | tac | sed '1,2d' | tac > $TABLES_FILE
sleep 2
for table in $(cat $TABLES_FILE); do
echo "major_compact '$table'" | hbase shell
sleep 10
done