hbase除了直接调用put接口将数据进行导入导出外,还提供了命令行工具来直接将特定格式的数据进行导入(或以特定格式将数据导出),
主要是利用org.apache.hadoop.hbase.mapreduce这个包里的接口:importTsv, completebulkload,import,export,
可以执行bin/hbase org.apache.hadoop.hbase.mapreduce.Driver
bin/hbase org.apache.hadoop.hbase.mapreduce.importTsv 等命令查看详细说明。
./hbase org.apache.hadoop.hbase.mapreduce.Driver也可以实现hbase两个表之间的数据互导。
前提:看上面包名即知道,这些方法主要是利用的MR来进行数据导入导出的,因此首先将集群的MR开启。
1 利用ImportTsv将csv格式文本导入hbase表中:
步骤:
a 先在hbase上生成表,如:create 't1','f1'
b 将csv数据上传到hdfs上,数据内容如下:
a,1a,,3a,4a
b,,2b,3b,4b
,1c,2c,3c,4c
c 利用如下命令进行导入:
./hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,f1:a,f1:b,f1:c,f1:d t1 hdfs://nnip:9000/f1
如果MR程序正确完成,表示导入成功,否则查看打印出的错误,找出原因。
d 利用hbase的shell来查看数据:
hbase(main):002:0> scan 't1'
ROW COLUMN+CELL
column=f1:a, timestamp=1399429400879, value=1c
column=f1:b, timestamp=1399429400879, value=2c
column=f1:c, timestamp=1399429400879, value=3c
column=f1:d, timestamp=1399429400879, value=4c
a column=f1:a, timestamp=1399429400879, value=1a
a column=f1:b, timestamp=1399429400879, value=
a column=f1:c, timestamp=1399429400879, value=3a
a column=f1:d, timestamp=1399429400879, value=4a
b column=f1:a, timestamp=1399429400879, value=
b column=f1:b, timestamp=1399429400879, value=2b
b column=f1:c, timestamp=1399429400879, value=3b
b column=f1:d, timestamp=1399429400879, value=4b
可以看到,数据中即使为空的列,也被写入了hbase中,这是hbase默认的加载策略,如果对数据要求某一列不能为空有
2 利用completebulkload将csv格式文本导入hbase表中:
a 利用 ImportTsv在hdfs上生成hfile格式文件
./hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,f1:a,f1:b,f1:c,f1:d -Dimporttsv.bulk.output=hdfs://nnip:9000/out1 t1 hdfs://nnip:9000/f1
或者利用hadoop的命令进行:
$HADOOP_HOME/bin/hadoop jar $HBASE_HOME/hbase-0.94.8.jar importtsv \
-Dimporttsv.bulk.output=hdfs://nnip:9000/out1 \ # 输出hfile到t1,注意,out1必须不存在
-Dimporttsv.separator="," \ #指定输入文件的分隔符为, (默认为tab)
-Dimporttsv.columns=HBASE_ROW_KEY,t:c1,t:c2 \ #源文件的第一列为rowkey,第二列为t:c1,第三列为t:c2
table1 \ #hbase表名
hdfs://nnip:9000/b1 #源数据文件
黑体标出了要将生成的hfile的存放目录(此目录必须是不存在的)。
此命令生成hfile的同时,也会在hbase上生成表t1(如果不存在的话),此时表是空的。
b 将hfile挂载到表t1上:
./hadoop jar lib/hbase-*.jar completebulkload out1 t1
注意:执行该命令时,hadoop很可能会找不到相关的hbase依赖包,出现ClassNotFoundException的异常。一个简单的解决方法是将hbase相关的jar包都放到${HADOOP_HOME}/lib下面,这样hadoop就能在运行前加载相关的hbase jar files。
运行该命令的本质是一个hdfs的mv操作,并不会启动MapReduce。
执行完后,表t1里面就有了新导入的数据。
方法1和方法2的区别在于,方法1是在MR中调用hbase的api接口进行put数据,而方法2则是完全绕过hbase的过程,利用MR直接生成hfile文件,再挂载到hbase的对应表中。
3 利用import将SequenceFile格式文件导入HBase:./hbase org.apache.hadoop.hbase.mapreduce.Driver import 表名5 利用pig从HBase中导出csv格式文件:
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。