bulk-load装载hdfs数据到hbase小结

HBaseHadoopMapreduceXMLApache.bulk-load的作用是用mapreduce的方式将hdfs上的文件装载到hbase中,对于海量数据装载入hbase非常有用,参考http://hbase.apache.org/docs/r0.89.20100621/bulk-loads.html:

hbase提供了现成的程序将hdfs上的文件导入hbase,即bulk-load方式。它包括两个步骤(也可以一次完成):

1将文件包装成hfile,hadoopjar/path/to/hbase.jarimporttsv-Dimporttsv.columns=a,b,c<tablename><inputdir>

比如:

Java代码

1.hadoopdfs-cattest/1

2.12

3.34

4.56

5.78

hadoopdfs-cattest/1

12

34

56

78

执行

Java代码

1.hadoopjar~/hbase/hbase-0.90.2.jarimporttsv-Dimporttsv.columns=HBASE_ROW_KEY,f1t8test

hadoopjar~/hbase/hbase-0.90.2.jarimporttsv-Dimporttsv.columns=HBASE_ROW_KEY,f1t8test

将会启动mapreduce程序在hdfs上生成t8这张表,它的rowkey分别为1357,对应的value为2468

注意,源文件默认以"\t"为分割符,如果需要换成其它分割符,在执行时加上-Dimporttsv.separator=",",则变成了以","分割

2在上一步中,如果设置了输出目录,如

Java代码

1.hadoopjar~/hbase/hbase-0.90.2.jarimporttsv-Dimporttsv.bulk.output=tmp-Dimporttsv.columns=HBASE_ROW_KEY,f1t8test

hadoopjar~/hbase/hbase-0.90.2.jarimporttsv-Dimporttsv.bulk.output=tmp-Dimporttsv.columns=HBASE_ROW_KEY,f1t8test

那么t8表还暂时不会生成,只是将hfile输出到tmp文件夹下,我们可以查看tmp:

Java代码

1.hadoopdfs-dutmp

2.Found3items

3.0hdfs://namenode:9000/user/test/tmp/_SUCCESS

4.65254hdfs://namenode:9000/user/test/tmp/_logs

5.462hdfs://namenode:9000/user/test/tmp/f1

hadoopdfs-dutmp

Found3items

0hdfs://namenode:9000/user/test/tmp/_SUCCESS

65254hdfs://namenode:9000/user/test/tmp/_logs

462hdfs://namenode:9000/user/test/tmp/f1

然后执行hadoopjarhbase-VERSION.jarcompletebulkload/user/todd/myoutputmytable将这个输出目录中的hfile转移到对应的region中,这一步因为只是mv,所以相当快。如:

hadoopjar~/hbase/hbase-0.90.2.jarcompletebulkloadtmpt8

然后

Java代码

1.hadoopdfs-du/hbase/t8/c408963c084d328490cc2f809ade9428

2.Found4items

3.124hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.oldlogs

4.692hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.regioninfo

5.0hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.tmp

6.462hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/f1

hadoopdfs-du/hbase/t8/c408963c084d328490cc2f809ade9428

Found4items

124hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.oldlogs

692hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.regioninfo

0hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.tmp

462hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/f1

此时己经生成了表t8

注意,如果数据特别大,而表中原来就有region,那么会执行切分工作,查找数据对应的region并装载

程序使用中注意:

1因为是执行hadoop程序,不会自动查找hbase的config路径,也就找不到hbase的环境变量。因此需要将hbase-site.xml加入到hadoop-conf变量中

2还需要将hbase/lib中的jar包放入classpath中

3执行以上的步骤2时需要将zookeeper的配置写入core-site.xml中,因为在那一步时甚至不会读取hbase-site.xml,否则会连不上zookeeper

相关推荐