在大数据处理的诸多环节当中,数据的引入是前期的重要一环,尤其是很多传统的数据存储,多以关系型数据库为主,而这些数据要导入到分布式存储体系当中,往往需要用到Sqoop。今天的大数据开发学习分享,我们主要来讲讲如何使用Sqoop进行数据导入。
Sqoop 是连接传统关系型数据库(支持JDBC的Connector)和 Hadoop 生态系统的桥梁。采用批处理的方式,利用MR 来加快数据传输速度,完成数据传输。
Sqoop 是一个客户端工具,它的架构非常简单的,主要由三个部分组成:Sqoop client、HDFS/HBase/Hive、Database 。
如何使用Sqoop将数据导入HDFS
将数据从传统数据库导入HDFS分为两步:
步骤1: Gather Metadata
Sqoop与数据库server通信 ,获取数据库表元数据信息;完成并发数设定,字段类型如何映射,如何转化等任务。
步骤2: Submit Map-Only Job
Sqoop启动Map-Only 的MR作业,并行导入元数据。
全量数据导入
全量导入适合一次性导入做离线分析。
sqoop import \
--connect jdbc:mysql://ip:port/db \
--username root \
--password pass \
--table users \
--target-dir /user/root/ users_all \
--null-string "\\N" \
--null-non-string "\\N" \
重要参数说明:
--query <statement>
导入的查询语句,不能和--table 同时使用。
select * from table where \$CONDITIONS” \
--table <table-name>
导入的源表表名
--target-dir <dir>
导入HDFS的目标路径
--null-string <null-string>
string类型空值的替换符
--null-non-string<null-string>
非string类型空值的替换符
-m <n>
map 任务数量,默认为4。
--split-by <column-name>
若map任务数>1, 需要指定根据哪一列来实现哈希分片,从而将不同分片的数据分发到不同map 任务上去跑,避免数据倾斜。
增量数据导入
在实际生产环境中,系统可能会定期从与业务相关的关系型数据库向Hadoop导入数据,导入数仓后进行后续离线分析。故我们此时不可能再将所有数据重新导一遍,此时就需要增量数据导入这一模式了。
增量数据导入分两种:1.基于递增列的增量数据导入。2.基于时间列的增量数据导入。
基于递增列的增量数据导入
将递增列值大于阈值的所有数据增量导入Hadoop。采用append 方式,每次运行增量导入到表之前,都要修改--last-value的值,否则出现重复记录。同时也要求源表中ID为递增且不重复。
重要参数说明:
--incremental append
基于递增列的增量导入
--check-column <col>
指定递增列,int类型
--last-value <value>
起始导入的阈值,int类型
用户表中有一个自增列ID,之前已将ID号为0~999的用户数据导入到HDFS,后续只需要只从ID大于999后开始导入即可。
基于时间列的增量数据导入
将时间列值大于阈值的数据增量导入Hadoop。该方式要求原来表中存在time 字段。
重要参数说明:
--incemental lastmodified
给予时间列的增量导入
--check-column <col>
时间列,int 类型
--last-value <value>
起始导入的阈值,如'2020-01-01 10:00:00'
--merge-key <col>
合并列,合并键值相同记录,一般指主键
用户的常住地发生变化,修改用户信息表,update_time 字段也随之改变,Sqoop依然会将相同状态更改后的用户信息导入HDFS。此时HDFS将出现两条同一用户的数据,我们可以指定merge-key参数为user_id,将新的记录与原有记录合并。
关于大数据开发学习,如何使用Sqoop进行数据导入,以上就为大家做了简单的介绍了。Sqoop作为一个数据导入工具来说,需要结合到具体的场景选择使用。
网友评论