数据转换工具Sqoop的作用和使用

数据转换工具Sqoop的作用和使用

sqoop的作用就是将关系型数据库中的某张表数据抽取到Hadoop的hdfs文件系统当中,底层运用的还是Map Reduce 。它利用MapReduce加快数据传输速度,批处理方式进行数据传输。也可以将HDFS上的文件数据或者是Hive表中的数据导出到关系型数据库中的某张表。

数据转换工具Sqoop的作用和使用

sqoop1和sqoop2是两个不同的版本,完全不兼容。
Sqoop2比Sqoop1的改进,引入sqoop server,集中化管理Connector等
多种访问方式:CLI,Web UI,REST API
引入基于角色的安全机制
本博主使用sqoop1,因为sqoop1相对而言稳定。

sqoop的配置和测试都是基于完全分布式集群,用的是Hadoop2.X版本,cdh5.3.6。

配置Sqoop 1.x

Sqoop安装目录下的conf目录,重命名sqoop-env-template.sh为sqoop-env.sh,配置环境变量:

export HADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6

export HADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6

export HIVE_HOME=/opt/modules/hive-0.13.1-cdh5.3.6

export ZOOCFGDIR=/opt/modules/zookeeper-3.4.5-cdh5.3.6

配置完sqoop即可使用sqoop help查看sqoop的帮助命令了


测试sqoop1.X

第一步:放置驱动包
将mysql数据库的jdbc驱动包复制到sqoop中的lib目录下
$ cp /opt/softwares/mysql-connector-java-5.1.27-bin.jar /opt/modules/sqoop-1.4.5-cdh5.3.6/lib/
第二步:测试Sqoop
开启hdfs、yarn和mysql
连接mysql,并list数据库中的databases
bin/sqoop list-databases \
–connect jdbc:mysql://master64:3306 \
–username root \
–password 123456
默认情况下导入数据到HDFS
bin/sqoop import \

–connect jdbc:mysql://master64:3306/sqoopdb \

–username root \

–password 123456 \

–table users

测试指定目录和Mapper个数

1.创建目录
$ bin/hdfs dfs -mkdir -p /sqoop/in(可以去浏览器输入http://master64:50070/查看文件是否创建成功)
数据转换工具Sqoop的作用和使用
2.设置map个数为1,指定目录,并且如果已存在目标目录则先删除
[[email protected] sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \

–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir

数据转换工具Sqoop的作用和使用
定义字段用制表符隔开
默认的情况下,导入到HDFS上的文件中每行数据的列与列之间的分隔符是【逗号】隔开,可以通过【–fields-terminated-by】属性指定分隔符,测试命令如下(需要注意 换行符“\” 需要统一 一个空格)

[[email protected] sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \

–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir \
–fields-terminated-by “\t”

增量导入

增量导入数据到HDFS文件中,可以通过下面三个参数进行设置:
–check-column
–incremental
–last-value
增量导入通常用在日志的导入,比如第一个小时导入日志,第二个小时就无需导入第一小时的日志,直接从某处开始
[[email protected] sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \

–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir \
–fields-terminated-by “\t” \
–check-column id \ //字段是id
–incremental append \
–last-value 3000 //表示从第3000位开始

指定文件格式

默认情况下,导入数据到HDFS文件存储格式为textfile,可以通过属性进行指定,比如文件存储格式为parquet
[[email protected] sqoop-1.4.5-cdh5.3.6]$ bin/sqoop import \

–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users \
–num-mappers 1 \
–target-dir /sqoop/in \
–delete-target-dir \
–fields-terminated-by “\t” \
–as-parquetfile

导出数据到RDBMS(关系型数据库管理系统)
在mysql下创建一张新的空表,空表格式与users表结构一样
执行sqoop export命令
bin/sqoop export \
–connect jdbc:mysql://master64:3306/sqoopdb \
–username root \
–password 123456 \
–table users_sq \ //填空表名称
–export-dir /sqoop/in/part-m-00000