Sqoop数据迁移

1.概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。


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解压

tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

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```
在这里插入图片描述
导入表数据到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

下面的命令用来导入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/

在这里插入图片描述
最终的结果如下:
在这里插入图片描述
以上就是sqoop导入导出的所有功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值