数据采集工具Sqoop

1 Sqoop的介绍

  Sqoop是一种用于在Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具。

2 Sqoop的应用场景

  1. 数据迁移,公司传统的数据都存在关系型数据库中,随着公司业务的发展,希望将历史数据迁移到大数据平台做存档,Sqoop将数据迁移到HDFS中做归档。
  2. 数据采集,需要对公司网站的业务数据进行分析统计、构建用户画像等大数据应用。将业务数据同步到大数据平台中Hive,使用分布式计算来进行分析统计和应用。
  3. 结果导出,经过大数据平台对数据进行分析统计以后,得到了结果,需要对结果进行可视化展示,这时候需要把大数据平台的结果数据导出到关系型数据库中进行可视化展示。

3 Sqoop的基本原理

  Sqoop底层就是MapReduce程序的模板,MapReduce提供了DBInputFormat和DBOutputFormat类,可以实现对数据库数据的导入和导出,Sqoop就是通过解析传递的参数,将参数传递给底层的MapReduce模板来运行。所有Sqoop的MapReduce程序只有Map过程,没有Reduce,因为数据迁移过程是没有聚合。

4 Sqoop的版本介绍

  Sqoop官网提供了Sqoop1和Sqoop2,Sqoop1只是一个普通的应用程序,通过给定参数就可以运行该程序。Sqoop2拥有服务端的应用程序,简单的功能变得复杂化,但是更加统一化、规范化。

5 Sqoop的安装部署

下载Sqoop安装包

#解压
tar -zxvf sqoop-1.4.7.tar.gz -C /opt/
#修改配置文件
cd /export/servers/sqoop-1.4.6-cdh5.14.0/conf
mv sqoop-env-template.sh sqoop-env.sh
#将Hive的配置文件hive-site.xml放在Sqoop的conf目录中,让Sqoop可以找到Hive的元数据位置。
#将关系型数据库的驱动包放在Sqoop的lib目录下。
#修改Sqoop的配置文件
mv sqoop-site-template.xml sqoop-site.xml
vim sqoop-site.xml
#打开sqoop.metastore.client.record.password配置的注释,为了在Sqoop job运行的时候可以把数据库密码保存在sqoop元数据中。

6 Sqoop常用参数详解

--connect #数据库连接
--username #数据库用户名
--password #数据库密码
--table #关系型数据库的表名
--columns <col,col,col...> #指定从关系数据库导出那些列
--where #对导入的表的行进行过滤
-e #指定一条SQL语句实现导入哪些数据 sqoop要求只要使用sql语句来导入数据的话,sql语句的后面必须加上where conditions
#当把数据导入到HDFS中需要的参数
--target-dir #指定HDFS地址
-m #mapreduce程序指定的map个数
--fields-terminated-by #输出到HDFS的文件分隔符
--delete-target-dir #提前删除输出目录
# 导入到Hive中需要的参数
--hive-overwrite #覆盖表中内容
--create-hive-table #如果表不存在,可以主动创建
--hive-database #导入hive的哪个数据库
--hive-import #导入到hive表中并使用默认分隔符
--hive-table #导入到hive的哪张表中
# 增量导入需要用到的参数 
--check-column <column>        #指定检查哪一列的值
--incremental <import-type>    #增量导入的模式append or lastmodified
--last-value <value>           #检查的那一列上一次的值是什么
#增量追加导入不能和--delete-target-dir放在一起用
#导出
--input-fields-terminated-by #指定导出的HDFS/Hive分隔符
--export-dir #导出目录
--update-mode #导出模式
--update-key #导出指定检查的列

7 Sqoop的增量导入

  关系型数据库–>HDFS/Hive。

7.1 导入模式为append

  以某一列的值来做判断,从上一次的位置开始导入。
示例

#第一次导入
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table test \
--delete-target-dir \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
-m 1
# 第二次导入
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table test \
--target-dir /sqoop/import/test02 \
--fields-terminated-by '\t' \
--check-column id \
--incremental append \
--last-value 4 \
-m 1
7.2 导入模式为lastmodified

  根据某个时间字段的值来做判断,上一次的时间是什么,这一次就导入上一次时间之后的值。该程序有两个MapReduce,第一个MapReduce会将大于上一次的时间的值导出,第二个MapReduce会将被更新的数据进行合并。必须得是时间字段的值来做判断。
示例

#第一次
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--check-column lastmode \
--incremental lastmodified \
--last-value '2019-01-01 00:00:00' \
-m 1
#第二次
bin/sqoop import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_lastmode \
--target-dir /sqoop/import/test03 \
--fields-terminated-by '\t' \
--merge-key id \ #会通过merge-key将两次导入的数据进行合并
--check-column lastmode \
--incremental lastmodified \
--last-value '2020-02-11 09:09:38' \
-m 1
7.3 两种增量导入的区别

  append方式适合只写入,不会进行修改的表,因为append不会进行合并,如果已经导入,就不会再导入。lastmodified方式适合有修改有写入的表,因为lastmodified会进行合并。

8 Sqoop导入常见报错

  报错一
image-20200211153549453
  在导入Hive的时候,程序是先把数剧导入到HDFS上的当前用户上,在将HDFS文件移动到Hive表对应的目录中,所以在导入的时候,如果默认用户下的目录已经存在,则报错,需要添加删除输出目录参数即可,也就是–delete-target-dir。
  报错二
image-20200211153755589
  当前在使用MapReduce程序操作Hive,就需要用到Hive的依赖包,而Hadoop的环境变量中没有Hive的依赖包,需要将Hive的依赖包添加到Hadoop的环境变量中。在导入语句中,指定生成的文件分隔符一定要与Hive表的分隔符一致。

9 Sqoop增量导出

  HDFS/Hive–>关系型数据库。

9.1 修改导出updateonly

  该模式只会导出修改的行。
示例

bin/sqoop export \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root  \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
--update-key id \
--update-mode updateonly \
-m 1
9.2 allowinsert

  该模式会导入修改的行和增加的行。
示例

bin/sqoop export \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root  \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
--update-key id \
--update-mode allowinsert \
-m 1

10 Sqoop Job

  如果在Sqoop中使用增量导入,每次都要记住上一次的值,这个非常麻烦。官方推荐将增量的导入的程序或者比较复杂的Sqoop程序,变成Sqoop Job。

--create <job-id> #创建一个job
--delete <job-id> #删除一个job
--exec <job-id> #执行一个job
--list #列举所有保存到元数据的job
--show <job-id> # 展示指定的job

示例

bin/sqoop job --create job03 \
-- import \
--connect jdbc:mysql://node-03:3306/sqoop \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test06 \
--fields-terminated-by '\t' \
--check-column id \
--incremental append \
--last-value 8 \
-m 1

  注意:Sqoop Job封装增量导入时,可以自动记录lastvalue。

11 Sqoop脚本

  将Sqoop的程序放在一个文件中。
示例

vim sqoop.file
import
--connect jdbc:mysql://node-03:3306/sqoop
--username root
--password 123456
--table tb_tohdfs
--target-dir /sqoop/import/test05
--fields-terminated-by '\t'
-m 1

  然后通过运行Sqoop文件的方式来运行Sqoop的程序。

bin/sqoop --option-file /export/datas/sqoop.file

  这种方式适合导出和全量导入,如果是增量导入,先封装为Sqoop Job更好一点。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值