安装sqoop文档见之前的Sqoop数据迁移安装详细教程
准备工作
一、MySQL -》HDFS
需要导入两个jar包
cp /data/java-json.jar /opt/soft/sqoop-1.4.6-cdh5.14.2/lib/
- 使用where过滤
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--where "order_id<100" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/retail_db/orders \
--m 3
- 使用columns过滤
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table customers \
--columns "customer_id,customer_fname,customer_lname" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/retail_db/customers \
--m 3
- 使用查询语句进行过滤
必须要加split-by 列名
和\$CONDITIONS
\表示转义字符
sqoop import \
--connect jdbc:mysql://localhost:3306/hr \
//所有查询都应该以\$CONDITIONS结束;sqoop内部使用该条件将记录范围分发给所有Mapper
--query “select * from user where host != '127.0.0.1' and \$CONDITIONS” \
--username root \
--password hadoop \
//指定用于分割数据的列为host
--split-by host \
--delete-target-dir \
--target-dir /data/user \
--m 3
- 增量导入
检查列
append
:支持动态的增加,不支持修改
astmodefied
:支持修改,也支持增加
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
//增量导入方式为append追加数据至已经存在的HDFS数据集
--incremental append \
//指定递增的列
--check-column order_date \
//指定上一次导入的最大值
--last-value '2013-07-24 00:00:00'
--target-dir /data/retail_db/orders \
--m 3
创建job
sqoop job --create mysql2hdfs \
-- import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--incremental append \
--check-column order_date \
--last-value '0' \
--target-dir /data/retail_db/orders \
--m 3
【注意】每次job执行成功之后都会修改 --last-value 值 将最后一次的最大值填充进去
这里的 ‘0’ 没有实际含义,只是为了保证第一次数据导入时值最小
查看job
sqoop job --list
执行job
sqoop job --exec mysql2hdfs
删除job
sqoop job --delete myjob
每天早上2点可以定时执行
crontab -e
* 2 */1 * * sqoop job --exec mysql2hdfs
二、导入数据到Hive中
准备工作
导包
cp /opt/soft/hive110/lib/hive-common-1.1.0-cdh5.14.2.jar /opt/soft/sqoop146/lib/
cp /opt/soft/hive110/lib/hive-shims* /opt/soft/sqoop146/lib/
2.1 直接导入数据到Hive
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
//通过hive-import指定导入到Hive
--hive-import \
//指定创建一个新的hive表,如果表已经存在则报错
--create-hive-table \
--hive-database retail_db \
--hive-table orders \
--m 3
2.2 导入数据到Hive分区
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--query "select order_id,order_status from orders where order_date>='2013-11-03' and order_date <'2013-11-04' and \$CONDITIONS" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/retail_db/orders \
--split-by order_id \
--hive-import \
--hive-database retail_db \
--hive-table orders \
//指定分区字段和分区值
--hive-partition-key "order_date" \
--hive-partition-value "2013-11-03" \
--m 3
注意:分区字段不能当成普通字段导入表中
三、导入数据到HBase中
3.1 在HBase中建表
需要在HBase中创建表
- 方式一: 加row-key,row-key需要和mysql中的字段对应
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--username root
--password ok \
--table products \
//Mysql中的字段
--columns "customernum, customername" \
--hbase-table customercontactinfo \
//hbase中的列族名
--column-family CustomerName \
//rowkey和
--hbase-row-key customernum \
--m 1
- 方式二:不写row-key,自动对应mysql中的第一个字段
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--username root \
--password root \
--table products \
--hbase-table products \
--column-family data \
--m 3
四、使用sqoop export导出数据到MySQL
需要在Mysql中需要有emp_demo表
sqoop export
--connect jdbc:mysql://localhost:3306/sqoop
--username root
--password hadoop
--table emp_demo
--export-dir /data/sqoop/emp
-m 1
五、编写sqoop 脚本
5.1 编写脚本 job_RDBMS2HDFS.opt
import
--connect
jdbc:mysql://localhost:3306/retail_db
--driver
com.mysql.jdbc.Driver
--table
customers
--username
root
--password
root
--target-dir
/data/retail_db/customers
--delete-target-dir
--m
3
5.2 执行脚本
sqoop --options-file job_RDBMS2HDFS.opt
六、防止在执行sqoop job的时候手动输入密码
#echo -n 表示不换行输入
echo -n "ok" > sqoopPWD.pwd
hdfs dfs -mkdir -p /sqoop/pwd
hdfs dfs -put sqoopPWD.pwd /sqoop/pwd/
hdfs dfs -chmod 400 /sqoop/pwd/sqoopPWD.pwd
下次执行job就可以不用输入密码了