天天看点

Sqoop实现数据在关系型数据库与非关系数据库之间的互传一、Sqoop简介二、导入导出介绍三、应用

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
           

继续阅读