Sqoop实现数据在关系型数据库与非关系数据库之间的互传
- 一、Sqoop简介
- 二、导入导出介绍
- 三、应用
-
- (一)、 mysql 与 HDFS间数据传输:
一、Sqoop简介
sqoop是一个分布式计算环境,能够使数据在Hadoop和关系型数据库间进行传输,
为什么说他是分布式计算环境呢?是因为sqoop是将导入或导出命令翻译成 MapReduce 程序来实现。
二、导入导出介绍
1、导入数据:(import)
是指从关系型数据库(RDBMS)向Hadoop集群(HDFS,Hive,HBase)中导入数据,使用import关键字
2、导出数据:(export)
是指从Hadoop集群(HDFS,Hive,HBase)向关系型数据库(RDBMS)中导入数据,使用export关键字
三、应用
(一)、 mysql 与 HDFS间数据传输:
mysql 导入 HDFS :
1、全表导入:
sqoop import \
--connect jdbc:mysql://single:3306/数据库名 \ 连接mysql中的数据库
--driver com.mysql.jdbc.Driver \ 指定驱动,可以省略
--table 表名 \ 数据库中的表(即将要导入的数据)
--username root \
--password root \
--columns “字段1,字段2,...” \ 指定导入的字段,不写默认全部字段
--target-dir /PATH/DIEECTORY/文件名 \ HDFS上的文件路径,刚开始不能存在,若不指定会存在默认路径
--m 3 \ 指定使用多少个mapTask进行数据迁移,数据量大建议使用多个map,默认的map为4个
--delete-target-dir \ 若存在目录则将其删除
--as-sequencefile \ 指定导入时文件存储格式,有两种:分隔符文本和序列文件(delimited text or SequenceFiles)
--fields-terminated-by ':' 指定导出后的数据以什么分隔符分割(不指定有默认分隔符',')
2、查询导入:
sqoop import \
--connect jdbc:mysql://single:3306/数据库名 \
--username root \
--password root \
--query "select sname,gender from student where 条件 and \$CONDITIONS” \ 如果查询中使用where 则要加 "\$CONDITIONS 固定的格式
--target-dir /PATH/DIEECTORY/文件名 \ HDFS上的文件路径,刚开始不能存在
--split-by coloms \ 以哪个字段分割(分区)
--m 3 \
--fields-terminated-by ':' 指定导出后的数据以什么分隔符分割
增量导入:(只导入新增的数据)
sqoop import \
--connect jdbc:mysql://single:3306/kb06mysqltestdb \
--username root \
--password root \
--query "select sid,sname,gender,class_id from student where \$CONDITIONS" \
--target-dir /kb10/kb06student \
--split-by gender \
--num-mappers 2 \ 指定使用多少个mapTask进行数据迁移,数据量大建议使用多个map,默认的map为4个
--check-column sid \ 检查指定的列,根据此列判断哪些记录是新数据且需要导入的,列不能是字符相关类型
--incremental append \ 指定增量模式,mode包含两种方式:append和lastmodified
append:当表中的记录是以id持续增加导入新的记录的时候,可以使用append模式,--check-column id 用于检查id
lastmodified: 表有时候也会执行更新操作,此时可以使用lastmodified导入
--last-value 18 指定某个值,将大于该值的检查列记录导入,以确定仅将新的或者更新后的记录导入新的文件系统
一般情况下:
--check-column是数据库中的关键字,以此来判断哪些列是新增数据。
--incremental 增量导入模式分为两种:append和lastmodified。
--last-value 后面接的值一般是上一次导入操作后指定列的最大值,便于Sqoop将此最大值后新增的值导入。
HDFS 导出到 mysql:
当向mysql中导入数据时,如果mysql中不存在表时,mysql并不会自动创建表,所以需要我们自己手动创建
create table ...(表结构)
执行导出命令:
sqoop export \
--connect jdbc:mysql://hadoop101:3306/数据库名 \ mysql中的数据库
--username root \
--password root \
--table 表名 \ 导入到mysql中的表名
--export-dir /PATH/DIEECTORY/文件名 \ hdfs上文件的路径
-m 1