文章目录
11 辅助系统框架之sqoop数据迁移
1.概述
sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等
通过MR的inputformat和outputformat来实现数据的输入与输出,底层执行的全部都是MR的任务,
只不过这个mr只有map阶段,没有reduce阶段
说白了只是对数据进行抽取,从一个地方,抽取到另外一个地方
2.sqoop1与sqoop2架构对比
一般用sqoop1.x比较多,直接将我们的命令写入到脚本里面去,执行脚本即可
sqoop 1.x 不用安装,解压就能用
sqoop 2.x 架构发生了变化,引入了一个服务端 可以通过代码提交sqoop的任务
3.工作机制
将导入或导出命令翻译成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制
4.sqoop实战及原理
4.1 sqoop安装
安装sqoop的前提是已经具备java和hadoop的环境
1、下载并解压
下载地址
http://archive.cloudera.com/cdh5/cdh/5/
sqoop1版本详细下载地址
http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.14.0.tar.gz
sqoop2版本详细下载地址
http://archive.cloudera.com/cdh5/cdh/5/sqoop2-1.99.5-cdh5.14.0.tar.gz
我们这里使用sqoop1的版本,下载之后上传到/export/softwares目录下,然后进行解压
cd /export/softwares
tar -zxvf sqoop-1.4.6-cdh5.14.0.tar.gz -C ../servers/
2、修改配置文件
cd /export/servers/sqoop-1.4.6-cdh5.14.0/conf/
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh
export HADOOP_COMMON_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HADOOP_MAPRED_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
export HIVE_HOME=/export/servers/hive-1.1.0-cdh5.14.0
3、加入额外的依赖包
sqoop的使用需要添加两个额外的依赖包
一个是mysql的驱动包,
另一个是java-json的的依赖包,不然就会报错
mysql-connector-java-5.1.40.jar
java-json.jar
将这个两个jar包添加到sqoop的lib目录下
4、验证启动
cd /export/servers/sqoop-1.4.6-cdh5.14.0
bin/sqoop-version
5.Sqoop的数据导入
“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)
列举出所有的数据库与表
命令行查看帮助
bin/sqoop list-databases --help
列出win7主机所有的数据库
bin/sqoop list-databases --connect jdbc:mysql://node3:3306/ --username root --password 123456
查看某一个数据库下面的所有数据表
bin/sqoop list-tables --connect jdbc:mysql://node3:3306/hive --username root --password 123456
其它导入示例
1)表数据准备
在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn
表emp:
source /export/servers/userdb.sql;
2)导入数据库表数据到HDFS
下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
bin/sqoop import --connect jdbc:mysql://node3:3306/userdb --password 123456 --username root --table emp -m 1
如果成功执行,那么数据默认会存储再/user/root/目录下
hdfs dfs -ls /user/root/emp
3)导入到HDFS指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
使用参数 --target-dir来指定导出目的地,
使用参数—delete-target-dir来判断导出目录是否存在,如果存在就删掉
bin/sqoop import --connect jdbc:mysql://node3:3306/userdb --username root --password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp -m 1
hdfs dfs -text /sqoop/emp/part-m-00000 (查看导出的数据)
它会用逗号(,)分隔emp表的数据和字段。
4)导入到hdfs指定目录并指定字段之间的分隔符
bin/sqoop import --connect jdbc:mysql://node3:3306/userdb --username root \
--password 123456 --delete-target-dir --table emp --target-dir /sqoop/emp2 --m 1\
--fields-terminated-by '\