Sqoop将非大数据集群(关系型数据库mysql、oracle等)RDBMS向大数据集群(HDFS、Hive、HBase)传输数据,称为import;反之称为export。
其中RDBMS -> HBase是单向过程。
一、导入数据操作import
1. RDBMS到HDFS
(1)数据全部import
(2)查询导入(--table 表名 \要去掉)
(3)导入指定列(columns 列1,列2,列3...)
(4)使用sqoop关键字筛选查询导入数据(where 'condition')
2. RDBMS到Hive
3. RDBMS到HBase
(1)单属性rowkey
(2)多属性rowkey(--split-by "连接符"连接rowkey)
二、导出数据操作export
(1)Hive -> RDBMS
(2)HDFS -> RDBMS
首先在mysql中随便创建一个表company.staff
$ mysql -uroot -p000000
mysql> create database company;
mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
mysql> insert into company.staff(name, sex) values('Thomas', 'Male');
mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
两个注意点:--必须有,换行符\前需要有空格
将mysql数据库中的company库里的staff表,导入HDFS目标目录/sqoop/company,
--delete-target-dir指目标目录若有则删除,依情况判断是否加这句,
指定mapper数为1,分隔符Tab
数据在HDFS中显示如下:
download一下part-m-00000,打开显示如下,Tab键分隔
在全部数据导入的基础上,加上sql查询语句,导入查询筛选后的数据
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'
需要注意的是在sql的where条件中必须包含$CONDITIONS
若query为双引号,$前需要加转义字符\,避免shell识别为变量引用
★ 因为--query里已经有表staff了,所以--table staff \要删掉,否则会报错。
import后的文件如下
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex
结果如下
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--target-dir /sqoop/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--where 'id=2'
结果如下
分为两步:第一步将mysql数据导入HDFS,第二步将导入HDFS中的数据迁移到Hive中
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive
在hive中查询数据表staff_hive
hive (default)> select * from staff_hive;
OK
staff_hive.id staff_hive.name staff_hive.sex
1 Kevin Male
2 John Male
发现mysql中的数据表已经导入hive的default库中。
首先开启HDFS、Yarn、Zookeeper、HBase
HBase1.0.1之前的版本会自动创建HBase表,之后的版本在sqoop导入数据前需要自己创建target表。
创建HBase表
hbase(main):002:0> create 'habse_staff','info'
导入数据,将id作为rowkey
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_staff" \
--num-mappers 1
查询结果表
hbase(main):010:0> scan "hbase_staff"
ROW COLUMN+CELL
1 column=info:name, timestamp=1551237977664, value=Kevin
1 column=info:sex, timestamp=1551237977664, value=Male
2 column=info:name, timestamp=1551237977664, value=John
2 column=info:sex, timestamp=1551237977664, value=Male
创建HBase表
hbase(main):012:0> create 'hbase_staff2','info'
导入数据,id和name作为rowkey,需要用--split-by "_"连接两个rowkey字段
bin/sqoop import \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id","name" \
--hbase-table "hbase_staff2" \
--num-mappers 1 \
--split-by "_"
查询结果
hbase(main):018:0> scan "hbase_staff2"
ROW COLUMN+CELL
1_Kevin column=info:sex, timestamp=1551238405368, value=Male
2_John column=info:sex, timestamp=1551238405368, value=Male
2 row(s) in 0.0320 seconds
row-key为id_name的模式
从大数据集群(HDFS、Hive)向非大数据集群(RDBMS)传输数据,为export,日常工作中用的很少。
HBase中数据无法导入RDBMS,对于HBase只能单向import。
Hive的数据包括两部分:
元数据Meta Store存放在mysql数据库中,
结构化数据存储在HDFS中,默认路径/user/hive/warehouse
所以,将hive中数据表export到mysql中,路径是HDFS的/user/hive/warehouse,export命令如下
1. 首先在mysql中创建表hive_staff
mysql> create table company.hive_staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));
Query OK, 0 rows affected (0.02 sec)
2. 然后export
bin/sqoop export \
--connect jdbc:mysql://hadoop100:3306/company \
--username root \
--password 000000 \
--table hive_staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"
3. 结果查询
mysql> select * from hive_staff;
+----+-------+------+
| id | name | sex |
+----+-------+------+
| 1 | Kevin | Male |
| 2 | John | Male |
+----+-------+------+
与hive的方式一致,唯一区别是表的路径是HDFS自定义路径。