sqoop 数据迁移
1 概述
sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统。
导出数据:从Hadoop的文件系统中导出数据到关系数据库。
2 工作机制
将导入或导出命令翻译成mapreduce程序来实现。
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
3 sqoop 安装
安装sqoop的前提是已经具备java和hadoop的环境。
3.1 下载并解压
http://ftp.wayne.edu/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
3.2 修改配置文件
$ cd $SQOOP_HOME/conf $ mv sqoop-env-template.sh sqoop-env.sh 打开sqoop-env.sh并编辑下面几行: export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.1/ export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.1/ export HIVE_HOME=/home/hadoop/apps/hive-1.2.1
3.3 加入mysql的jdbc驱动
cp ~/app/hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
3.4 启动验证
$ cd $SQOOP_HOME/bin $ sqoop-version
输出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
到这里,整个Sqoop安装工作完成
4 数据导入
4.1 下面的命令用于从MySQL数据库服务器中的emp表导入HDFS
$bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test \ --username root --password root --table emp --m 1
4.2 导入数据到HIVE
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1
4.3 导入到HDFS指定目录
--target-dir <new or exist directory in HDFS>
下面的命令是用来导入emp_add表数据到‘/queryresult‘目录。
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test \ --username root --password root --target-dir /queryresult --table emp --m 1
4.4 导入表数据子集
我们可以导入表的使用Sqoop导入工具,"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
where子句的语法如下。
--where <condition>
下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为:Secunderabad
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test \ --username root --password root --where "city =‘sec-bad‘" --target-dir /wherequery --table emp_add --m 1
4.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://hdp-node-01:3306/test \ --username root --password root --table emp --m 1 --incremental append --check-column id --last-value 1205
5 数据导出
将数据从HDFS导出到RDBMS数据库。
导出前,目标表必须存在于目标数据库中。
默认操作是从将文件中的数据使用INSERT语句插入到表中。
更新模式下,是生成UPDATE语句更新表数据。
语法:
$ sqoop export (generic-args) (export-args)
5.1 将hdfs数据导出到mysql
1)首先在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://hdp-node-01:3306/test \ --username root --password root --table employee --export-dir /user/hadoop/emp/
6 sqoop 作业
6.1创建作业
在这里,我们创建一个名为myjob,这可以从RDBMS表的数据导入到HDFS作业。
bin/sqoop job --create myimportjob -- import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1
该命令创建了一个从db库的employee表导入到HDFS文件的作业。
6.2 验证作业(--list)
$ sqoop job --list
它显示了保存作业列表。
Available jobs:
myjob
‘--show’ 参数用于检查或验证特定的工作,及其详细信息
$ sqoop job --show myjob
6.3 执行作业
‘--exec’ 选项用于执行保存的作业。下面的命令用于执行保存的作业称为myjob。
$ sqoop job --exec myjob