sqoop介绍及数据迁移
一、Sqoop简介
- Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具
- 将数据从RDBMS(关系型数据库管理系统)导入到HDFS
HDFS、Hive、HBase - 从HDFS导出数据到RDBMS
- 使用MapReduce导入和导出数据,提供并行操作和容错
- 目标用户
- 系统管理员、数据库管理员
- 大数据分析师、大数据开发工程师等
二、从RDB(关系型数据库)导入数据到HDFS
2.1 基本语法
sqoop import
--connect jdbc:mysql://主机名:3306/hive //配置数据库连接为Mysql中的数据库
--driver com.mysql.jdbc.Driver \
--table user \ //指定表
--username root \
--password hadoop \
--target-dir /data/user \ //指定导入的目录
--m 3 //Mapper的数量
- sqoop-import是sqoop import的别名
2.2 通过Where语句过滤导入表
sqoop import \
--connect jdbc:mysql://主机名:3306/SQL库名 \
--table 表名 \
--where "order_date > '2015-10-10'" \ //指定条件
--username root \
--password hadoop \
--delete-target-dir \ //如果目标目录存在则删除,本质是删除再创建
--target-dir /data/orders \
--m 3
2.3 通过COLUMNS过滤导入表
sqoop import \
--connect jdbc:mysql://主机名:3306/SQL库名 \
--table 表名 \
--columns "host,name,age" \ //导入指定列
--username root \
--password hadoop \
--delete-target-dir \
--target-dir /data/user \
--m 3
2.4 使用query方式导入数据
sqoop import \
--connect jdbc:mysql://主机名:3306/SQL库名 \
--query "select * from 表名 where host != '127.0.0.1' and \$CONDITIONS" \ //所有查询都要以 \$CONDITIONS结束
--username root \
--password hadoop \
--split-by host \ //指定用于分割数据的列名为host(注:query条件必须有split-by)
--delete-target-dir \
--target-dir /data/user \
--m 3
2.5 使用Sqoop增量导入数据
使用Sqoop增量导入数据
Incremental指定增量导入的模式
append:追加数据记录
lastmodified:可追加更新的数据
sqoop import \
--connect jdbc:mysql://主机名:3306/SQL库名 \
--table 表名 \
--username root \
--password hadoop \
--incremental append \ //增量导入方式为append追加数据到已经存在的hdfs数据集
--check-column order_date \ //指定递增的列
--last-value '2015-10-10' \ //指定上一次导入的最大值
--target-dir /data/orders \
--m 3
案例:
首次导入数据
--connect jdbc:mysql://hadoop001/students \
--table student \
--where 'sid<=10' \
--username root \
--P \
--target-dir /data/stu \
--m 2
再次增量导入
sqoop import \
--connect jdbc:mysql://hadoop001/students \
--table student \
--where 'sid>10' \
--username root \
--P \
--check-column sid \
--incremental append \
--last-value '10' \
--target-dir /data/stu \
--m 2
三、导入文件格式
- 导入时指定文件格式参数(注:开头都是两杠)
–as-textfile | 导入数据为text文件(默认) |
---|---|
–as-avrodatafile | 导入数据为avro文件 |
–as-sequencefile | 导入数据为sequence文件 |
–as-parquetfile | 导入数据为parquet文件 |
sqoop import \
--connect jdbc:mysql://主机名:3306/hive \
--table orders \
--username root \
--password hadoop \
--delete-target-dir \
--target-dir /data/orders \
--m 3 \
--as-sequencefile
四、从RDB导入数据到Hive
4.1 直接导入数据到Hive
–create-hive-table :自动创建表,生产中一般不使用
–hive-overwrite :覆盖原有表数据
sqoop import \
--connect jdbc:mysql://主机名:3306/hive \
--table orders \
--username root \
--password hadoop \
--hive-import \ //通过hive-import指定导入的hive
--create-hive-table \ //指定创建一个新的hive表,如果表已经存在则报错
--hive-database retail_db \ //指定hive中的库
--hive-table orders \ //指定表
--m 3 \
--as-parquetfile
案例:
sqoop import \
--connect jdbc:mysql://hadoop001:3306/students \
--table student \
--username root \
--password ok \
--hive-import \
--hive-database sqooptest \
--hive-table student \
--hive-overwrite \
--m 1
4.2 导入数据到Hive分区
sqoop import \
--connect jdbc:mysql://主机名:3306/hive \
--query "select order_id, order_status from orders where order_date >= '2014-07-24' and order_date < '2014-07-25' and \$CONDITIONS" \
--username root \
--password hadoop \
--target-dir /user/data/orders \
--split-by order_status \
--hive-import \
--hive-table eShop.orders \
--hive-partition-key "order_date" \ //指定分区字段
--hive-partition-value "20140724" \ //指定分区值
--m 3
案例:
导入数据到分区
sqoop import \
--connect jdbc:mysql://hadoop001:3306/students \
--table orders \
--where "order_date between '2013-07-24' and '2013-07-25'" and \$CONDITIONS\
--username root \
--password ok \
--hive-import \
--hive-database sqooptest \
--hive-table orders_p \
--hive-partition-key 'date' \
--hive-partition-value '20200724' \
--hive-overwrite \
--m 1
分区内追加
sqoop import \
--connect jdbc:mysql://hadoop001:3306/students \
--query "select * from orders where order_date='2013-07-25' and \$CONDITIONS" \
--username root \
--password ok \
--incremental append \
--hive-import \
--hive-database sqooptest \
--hive-table orders_p \
--hive-partition-key 'date' \
--hive-partition-value '20200724' \
--check-column order_id \
--target-dir /data/order \
--m 1
五、从RDB导入数据到HBase
sqoop import
--connect jdbc:mysql://主机名:3306/retail_db \
--username root \
--password hadoop \
--table products \
--columns "customernum, customername" \
--hbase-table customercontactinfo \ //指定导入HBase的表
--column-family CustomerName \ //指定列簇
--hbase-row-key customernum \ //指定行键
-m 1
案例:
sqoop import \
--connect jdbc:mysql://hadoop001:3306/students \
--username root \
--password ok \
--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
- 在MySQL中创建表
- 导出数据到MySQL
sqoop export \
--connect jdbc:mysql://主机名:3306/sqoop \
--username root \
--password hadoop \
--table emp_demo \
--export-dir /data/sqoop/emp \
-m 1
案例:
sqoop export \
--connect jdbc:mysql://hadoop001:3306/students \
--username root \
--password ok \
--table stu \
--export-dir /data/stu \
--input-fields-terminated-by ',' \
--m 1