sqoop数据迁移

文章目录

  • 概述
    • 1、sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
    • 2、sqoop1与sqoop2架构对比
    • 3、工作机制
  • sqoop安装
    • 1、下载并解压
    • 2、修改配置文件
    • 3、加入额外的依赖包
    • 4、验证启动
  • Sqoop的数据导入
    • 表数据
    • 1、导入数据库表数据到HDFS
    • 2、导入到HDFS指定目录
    • 3、导入关系表到HIVE
    • 4、导入关系表到hive并自动创建hive表
    • 5、sql语句查找导入hdfs
  • 增量导入
    • 第一种增量导入使用上面的选项来实现
    • 第二种增量导入通过--where条件来实现
  • Sqoop的数据导出
    • hdfs导出到mysql
    • 第一步:创建mysql表
    • 第二步:执行导出命令
    • 第三步:验证mysql表数据

概述

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

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等
sqoop数据迁移_第1张图片

2、sqoop1与sqoop2架构对比

sqoop1架构
sqoop数据迁移_第2张图片
sqoop2架构
sqoop数据迁移_第3张图片

3、工作机制

将导入或导出命令翻译成mapreduce程序来实现
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

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
sqoop数据迁移_第4张图片

Sqoop的数据导入

“导入工具”导入单个表从RDBMS到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据(或者Avro、sequence文件等二进制数据)
列举出所有的数据库
命令行查看帮助
bin/sqoop list-databases --help

列出win7主机所有的数据库
bin/sqoop list-databases --connect jdbc:mysql://192.168.2.169:3306/ --username root --password 123456

查看某一个数据库下面的所有数据表
bin/sqoop list-tables --connect jdbc:mysql://192.168.2.169:3306/userdb --username root --password 123456

表数据

在mysql中有一个库userdb中三个表: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 email
    1201 2356742 [email protected]
    1202 1661663 [email protected]
    1203 8887776 [email protected]
    1204 9988774 [email protected]
    1205 1231231 [email protected]

1、导入数据库表数据到HDFS

下面的命令用于从MySQL数据库服务器中的emp表导入HDFS。
bin/sqoop import --connect jdbc:mysql:// 192.168.2.169:3306/userdb --password 123456 --username root --table emp --m 1

如果成功执行,那么会得到下面的输出。
sqoop数据迁移_第5张图片
为了验证在HDFS导入的数据,请使用以下命令查看导入的数据
hdfs dfs -ls /user/root/emp

2、导入到HDFS指定目录

在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
使用参数 --target-dir来指定导出目的地,
使用参数—delete-target-dir来判断导出目录是否存在,如果存在就删掉
bin/sqoop import --connect jdbc:mysql://192.168.2.169: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_add表的数据和字段。
1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP

导入到hdfs指定目录并指定字段之间的分隔符

bin/sqoop import  --connect jdbc:mysql://192.168.2.169/userdb --username root --password 123456 --delete-target-dir --table emp  --target-dir /sqoop/emp2 --m 1 --fields-terminated-by '\t'

查看文件内容
hdfs dfs -text /sqoop/emp2/part-m-00000
sqoop数据迁移_第6张图片

3、导入关系表到HIVE

第一步:拷贝jar包
将我们mysql表当中的数据直接导入到hive表中的话,我们需要将hive的一个叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷贝到sqoop的lib目录下
cp /export/servers/hive-1.1.0-cdh5.14.0/lib/hive-exec-1.1.0-cdh5.14.0.jar /export/servers/sqoop-1.4.6-cdh5.14.0/lib/

第二步:准备hive数据库与表
将我们mysql当中的数据导入到hive表当中来

hive (default)> create database sqooptohive;
hive (default)> use sqooptohive;
hive (sqooptohive)> create external table emp_hive(id int,name string,deg string,salary int ,dept string) row format delimited fields terminated by '\001';

第三步:开始导入

bin/sqoop import --connect jdbc:mysql://192.168.2.169/userdb --username root --password 123456 --table emp --fields-terminated-by '\001' --hive-import --hive-table sqooptohive.emp_hive --hive-overwrite --delete-target-dir --m 1

第四步:hive表数据查看
select * from emp_hive;
sqoop数据迁移_第7张图片

4、导入关系表到hive并自动创建hive表

我们也可以通过命令来将我们的mysql的表直接导入到hive表当中去

bin/sqoop import --connect jdbc:mysql://192.168.2.169:3306/userdb --username root --password 123456 --table emp_conn --hive-import -m 1 --hive-database sqooptohive;

通过这个命令,我们可以直接将我们mysql表当中的数据以及表结构一起倒入到hive当中去
导入表数据子集
我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
where子句的语法如下。
–where
按照条件进行查找,通过—where参数来查找表emp_add当中city字段的值为sec-bad的所有数据导入到hdfs上面去

bin/sqoop import \
--connect jdbc:mysql://192.168.2.169:3306/userdb \
--username root --password 123456 --table emp_add \
--target-dir /sqoop/emp_add -m 1  --delete-target-dir \
--where "city = 'sec-bad'"

5、sql语句查找导入hdfs

我们还可以通过 –query参数来指定我们的sql语句,通过sql语句来过滤我们的数据进行导入

bin/sqoop import \
--connect jdbc:mysql://192.168.2.169:3306/userdb --username root --password 123456 \
--delete-target-dir -m 1 \
--query 'select phno from emp_conn where 1=1 and  $CONDITIONS' \
--target-dir /sqoop/emp_conn

查看hdfs数据内容
hdfs dfs -text /sqoop/emp_conn/part*
sqoop数据迁移_第8张图片

增量导入

在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据全部导入到hive或者hdfs当中去,肯定会出现重复的数据的状况,所以我们一般都是选用一些字段进行增量的导入,为了支持增量的导入,sqoop也给我们考虑到了这种情况并且支持增量的导入数据
增量导入是仅导入新添加的表中的行的技术。
它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。
下面的语法用于Sqoop导入命令增量选项。

--incremental <mode>
--check-column <column name>
--last value <last check column value>

第一种增量导入使用上面的选项来实现

导入emp表当中id大于1202的所有数据
注意:增量导入的时候,一定不能加参数–delete-target-dir否则会报错

bin/sqoop import \
--connect jdbc:mysql://192.168.22.22:3306/userdb \
--username root \
--password admin \
--table emp \
--incremental append \
--check-column id \
--last-value 1202  \
-m 1 \
--target-dir /sqoop/increment

查看数据内容

hdfs dfs -text /sqoop/increment/part*

sqoop数据迁移_第9张图片
sqoop数据迁移_第10张图片

第二种增量导入通过–where条件来实现

或者我们使用–where来进行控制数据的选取会更加精准

bin/sqoop import \
--connect jdbc:mysql://192.168.2.169:3306/userdb \
--username root \
--password 123456  \
--table emp \
--incremental append  \
--where "create_time > '2018-06-17 00:00:00' and is_delete='1' and create_time < '2018-06-17 23:59:59'" \
--target-dir /sqoop/incement2 \
--check-column id  \
--m 1

Sqoop的数据导出

将数据从HDFS把文件导出到RDBMS数据库
导出前,目标表必须存在于目标数据库中。
默认操作是从将文件中的数据使用INSERT语句插入到表中
更新模式下,是生成UPDATE语句更新表数据

hdfs导出到mysql

数据是在HDFS当中的如下目录/sqoop/emp,数据内容如下

1201,gopal,manager,50000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1202,manisha,Proof reader,50000,TP,2018-06-15 18:54:32.0,2018-06-17 20:26:08.0,1
1203,khalil,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1
1204,prasanth,php dev,30000,AC,2018-06-17 18:54:32.0,2018-06-17 21:05:52.0,0
1205,kranthi,admin,20000,TP,2018-06-17 18:54:32.0,2018-06-17 18:54:32.0,1

第一步:创建mysql表

CREATE TABLE `emp_out` (
  `id` INT(11) DEFAULT NULL,
  `name` VARCHAR(100) DEFAULT NULL,
  `deg` VARCHAR(100) DEFAULT NULL,
  `salary` INT(11) DEFAULT NULL,
  `dept` VARCHAR(10) DEFAULT NULL,
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_delete` BIGINT(20) DEFAULT '1'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

第二步:执行导出命令

通过export来实现数据的导出,将hdfs的数据导出到mysql当中去

bin/sqoop export \
--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root --password admin \
--table emp_out \
--export-dir /sqoop/emp \
--input-fields-terminated-by ","

第三步:验证mysql表数据

sqoop数据迁移_第11张图片

你可能感兴趣的:(大数据)