Sqoop环境搭建:
1)下载
2)解压
3)配置文件:sqoop-env.sh
4)配置环境变量
sqoop-env.xml
配置hadoop路径,下面的那个hadoop jar的路径也是这个。
以下类似,hive路径
打开:bin目录下的sqoop,使用sqoop --help来查看使用方法(注意需要有mysql驱动,lib文件夹下面,不然正确的语法也会报错)
使用
usage: sqoop COMMAND [ARGS]
注意:sqoop的lib目录下需要有mysql驱动包
其他需要的包:hive-common-1.1.0-cdh5.7.0.jar以及以hive-shims开头的jar包(在hive的lib目录下)
查数据库:
sqoop list-databases \
--connect jdbc:mysql://localhost:3306 \
--username root \
--password root
查表(数据库为sqoop):
sqoop list-tables \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root
导入(把mysql中的数据导入到hdfs中):
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp
hadoop fs -ls和 -ls /的区别
-ls / 是查看的根目录/
-ls 是查看的用户目录/user/hadoop
也就是和linux 里的/和/home/hadoop的区别
sqoop部分语句使用
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root --password root \
--table emp \
--mapreduce-job-name FromMySQL2HDFS \ (设定作业名称)
--delete-target-dir \ (导入目标目录,以删除模式,也就是说已经存在目标文件夹的话,就删除掉)
--fields-terminated-by '\t' \ (字段与字段之间的分隔符,lines-terminated-by是行)
-m 1 \ (maptask的数量)
--null-non-string 0 \ (为空的转成0来表示,null-string的意思是把null转成空或者其他的字符串)
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--target-dir EMP_COLUMN_WHERE \ (设定目标目录名称)
--where 'SAL>2000' (where子句)
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root --password root \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
-m 1 --null-non-string 0 \
--target-dir EMP_COLUMN_QUERY \
--query "select * from emp where empno>=7900 and \$CONDITIONS"
(query后面跟sql语句,但是跟--table和--columns不能同时存在。如果是双引号的话需要在后面加上\$CONDITIONS,单引号需要加$CONDITIONS)
--query 'select * from emp where empno>=7900 and $CONDITIONS'
可以把语句放到一个文件中,其内容:
import
--connect
jdbc:mysql://localhost:3306/sqoop
--username
root
--password
root
--mapreduce-job-name
FromMySQL2HDFS
--table
emp
--delete-target-dir
-m
1
--null-non-string
0
--target-dir
EMP_OPTION
调用的语句是:
sqoop --options-file emp.opt
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table salgrage (这张表没有主键,会报错,提示需要有主键,可以使用--split-by来指定,也可以加个参数'-m 1')
sqoop eval \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root --password root \
--query "select * from emp"
把查询结果输出到控制台/命令行
导出:(指定目录,hdfs导出到mysql中)
sqoop export \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp_demo \
--export-dir /user/hadoop/emp \
--fields-terminated-by '\t' (注意分隔符需要与导入的分隔符相同)
某些字段的导出,需要加--columns(导出需要的文件也必须是这些字段)
mysql导入到hive(与hdfs类似,就多加几个参数)
sqoop import \
--connect jdbc:mysql://localhost:3306/sqoop \
--username root --password root \
--table emp \
--create-hive-table \ (是否创建hive表,如果存在会报错)
--hive-database ruoze_hive \
--hive-import \
--hive-overwrite \
--hive-table emp_import \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
-m 1 --null-non-string 0
其中会报错,报HIVE_CONF_DIR找不到,(如果去hive-env.xml中配置,好像没用???),可以通过拷jar包解决(hive的lib中的jar包,hive-common-1.1.0-cdh5.7.0.jar以及以hive-shims开头的jar包,都拷到sqoop的lib目录下)。
导入Hive不建议大家使用–create-hive-table
建议事先创建好hive表,因为自动创建的表字段类型不合适。
hive导出到mysql(从hdfs中)
sqoop export --connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table dept_demo \
--export-dir /user/hive/warehouse/ruoze_dept \
--fields-terminated-by '\t'
表需要存在,需要指定导出所需的目录(其实是导出hdfs中的文件)
job的使用
基于已经保存的jobs来进行工作
sqoop job --create ruozejob -- import --connect jdbc:mysql://localhost:3306/sqoop \
--username root \
--password root \
--table emp \
--delete-target-dir
这是创建语句,可以通过sqoop job --list来查看所有job,使用sqoop job --show jobname,密码应该是mysql的密码。
sqoop job --exec jobname来执行job,sqoop job --delete jobname删除