29.使用BulkLoad批量导入数据到HBase中

0.参考文章

http://blog.cheyo.net/99.html

http://www.echojb.com/weblogic/2017/04/25/362621.html

1.ImportTsv

  • 在HDFS创建临时目录
hdfs dfs -mkdir /tmp/bulkload
  • 创建本地文件user
10000001,Sam,18
10000002,Jack,24
10000003,Kitty,25
  • 上传到HDFS上
hdfs dfs -put user /tmp/bulkload/
  • HBase上创建表
hbase shell
>create 'user','info'
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上的目录
<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会出错。

2.CompleteBulkLoad

方法1:

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

方法2:

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

3.检查最终结果

hbase shell
>scan 'user'

4.我的脚本

sudo hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.bulk.output=hfile_test \
-Dimporttsv.columns=HBASE_ROW_KEY,info: \
g37:weekly_20170918 /home/workspace/kukulcan/20170925.txt
sudo hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://neophdfs/user/sparkuser/hfile_test g37:weekly_20170918

5.总的处理流程

-Dimporttsv.separator="@#@" \

# 生成周报结果文件part-10000

# 合并到本地文件
sudo hdfs dfs -getmerge /home/workspace/kukulcan/src/g37/weekly/date=20170925  /data2/20170925.txt

# 将合并后的文件上传到hadoop中
hdfs dfs -put -f /data2/20170925.txt /home/workspace/kukulcan/

# 创建表
hbase shell
create 'g37:weekly_20170925','info'

# ImportTsv生成Hfile文件
sudo hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.bulk.output=hfile_test \
-Dimporttsv.columns=HBASE_ROW_KEY,info: \
g37:weekly_20170925 /home/workspace/kukulcan/20170925.txt

# 写入habse
sudo hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://neophdfs/user/sparkuser/hfile_test g37:weekly_20170925

# 查看结果
hbase shell
scan 'g37:weekly_20170925'

# 删除hadoop上的part-10000个小文件
hdfs dfs -rm -r /home/workspace/kukulcan/src/g37/weekly/date=20170925

# 替换分隔符
:%s/@#@/\t/g 

  

 

posted @ 2017-10-09 15:07  桃源仙居  阅读(220)  评论(0)    收藏  举报