hbase数据导入导出工具使用

来源:互联网 发布:网络硬盘录像机连接图 编辑:程序博客网 时间:2024/05/16 00:24


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 表名  数据文件位置
其中数据文件位置为hdfs的路径,且须为完整的hdfs的路径,例如hdfs://nnip:9000/path
4 利用export从HBase中导出SequenceFile格式文件
./hbase org.apache.hadoop.hbase.mapreduce.Driver export 表名    数据文件位置
同上,其中数据文件位置也是hdfs的路径。
它的基本过程是针对每个region生成一个mapper任务,做scan操作,把scan结果写入到指定目录下,每个region生成一个结果文件,而不是只生成一个文件。

5 利用pigHBase中导出csv格式文件

hbase并没有提供直接导出为csv格式的数据,如果想从HBase中直接导出CSV格式的数据文件,可以利用pig或者java api来实现。
这里说明如何使用pig导出数据。
a 安装pig,这里不进行详细说明。
b 编写pig脚本 p.pig:
--如果pig能够找到hbase配置路径,则不需要下面的配置
set hbase.zookeeper.quorum 'zkip'
-- ‘hbase://t1’为数据源,‘f1:c1 f2:c2’为需要导出的列, '-loadKey true'说明需要将hbase的rowkey也导出到文件中。
x = LOAD 'hbase://t1' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('f1:c1 f1:c2','-loadKey true');
-- 将结果写入到hdfs的'pigres.csv'目录下,列之间的分隔符为','
STORE x INTO 'pigres.csv' USING PigStorage(',');
c 在pig的bin目录下,运行 。/pig p.pig
 


参考:
[1] http://blog.csdn.net/samhacker/article/details/21282243
[2] http://blog.csdn.net/zreodown/article/details/8174959  (此blog说导入导出可以利用本地文件路径,应该前提是利用本地文件系统作为hadoop的文件系统,如果利用的hdfs作为底层存储系统,则只能利用hdfs的路径)
[3] http://blog.csdn.net/samhacker/article/details/21321045
[4] http://blog.csdn.net/macyang/article/details/8522677

0 0
原创粉丝点击