1.概述
sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
Sqoop的原理其实就是将导入导出命令转化为mapreduce程序来执行,sqoop在接收到命令后,都要生成mapreduce程序
使用sqoop的代码生成工具可以方便查看到sqoop所生成的java代码,并可在此基础之上进行深入定制开发
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
导出数据:从Hadoop的文件系统中导出数据到关系数据库
2.工作机制
将导入或导出命令翻译成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制
3 sqoop实战及原理
3.1 sqoop安装
安装sqoop的前提是已经具备java和hadoop的环境
3.2下载并解压
下载地址 http://ftp.wayne.edu/apache/sqoop/1.4.6/
百度云链接:https://pan.baidu.com/s/1oJ4VsdOsGhwAtWlNjQ8qnw 提取码:nl36
3.3 修改配置文件
先将sqool/conf 下的sqoop-env-template.sh修改名称
mv sqoop-env-template.sh sqoop-env.sh
然后编辑修改 vi sqoop-env.sh 修改内容如下: 可以先查看自己hadoop 安装到哪里 命令为 which hadoop 修改完后保存退出
3.4 加入mysql的jdbc驱动包
cp ~/apps/apache-hive-1.2.1-bin/lib/mysql-connector-java-5.1.28.jar ./lib/
3.4 验证启动
进入sqoop文件下
[hadoop@mini1 sqoop]$ bin/sqoop
4 Sqoop的数据导入
“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)
1.先将mysql的数据导到Hdfs中 mysql数据库表如下:
在虚拟机的mysql中创建一个database,然后建三张表:emp, emp_add和emp_conn
表emp:
id
name
deg
salary
dept
1201
gopal
manager
50,000
TP
1202
manisha
Proof reader
50,000
TP
1203
khalil
php dev
30,000
AC
1204
prasanth
php dev
30,000
AC
1205
kranthi
admin
20,000
TP
表emp_add:
id
hno
street
city
1201
288A
vgiri
jublee
1202
108I
aoc
sec-bad
1203
144Z
pgutta
hyd
1204
78B
old city
sec-bad
1205
720X
hitec
sec-bad
表emp_conn:
id
phno
1201
2356742
1202
1661663
1203
8887776
1204
9988774
1205
1231231
导入表数据到HDFS
1.下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
我是将mini2中的mysql中的数据导入mini1的HDFS中
$bin/sqoop import \
--connect jdbc:mysql://mini2:3306/test \
--username root \
--password 123456 \
--table emp \
--m 1
导入结果如下:
2.下面的命令用于从MySQL数据库服务器中的emp表导入Hive数据仓库工具里。
我是将mini2中的mysql中的数据导入mini1的Hive数据仓库工具中
bin/sqoop import --connect jdbc:mysql://mini2:3306/test --username root --password 123456 --table emp --hive-import --m 1
得到的结果如下:
3.从MySQL数据库服务器中导入到HDFS指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
以下是指定目标目录选项的Sqoop导入命令的语法。
bin/sqoop import \
--connect jdbc:mysql://mini2:3306/test \
--username root \
--password 123456 \
--target-dir /queryresult \
--table emp --m 1
4.导入表数据子集
我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
where子句的语法: --where <condition>
下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为:
bin/sqoop import \
--connect jdbc:mysql://mini2:3306/test \
--username root \
--password 123456 \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1
按需导入
bin/sqoop import \
--connect jdbc:mysql://mini2:3306/test \
--username root \
--password 123456 \
--target-dir /wherequery2 \
--query 'select id,name,deg from emp WHERE id>1207 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 1
5.增量导入
增量导入是仅导入新添加的表中的行的技术,它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
下面的语法用于Sqoop导入命令增量选项。
--incremental <mode>
--check-column <column name>
--last value <last check column value>
假设新添加的数据转换成emp表如下: 1206, satish p, grp des, 20000, GR 下面的命令用于在EMP表执行增量导入。
bin/sqoop import \
--connect jdbc:mysql://mini2:3306/test \
--username root \
--password 123456 \
--table emp --m 1 \
--incremental append \
--check-column id \
--last-value 1208
5 Sqoop的数据导出
将数据从HDFS导出到mysql数据库 ,导出前,目标表必须存在于目标数据库中
示例
数据是在HDFS中 /queryresult 目录下 emp文件中,所述emp数据如下:
1201, gopal, manager, 50000, TP
1202, manisha, preader, 50000, TP
1203, kalil, php dev, 30000, AC
1204, prasanth, php dev, 30000, AC
1205, kranthi, admin, 20000, TP
1206, satish p, grp des, 20000, GR
1、首先需要手动创建mysql中的目标表 命令如下: 在mini2上的mysql数据库创建表
$ mysql
mysql> USE db;
mysql> CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
2、然后执行导出命令
bin/sqoop export \
--connect jdbc:mysql://mini2:3306/lyz \
--username root \
--password 123456 \
--table employee \
--export-dir /queryresult/
最终的结果如下: