29.使用BulkLoad批量导入数据到HBase中
0.参考文章
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
    http://www.cnblogs.com/makexu/

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号