Sqoop简介
Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具,数据导入是指从关系型数据库到Hadoop平台,导出是指从Hadoop 平台到关系型数据库,其本质是将导入、导出命令翻译成MapReduce程序并行执行,最常见的业务场景是数据仓库中数据导入。
从RDB导入数据到HDFS
- 导入表到HDFS
sqoop import
--connect jdbc:mysql://localhost:3306/database
--driver com.mysql.jdbc.Driver
--table table_name
--columns "col1,...,coln"
--where "condition"
--username root
--password root
--delete-target-dir
--target-dir /hdfs_path
--m 3
sqoop import也可写成sqoop-import,sqoop命令位于sqoop/bin目录下
connect配置数据库的url
driver配置数据库驱动
table配置要导入的表名
column用于指定要导入的列名
where用于条件过滤
username代数据库用户名
password配置数据库连接密码
delete-target-dir目标目录存在,则删除
target-dir配置要导入到的hdfs地址,该地址不能存在,否则报错
# 建表语句
CREATE TABLE student(
sid INT AUTO_INCREMENT PRIMARY KEY,
sname VARCHAR(10),
age INT DEFAULT 20,
gender VARCHAR(10) DEFAULT 'male'
);
INSERT INTO student(sname) VALUES('n1'),('n2'),('n3'),('n4'),('n5'),('n6'),('n7'),('n8'),('n9'),('n10'),('n11'),('n12'),('n13'),('n14'),('n15'),('n16'),('n17'),('n18'),('n19');
# 示例:将student表导入到hdfs的/data/stu3
# 以下代码在linux命令行中,\为换行符,每个\前有个空格
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--driver com.mysql.jdbc.Driver \
--table student \
--column "sname"
--where "sid between 1 and 10" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/stu3 \
--m 3
hdfs查看
- 使用query的方式导入数据
sqoop import
--connect jdbc:mysql://localhost:3306/student
--query "select * from student where sid between 1 and 10 and \$CONDITIONS "
--username root
--password root
split-by sid
--delete-target-dir
--target-dir /hdfs_path
--m 3
query代表查询的语句,其中所有查询都应该以$CONDITIONS结束;sqoop内部使用该条件将记录范围分发给所有Mapper
split-by sid:用于指定分割数据的列,split会通过select max(id),min(id) from test查询出最大id和最小id,根据–m 的分区数,比如m为4,有100条数据,就把max、min之间的区间平均分为4份,0~ 25,26~50,51 ~75,76 ~100。没有指定–split-by时,会根据主键划分;没有主键又没有–split-by时,任务就不能并行的运行,此时必须指定-m 1或者–autoreset-to-one-mapper只运行一个map任务
# 示例:将student表的sid在11~20之间的sid,sname,age导入到hdfs的/data/stu4
# split-by对非数字类型的字段支持不好,一般用于主键及数字类型的字段
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--query "select sid,sname,age from student where sid between 11 and 20 and \$CONDITIONS" \
--username root \
--password root \
-- split-by sid \
--delete-target-dir \
--target-dir /data/stu \
--m 3
- 增量导入
sqoop import
--connect jdbc:mysql://localhost:3306/database
--driver com.mysql.jdbc.Driver
--table table_name
--username root
--password root
--delete-target-dir
--incremental append
--check-column column_name
--last-value 'value'
--target-dir /hdfs_path
--m 3
incremental append:增量导入方式为append,追加数据至已经存在的HDFS数据集
check-column:指定递增的列,一般为主键
last-value:指定上次导入的最大值,本次导入会从上次最大值+1的位置开始
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--table student \
--where "sid>10" \
--username root \
--password root \
--incremental append \
--check-column sid \
--last-value 10 \
--target-dir "/data/stu" \
--m 2
从RDB导入数据到Hive
- 直接导入数据到Hive
sqoop import
--connect jdbc:mysql://localhost:3306/database
--driver com.mysql.jdbc.Driver
--table table_name
--username root
--password root
hive-import
create-hive-table
hive-database database_name
--hive-table table_name
--m 3
hive-import:通过hive-import指定导入到Hive
create-hive-table:指定创建一个新的hive表,如果表已经存在则报错
hive-database :指定数据库名称,需要存在,否则报错
hive-table:指定表名,需要不存在,否则报错
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--table student \
--username root \
--password root \
--hive-import \
--create-hive-table \
--hive-database sqooptest \
--hive-table stu2 \
--m 1
- 导入数据到Hive分区
需要导入jar包,将hive-common、hive-exec两个jar包,从hive的lib目录中复制到sqoop的lib目录:
示例1:
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root \
--password root \
--table orders \
--where "order_date between '2013-07-24' and '2013-07-25'" \
--hive-import \
--hive-table sqooptest.order_p \
--split-by order_status \
--hive-partition-key "date" \
--hive-partition-value "20200724" \
--hive-overwrite \
--m 1
示例2:
#建表
create table products(
product_id int,
product_category_id int,
product_name string,
product_description string,
product_price double,
product_image string)
partitioned by(category int);
row format delimited
fields terminated by ',';
# 导入数据
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root \
--password root \
--query "select * from products where product_id between 1 and 200 and \$CONDITIONS" \
--hive-import \
--hive-table sqooptest.products \
--hive-partition-key "category" \
--hive-partition-value 2 \
--hive-overwrite \
--target-dir /data/products \
--m 1
# 追加
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root
--password root
--query "select * from products where product_id between 201 and 400 and \$CONDITIONS" \
--incremental append
--hive-import
--hive-table sqooptest.products
--hive-partition-key "category"
--hive-partition-value 3
--check-column product_id
--target-dir /data/products
--m 1
从RDB导入到Hbase
sqoop import
--connect jdbc:mysql://localhost:3306/database
--driver com.mysql.jdbc.Driver
--username root
--password root
--table table_name
--column "colu1,...,colun"
--hbase-create-table
--hbase-table table_name
--column-family
--hbase-row-key
--m 1
hbase-create-table:指定新建表
hbase-table:指定表名,不能存在
column-family:指定列簇名
hbase-row-key:指定行键名
/opt/sqoop/bin/sqoop-import \
--connect jdbc:mysql://hadoop4:3306/student \
--username root \
--password root \
--table products \
--columns "product_id,product_name,product_price" \
--hbase-create-table \
--hbase-table product \
--column-family prod \
--hbase-row-key product_id \
--m 1
HDFS数据导出到MySQL
- 使用sqoop export导出数据到MySQL
sqoop export
--connect jdbc:mysql://hadoop4:3306/database_name
--username root
--password root
--table table_name
--export-dir hdfs_path
--m 1
/opt/sqoop/bin/sqoop export \
--connect jdbc:mysql://hadoop4:3306/sqoop \
--username root \
--password root \
--table orders \
--export-dir /data/stu2/ \
--input-fields-terminated-by ',' \
--m 1
input-fields-terminated-by用于指定字段分割符