sqoop
一. sqoop的使用
1. 常见命令
help:查看命令
list-databases:查看当前连接的数据库中的数据库列表(只能列出当前的用户有权限访问的数据库)
import:导入,将关系库中的数据库表导入到hdfs上
export:导出,将hdfs上的数据文件导出到关系库中
job:可以创建一个执行任务
列出mysql数据库中的可以访问的所有数据库
sqoop list-databases --connect jdbc:mysql://192.168.1.101:3306 --username root --password 123456
2. import命令
--help:查看所有import下面的子命令
--connect:设置数据库连接的字符串
--username:设置数据库连接的用户名
--password:设置数据库连接的密码
--table:设置导入的数据库表的名称(如果导入的是Oracle数据库则表名必须大写)
--target-dir:设置数据导入到hdfs上以后文件所在的位置(如果文件存在则会报错,除非设置delete-target)
--delete-target-dir:如果导入的时候文件夹已经存在则会删除文件夹
--num--mapper:设置开启的MR的数量
--fields-treminated-by:设置列之间的分隔符
--driver:设置驱动表的名称
全量导入数据
将mysql中数据库中test_t表导入到hdfs上
sqoop import \
--connect jdbc:mysql://192.168.1.101:3306/test \
--username root \
--password 123456 \
--table test_t \
--target-dir /test/demo \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver
--将Oracle中的数据库表emp导入到hdfs平台上
sqoop import \
--connect jdbc:oracle:thin:@192.168.1.101:1521:orcl \
--username scott \
--password 123456 \
--table EMP \
--target-dir /test/emp \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ','
--导入指定的列 使用命令:--columns 列名,列名,....
sqoop import \
--connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
--username scott \
--password 123456 \
--table EMP \
--columns ename,job,sal,deptno \
--target-dir /test/emp \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ','
--按照条件进行过滤导入数据 --where 过滤条件
sqoop import \
--connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
--username scott \
--password 123456 \
--table EMP \
--where 'comm is null' \
--target-dir /test/emp1 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ','
--通过查询语句进行数据的导入 --query 查询语句
sqoop import \
--connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
--username scott \
--password 666666 \
--query 'select e.*,d.dname,d.loc from emp e ,dept d where e.deptno=d.deptno and e.sal>1500 and $CONDITIONS' \
--target-dir /test/emp2 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ','
注意:1.table和query同时只能设置1个
2.在查询语句后面如果有where条件查询,则需要在后面添加一个and $CONDITIONS
导出数据:export :将hdfs上的数据文件导入到关系库中,必须要先创建好对应的表。
将hdfs平台上的数据文件到入到mysql的test_t1表中
sqoop export \
--connect jdbc:mysql://192.168.1.101:3306/test \
--username root \
--password 123456 \
--table test_t1 \
--export-dir /test/demo \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver
--将hdfs上的数据导入到Oracle数据库中
sqoop export \
--connect jdbc:oracle:thin:@192.168.1.101:1521:orcl1 \
--username scott \
--password 123456 \
--table EMP_TEST \
--export-dir /test/emp1 \
--num-mappers 1 \
--fields-terminated-by ',' \
二. 增量导入数据:
在实际的业务中,如果由一些表的数据量不是很大,并且增长速度也不是很快,则可以采用全量到数据的方式。
但是如果表中的数据量很大,并且增长速度也很快,则建议使用增量导入数据。
sqoop中两种增量方式:
1. append:通过主键来判定
2. lastmodified:以最后修改的时间进行判断,要求表中必须存在一个时间段
使用sqoop进行增量时使用的命令:
--check-column:用来设置判断数据的信息是否新增,该字段只能是数字类型或者时间类型
--incremental:设置增量方式
--last-value:设置最后一个值
--append:重新生成一个文件,将增量数据放到新的文件中
--merge-key:合并数据,在增量的时候对指定的数据字段进行合并
--将mysql数据库中test_t表中的数据进行增量导入到hdfs平台上
--判断方式以主键的形式进行判定,并且以追加的形式来增量
sqoop import \
--connect jdbc:mysql://192.168.1.101:3306/test \
--username root \
--password 123456 \
--table test_t \
--target-dir /test/demo \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver \
--check-column id \
--incremental append \
--last-value 4 \
--append
--使用增量导入的方式将user_t表中的数据导入到hdfs平台上
--增量判断的字段lasttime,并且以追加的方式进行增量
sqoop import \
--connect jdbc:mysql://192.168.1.65:3306/test \
--username root \
--password 123456 \
--table user_t \
--target-dir /test/user_t \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver \
--check-column lasttime \
--incremental lastmodified \
--last-value '2022-06-24 14:56:47.0' \
--append
--使用增量导入的方式将user_t表中的数据导入到hdfs平台上
--增量判断的字段lasttime,并且以合并的方式进行增量
sqoop import \
--connect jdbc:mysql://192.168.1.65:3306/test \
--username root \
--password 123456 \
--table user_t \
--target-dir /test/user_t1 \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver \
--check-column lasttime \
--incremental lastmodified \
--last-value '2022-06-24 15:26:57.0' \
--merge-key id --用来指定合并的字段
三.使用sqoop中的job(任务)
常用命令:
1.创建任务:
sqoop job --create 任务名
2.删除任务:
sqoop job --delete 任务名
3.查看任务列表
sqoop job --list 任务名
4.执行任务
sqoop job --exec 任务名
注意:使用sqoop的任务的时候必须要添加两个json的jar包
--创建一个sqoop的任务:增量导入user_t中的数据到hdfs平台
sqoop job --create myjob1 -- import \
--connect jdbc:mysql://192.168.1.65:3306/test \
--username root \
--password 123456 \
--table user_t \
--target-dir /test/user_t2 \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver \
--check-column lasttime \
--incremental lastmodified \
--last-value '2022-06-24 15:26:57.0' \
--merge-key id
在执行sqoop的任务的时候需要输入密码,所在在实际的工作中都会设置免密登录。
1.创建一个密码文件,将数据库中的密码保存
echo -n '123456' >passwd.pwd
2.在hdfs上创建一个文件夹来保存密码文件
hdfs dfs -mkdir -p /passwd/pwd
3.将创建的密码文件上传到hdfs对应的文件夹下
hdfs dfs -put passwd.pwd /passwd/pwd
4.在写导入的命令的时候不用设置password,但是要设置password-file用来指定密码存放的位置
sqoop job --create myjob2 -- import \
--connect jdbc:mysql://192.168.1.65:3306/test \
--username root \
--password-file '/passwd/pwd/passwd.pwd' \
--table user_t \
--target-dir /test/user_t2 \
--num-mappers 1 \
--fields-terminated-by ',' \
--driver com.mysql.jdbc.Driver \
--check-column lasttime \
--incremental lastmodified \
--last-value '2022-06-24 15:26:57.0' \
--merge-key id
使用Linux中的定时任务来调度sqoop中的任务(job):
1.创建一个定时任务:
crontab -e
2.在定时任务重添加一下内容
*/10 * * * * /root/sqoop1.4/bin/sqoop job --exec myjob2 > myjob.log 2>&1
修改/root/hadoop2.7/etc/hadoop/hadoop-env.sh文件
将里面的export JAVA_HOME=jdk路径
export JAVA_HOME=/root/jdk1.8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?