问题背景
在大数据存储课设中,任务要求是要把生成的原始数据存储到Hbase中。首先将csv文件传至了HDFS,而下一步将传至Hbase却出现了一个问题,耗费了数小时寻找问题解决方法,最终将数据成功导入到了hbase,特此记录。
问题描述
hbase org.apache.hadoop.hbase.mapreduce.importTsv -Dimporttsv.separator=, -Dimporttsv.columns=Hbase_ROW_KEY,info:name,info:Admission_number,info:sex,info:birth,info:exam_year,info:now_school hbase-csv1 /user/pee.csv
(我刚开始使用的这个语句,无论是换简单的csv文件还是更新jar包还是修改配置,结果一直报下面这个错)
提示file does not exist
Exception in thread "maif”java.io. FilelotroundExcentiom:File does not exista hdfs: /master:8020/ usr/local/hbase-1.3.6/1ib/metric-core-2.2.0. jar
但是在虚拟机文件系统中却发现该文件存在!
似乎hdfs: /master:8020/ usr/local/hbase-1.3.6/1ib/metric-core-2.2.0. jar这个引导的地址有些诡异,其将hdfs和本地dir路径混为一谈。
于是搜索问题,找到了一个问答,
搜索过程
> https://www.saoniuhuo.com/question/detail-1925585.html
但它只有一个刚开始怎么也看不到的深奥回答。
于是又找到了csdn上的一个提问,hbase调用importTsv导入csv文件时报错File does not exist
问题是一致的,但没有回答,无奈继续寻找解决方法。
解决方法
综合https://www.saoniuhuo.com/question/detail-1925585.html的一个回答和https://www.cnblogs.com/sunspeedzy/p/7501899.html、importTsv-Hbase数据导入工具两篇博客,
将此前报错的语句替换为以下
HADOOP_CLASSPATH=`${Hbase_HOME}/bin/hbase classpath` $HADOOP_HOME/bin/yarn jar $Hbase_HOME/lib/hbase-server-1.3.6.jar importtsv -Dimporttsv.separator="," -Dimporttsv.columns=Hbase_ROW_KEY,info:name,info:Admission_number,info:sex,info:birth,info:exam_year,info:now_school,info:new_school hbase-csv1 /user/pee.csv
直接复制使用即可,实现hdfs中的csv文件导入habse。
问题解释可以大概从https://www.cnblogs.com/sunspeedzy/p/7501899.html这篇博客中了解。默认情况下,部署到MapReduce集群的MapReduce作业不能访问$Hbase_CONF_DIR下的Hbase配置文件或Hbase类,即报file not exist的错误。
最后再记录一下如何使用importtsv导入CSV数据到Hbase
第一种: step1:根据hdfs中的文件生成Hfile
-Dimporttsv.columns=Hbase_ROW_KEY,cf:a,cf:b -Dimporttsv.bulk.output=hdfs:///storefile tsvtab /hdfs2hbase/hdfs2hbase.tsv ``` 注: (1)tsv文件不能有文件头; (2)importtsv.columns=Hbase_ROW_KEY必须要指定列,且必须要有Hbase_ROW_KEY (3)Dimporttsv.bulk.output=hdfs:///storefile,hdfs上的storefile目录开始不能存在 step2:完成导入 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs:///storefile tsvtab 第二种: ```powershell HADOOP_CLASSPATH=`${Hbase_HOME}/bin/hbase classpath` $HADOOP_HOME/bin/yarn jar $Hbase_HOME/lib/hbase-server-1.3.1.jar importtsv -Dimporttsv.columns=Hbase_ROW_KEY,baseinfo:INTERNAL_KEY,baseinfo:TRAN_DATE,baseinfo:SOURCE_TYPE,baseinfo:TERMINAL_ID,baseinfo:BRANCH,baseinfo:OFFICER_ID,baseinfo:TRAN_TYPE,baseinfo:EFFECT_DATE,baseinfo:POST_DATE,baseinfo:REVERSAL_TRAN_TYPE,baseinfo:REVERSAL_DATE,baseinfo:STMT_DATE,baseinfo:TRAN_AMT,baseinfo:REFERENCE,baseinfo:PREVIOUS_BAL_AMT,baseinfo:ACTUAL_BAL_AMT,baseinfo:TFR_INTERNAL_KEY,baseinfo:TFR_SEQ_NO, dshuangfu:teacher1 /user/hac/input/2-1/dshuangfu_hbase_zhongyuan111.tsv ```
详见importTsv-Hbase数据导入工具