一:导入数据
导入:RDBMS ==> Hadoop
[hadoop@hadoop001 bin]$ pwd
/home/hadoop/app/sqoop-1.4.6-cdh5.7.0/bin
[hadoop@hadoop001 bin]$ sqoop help
import Import a table from a database to HDFS
[hadoop@hadoop001 bin]$ sqoop help import
操作:
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir 这个是为了删除名字的jar包
在这个执行过程中,出现错误,是因为没有java-json.jar 架包
下载网址:http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm
将它导入lib下面即可
导入语句:
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--mapreduce-job-name FromMySQLToHDFS \
-m 1 \ 默认是4,这里更改为1
--delete-target-dir \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \ 导入列
--target-dir EMP_COLUMN_WHERE \ 导到哪里去 目录
--fields-terminated-by '\t' \ 更改分隔符
--null-non-string '0' \ 非字符窜类型更改为0
--null-string '' \
--where 'SAL>2000' 筛选
默认输出的路劲就是HDFS:/user/${user}/emp 下。
问题来了
如果我想运行一个sql语句可以么
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--mapreduce-job-name FromMySQLToHDFS \
-m 1 \
--delete-target-dir \
--target-dir EMP_COLUMN_QUERY \
--fields-terminated-by '\t' \
--null-non-string '0' \
--null-string '' \
-e "select * from emp where empno>7900 and \$CONDITIONS" 这里是一个sql语句
后面不要写空格,否则运行不下去的
这里:使用–query做查询,–query和–table不能同时使用
"select * from emp where empno>7900 and \$CONDITIONS"这种写法注意
'select * from emp where empno>7900 and $CONDITIONS' 和这种写法
如果这张表示没有组建的 ,可以通过split by 进行制定
--split-by GRADE \
脚本执行:
使用一堆的参数在shell中书写十分不方便。sqoop可以运行脚本吗,可以。
将运行参数写到一个脚本文件中,如 emp.opt
vim emp.opt
将参数写入到这个文件,如
import
--connect
jdbc:mysql://hadoop001:3306/mysqoopdata
--username
root
--password
root
--table
emp
注意,一个命令一行,前后不能有空格。
按照如下方式执行就可以了,和原来的一样。
sqoop --options-file emp.opt
二:导出数据
导入是指Hadoop上的数据导出到MySQL上,导出的时候要注意,MySQL中表如果不存在则不会成功,所以先要创建好表然后再导出。
sqoop export \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp_d5 \ 这张表要提前创建好
--export-dir /user/hadoop/emp \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \ 指定的字段
--fields-terminated-by '\t' 自己指定分隔符
导入hive中
在这之前要把hive的相关的jar复制到这边
[hadoop@hadoop001 lib]$ cp hive-common-1.1.0-cdh5.7.0.jar /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/lib/
[hadoop@hadoop001 lib]$ cp hive-shims-* /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/lib/
在这导入之前要把相应的jar放到lib下面
导入语句
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir \
--hive-import \
--hive-table d5_emp_test_p \一般情况下是要先创建表的
--fields-terminated-by '\t' \
--columns 'EMPNO,ENAME,JOB,SAL,COMM' \
--hive-overwrite \
--hive-partition-key 'pt' \
--hive-partition-value 'ruoze'
sqoop导入有一个问题啊,不能自动分区,必须指明分区值….
三:Hive导出到Mysql
Hive导出到MySQL。其实就是HDFS到mysql
sqoop export \
--connect jdbc:mysql://hadoop001:3306/mysqoopdata \
--username root
--password root \
-m 1\
--mapreduce-job-name FromHDFSToMySQL \
--table emp_demo \
--export-dir /user/hive/warehouse/database_test.db/emp_partition/pt=2018-08-08 \
--input-fields-terminated-by '\t' \
--input-null-string '\\N'
四:Sqoop jop
每次执行一堆参数真的会比较麻烦,可以使用shell脚本,可以使用job来简化。sqoop help job查看使用方法
sqoop job --create ruoze_job -- \
import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir \
--target-dir EMP_JOB
这样的job就存储在sqoop中,可以使用定时运行脚本工具 crontab ,运行脚本内容sqoop job – exec myjob,这样可以定时运行任务。
有一点需要注意下,运行Job的时候是需要手工输入密码,对于–password root这个参数好像没什么用。
验证作业
$ sqoop job --list
显示
$ sqoop job --show myjob
执行
$ sqoop job --exec myjob