sqoop1.4.6数据迁移

sqoop介绍

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

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;

导出数据:从Hadoop的文件系统中导出数据到关系数据库

sqoop1.4.6数据迁移

sqoop工作机制

将导入或导出命令翻译成mapreduce程序来实现

在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

sqoop安装

安装sqoop的前提是已经具备Java和hadoop的环境

1、下载,解压到/usr/local/目录下,重命名为sqoop

2、修改配置文件$SQOOP_HOME/conf

  mv sqoop-env-template.sh sqoop-env.sh

  打开sqoop-env.sh并编辑下面几行: 

    export HADOOP_COMMON_HOME=/usr/local/hadoop/

   export HADOOP_MAPRED_HOME=/usr/local/hadoop/

   export HIVE_HOME=/usr/local/hive

3、将MySQL的jdbc驱动包添加到sqoop/lib/目录下

注意:

后面在sqoop中进行数据导入导出的时候,会出现很多错误:

java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@1d5a7f6 is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.

ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: No columns to generate for ClassWriter

这些错误都是$SQOOP_HOME/lib/中导入的jdbc驱动包版本低造成的,换个高版本的就OK了。

4、验证启动

$SQOOP_HOME/bin

$sqoop-version

sqoop1.4.6数据迁移

三个警告,不用管。到这里,整个sqoop安装就完成了。

Sqoop的数据导入

1、导入表数据到HDFS

在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn

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

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

id

phno

email

1201

2356742

gopal@tp.com

1202

1661663

manisha@tp.com

1203

8887776

khalil@ac.com

1204

9988774

prasanth@ac.com

1205

1231231

kranthi@tp.com

$bin/sqoop import   \

--connect jdbc:mysql://hadoop1:3306/userdb   \mysql中数据库的名字

--username root  \

--password admin   \

--table emp   \userdb下的emp表,可以通过第三方工具创建

--m 1    运行MapReduce的数量

sqoop1.4.6数据迁移

sqoop1.4.6数据迁移

2、导入关系表到hive

bin/sqoop import --connect jdbc:mysql://hadoop1:3306/userdb --username root --password admin --table emp --hive-import --m 1

sqoop1.4.6数据迁移

sqoop1.4.6数据迁移

3、导入到HDFS指定目录

bin/sqoop import \

--connect jdbc:mysql://hadoop1:3306/userdb \

--username root \

--password admin \

--target-dir /queryresult \

--table emp_add

--m 1

sqoop1.4.6数据迁移

4、导入表数据子集

bin/sqoop import \

--connect jdbc:mysql://hadoop1:3306/userdb \

--username root \

--password admin \

--where "city ='sec-bad'" \

--target-dir /wherequery \

--table emp_add

--m 1

sqoop1.4.6数据迁移

5、增量导入

增量导入是仅导入新添加的表中的行的技术

它需要添加‘incremental’, ‘check-column’, 和 ‘last-value’选项来执行增量导入。

假设新添加的数据转换成emp表如下:

1206, satish p, grp des, 20000, GR

bin/sqoop import \

--connect jdbc:mysql://hadoop1:3306/userdb \

--username root \

--password admin \

--table emp

--m 1 \

--incremental append \

--check-column id \

--last-value 1205      上次表中最后一行的id,这个id以后的就是新增的!

sqoop1.4.6数据迁移

sqoop的数据导出

首先确保hdfs中有所要导出的数据存在!!!

1、首先需要手动创建mysql中的目标表

$ mysql

mysql> USE userdb;

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://hadoop1:3306/userdb \

--username root \

--password admin \

--table employee \

--export-dir /user/root/emp/   位于hdfs中的要导出的数据路径

3、验证表mysql命令行。

sqoop1.4.6数据迁移

上一篇:和我一起学python,控制语句 (life is short ,we need python)


下一篇:【Hadoop离线基础总结】Sqoop数据迁移