本帖最后由 pqm1989 于 2013-3-15 09:00 编辑
hbase提供了现成的程序将hdfs上的文件导入hbase,即bulk-load方式。它包括两个步骤(也可以一次完成):
第一部分:
程序环境:hadoop版本1.0.3,hbase版本0.94.1
程序使用中注意:
1 因为是执行hadoop程序,不会自动查找hbase的config路径,也就找不到hbase的环境变量。因此需要将hbase-site.xml加入到hadoop-conf变量中 (我们直接把hbase-site.xml 复制到hadoop的conf目录下)
2 把$HBASE_HOME/lib下的hbase-0.92.1.jar,zookeeper-3.4.3.jar,guava-r09.jar,protobuf-java-2.4.0a.jar(网上很多是对于老版本的hadoop,故没有protobuf这个包)复制到$HADOOP_HOME/lib下
3.配置$HADOOP_HOME下的conf/core-site.xml,加入如下信息
hbase.zookeeper.quorum
secmaster
4.重启hbase和hadoop
第二部分:
1 将文件包装成hfile,hadoop jar /path/to/hbase.jar importtsv -Dimporttsv.columns=a,b,c
比如:
1.hadoop jar ~/hbase/hbase-0.90.2.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,f1 t8 test
hadoop jar ~/hbase/hbase-0.90.2.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,f1 t8 test
将会启动mapreduce程序在hdfs上生成t8这张表,它的rowkey分别为1 3 5 7,对应的value为2 4 6 8
注意,源文件默认以"\t"为分割符,如果需要换成其它分割符,在执行时加上-Dimporttsv.separator=",",则变成了以","分割
2 在上一步中,如果设置了输出目录,如
Java代码
1.hadoop jar ~/hbase/hbase-0.90.2.jar importtsv -Dimporttsv.bulk.output=tmp -Dimporttsv.columns=HBASE_ROW_KEY,f1 t8 test
hadoop jar ~/hbase/hbase-0.90.2.jar importtsv -Dimporttsv.bulk.output=tmp -Dimporttsv.columns=HBASE_ROW_KEY,f1 t8 test
那么t8表还暂时不会生成,只是将hfile输出到tmp文件夹下,我们可以查看tmp:
1.hadoop dfs -du tmp
2.Found 3 items
3.0 hdfs://namenode:9000/user/test/tmp/_SUCCESS
4.65254 hdfs://namenode:9000/user/test/tmp/_logs
5.462 hdfs://namenode:9000/user/test/tmp/f1
hadoop dfs -du tmp
Found 3 items
0 hdfs://namenode:9000/user/test/tmp/_SUCCESS
65254 hdfs://namenode:9000/user/test/tmp/_logs
462 hdfs://namenode:9000/user/test/tmp/f1
然后执行hadoop jar hbase-VERSION.jar completebulkload /user/todd/myoutput mytable将这个输出目录中的hfile转移到对应的region中,这一步因为只是mv,所以相当快。如:
hadoop jar ~/hbase/hbase-0.90.2.jar completebulkload tmp t8
然后
1.hadoop dfs -du /hbase/t8/c408963c084d328490cc2f809ade9428
2. Found 4 items
3. 124 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.oldlogs
4. 692 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.regioninfo
5. 0 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.tmp
6. 462 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/f1
hadoop dfs -du /hbase/t8/c408963c084d328490cc2f809ade9428
Found 4 items
124 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.oldlogs
692 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.regioninfo
0 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/.tmp
462 hdfs://namenode:9000/hbase/t8/c408963c084d328490cc2f809ade9428/f1
此时己经生成了表t8
注意,如果数据特别大,而表中原来就有region,那么会执行切分工作,查找数据对应的region并装载