使用BulkLoad批量导入数据到HBase中 2015-05-31 21:00

说明

BulkLoad将数据批量导入HBase中。支持通过命令行和API两种操作方式。

命令行包含如下两个步骤:

  1. ImportTsv
  2. CompleteBulkLoad

准备工作

  • 在HDFS创建临时目录
hdfs dfs -mkdir /tmp/bulkload
  • 创建本地文件user
[root@ctrl ~]# cat user
10000001,Sam,18
10000002,Jack,24
10000003,Kitty,25
[root@ctrl ~]#
  • 上传到HDFS上
hdfs dfs -put user /tmp/bulkload/
  • HBase上创建表
hbase shell
>create 'user','info'

ImportTsv

export HBASE_HOME=/opt/hbase
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath`
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-0.98.11-hadoop2.jar importtsv \
    -Dimporttsv.separator=, \
    -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age \
    -Dimporttsv.bulk.output=hdfs://myns1/tmp/bulkload/outputdir \
    user hdfs://myns1/tmp/bulkload/user

经验

  • 错误信息
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        ……
        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: java.lang.IllegalArgumentException: Wrong FS: hdfs://tmp/core/partitions_b0daea82-fbea-4bf2-b752-689d9249895c, expected: hdfs://myns1
        at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:643)
        at org.apache.hadoop.fs.FileSystem.makeQualified(FileSystem.java:463)
        ……
        at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:72)
        at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:145)
        at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:153)
        ... 10 more
  • 原因分析

如果出现这种错误,是因为HDFS中配置的临时目录在本地文件系统上,而此时要求是在HFS上。解决办法是将core-site.xml中的临时文件目录改为HDFS上的目录:

1
2
3
4
5
<property>
    <name>hadoop.tmp.dir</name>
    <value>/tmp/core</value>
    <description>Abase for other temporary directories.</description>
</property>

本地目录是:file:///abc/def,HDFS目录是: /abc/def,不能配置成hdfs://xxx/abc/def,否则运行MR会出错。

CompleteBulkLoad

方法一

export HBASE_HOME=/opt/hbase
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath`
${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/lib/hbase-server-0.98.11-hadoop2.jar completebulkload hdfs://myns1/tmp/bulkload/outputdir user

方法二

bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://myns1/tmp/bulkload/outputdir user

检查最终结果

hbase shell
>scan 'user'

参考文档

  1. 官方文档
  2. 使用importtsv命令加载数据
  3. 用ImportTsv和Completebulkload导入数据到HBase中
Tags: #HBase    Post on Hadoop