sqoop1.4.6数据迁移

sqoop介绍

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

导入数据MySQLOracle导入数据到HadoopHDFSHIVEHBASE等数据存储系统;

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

 

sqoop工作机制

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

在翻译出的mapreduce中主要是对inputformatoutputformat进行定制

 

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

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

 

Sqoop的数据导入

1、导入表数据到HDFS

mysql中有一个库userdb中三个表:emp, emp_addemp_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的数量

 

2、导入关系表到hive

 

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

 

3、导入到HDFS指定目录

 

bin/sqoop import \

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

--username root \

--password admin \

--target-dir /queryresult \

--table emp_add

--m 1

 

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

 

 

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以后的就是新增的!

 

 

 

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命令行。

 

 

posted @ 2017-05-11 11:38  ahu-lichang  阅读(724)  评论(0编辑  收藏  举报