hbase超大量数据导入方式,原理就是提前生成相应的Hfile文件,再导入hbase中。
- 要导入数据的列相同的情况,使用现成的预定义工具importtsv
- 要导入数据的列不相同的情况,自定义MR实现
importtsv
说明:$output为Hfile文件生成的hdfs路劲,$input为要处理文件存放的hdfs路劲,$table为要导入hbase表名
http://abloz.com/hbase/book.html#importtsv
报错一:NoClassDefFoundError:org.apache.hadoop.hbase.filter.Filter,等等类找不到
原因:HADOOP_CLASSPATH中没有Hbase相关的包
解决:在执行下面两步时先执行export HADOOP_CLASSPATH=${HBASE_HOME}/lib/*
报错二:client.RpcRetryingCaller:Call exception,tries= ,retries=35
原因:有可能是生成的Hfile目录权限问题
解决:修改$output为777,hdfs dfs -chmod -R 777 $output
- 1. 生成Hfile
hadoop jar ${HBASE_HOME}/lib/hbase-mapreduce-2.0.4.4.jar \
importtsv \
-Dimporttsv.columns=HBASE_ROW_KEY,f:q1,f:q2,... \
-Dimporttsv.separator="," \
-Dimporttsv.bulk.output=$output \
$table $input
上面的报错试下这个
bin/hbase org.apache.Hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.columns=HBASE_ROW_KEY,f:q1,f:q2,... \
-Dimporttsv.separator="," \
-Dimporttsv.bulk.output=$output \
$table $input
- 2. 导入Hbase
hadoop jar ${HBASE_HOME}/lib/hbase-mapreduce-2.0.4.4.jar completebulkload $output $table
注意:
- 如果待导入表是新表,一定要进行预分区,否则默认一个region,只有一个reducer,导入很慢,且会Mem Overflow
- hbase.hregion.max.filesize,Hfile大小设置,默认10G,超过该大小即拆分
- hbase.mapreduce.bulkload.max.hfiles.perRegion.perFamily,每个region每个列族bulkload时接受的最大Hfile数,默认32
- hbase.loadincremental.validate.hfile,对HFile的格式是否进行检查,默认true,如果确定Hfile没问题,改为false,可加快导入速度
- hbase.bulkload.retries.number,默认10,如果Hfile的[startKey,endKey]不被任何一个region[startKey,endKey]包含,则需要进行拆分,这里控制Hfile拆分次数,超出则报错:Retry attempted 10 times without completing, bailing out
int maxRetries = cfg.getInt("hbase.bulkload.retries.number", 10); if (maxRetries != 0 && count >= maxRetries) { LOG.error("Retry attempted " + count + " times without completing, bailing out"); return; }