Fork me on GitHub

HBase 与 Sqoop 的集成

Sqoop supports additional import targets beyond HDFS and Hive. Sqoop can also import records into a table in HBase.
之前我们已经学习过如何使用 Sqoop 在 Hadoop 集群和关系型数据库中进行数据的导入导出 工作,接下来我们学习一下利用 Sqoop 在 HBase 和 RDBMS 中进行数据的转储。

案例

目标:将 RDBMS 中的数据抽取到 HBase 中

1).配置 sqoop-env.sh,添加如下内容:
export HBASE_HOME=/opt/module/hbase-1.3.1

(2-1) 在 Mysql 中新建一个数据库 db_library,一张表 book

1
2
3
4
5
6
$ mysql -uroot -proot
mysql> create database db_library;
mysql> CREATE TABLE db_library.book(
id int(4) PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price VARCHAR(255) NOT NULL);

(2-2) 向表中插入一些数据

1
2
3
4
mysql> use db_library;
INSERT INTO db_library.book (name, price) VALUES('Lie Sporting', '30');
INSERT INTO db_library.book (name, price) VALUES('Pride & Prejudice', '70');
INSERT INTO db_library.book (name, price) VALUES('Fall of Giants', '50');

(3) 执行 Sqoop 导入数据的操作

1
2
3
4
5
6
7
8
9
10
11
12
[liucw@hadoop102 sqoop-1.4.6.bin__hadoop-2.0.4-alpha]$ bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/db_library \
--username root \
--password root \
--table book \
--columns "id,name,price" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_book" \
--num-mappers 1 \
--split-by id

1
2
3
4
5
6
7
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V
at org.apache.sqoop.mapreduce.HBaseImportJob.jobSetup(HBaseImportJob.java:222)
尖叫提示:sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自动创建 HBase 表的功能
解决方案:手动创建 HBase 表
hbase> create 'hbase_book','info'

(4) 在 HBase 中 scan 这张表得到如下内容

1
2
3
4
5
6
7
8
9
hbase> scan ‘hbase_book’
hbase(main):003:0> scan 'hbase_book'
ROW COLUMN+CELL
1 column=info:name, timestamp=1539422269162, value=Lie Sporting
1 column=info:price, timestamp=1539422269162, value=30
2 column=info:name, timestamp=1539422269162, value=Pride & Prejudice
2 column=info:price, timestamp=1539422269162, value=70
3 column=info:name, timestamp=1539422269162, value=Fall of Giants
3 column=info:price, timestamp=1539422269162, value=50

思考:尝试使用复合键作为导入数据时的 rowkey。

-----------------本文结束,感谢您的阅读-----------------