sqoop數據遷移
概述
sqoop是apache旗下一款“Hadoop和關系數據庫服務器之間傳送數據”的工具。
導入數據:MySQL,Oracle導入數據到Hadoop的HDFS、HIVE、HBASE等數據存儲系統;
導出數據:從Hadoop的文件系統中導出數據到關系數據庫
工作機制
將導入或導出命令翻譯成mapreduce程序來實現
在翻譯出的mapreduce中主要是對inputformat和outputformat進行定制
sqoop實戰及原理
sqoop安裝
安裝sqoop的前提是已經具備java和hadoop的環境
1.下載並解壓
最新版下載地址http://ftp.wayne.edu/apache/sqoop/1.4.6/
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、加入mysql的 jdbc驅動包
cp ~/app/hive/lib/mysql-connector-java-5.1.28.jar $SQOOP_HOME/lib/
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安裝工作完成。
Sqoop的數據導入
“導入工具”導入單個表從RDBMS到HDFS。表中的每一行被視為HDFS的記錄。所有記錄都存儲為文本文件的文本數據(或者Avro、sequence文件等二進制數據)
語法
下面的語法用於將數據導入HDFS。
$ sqoop import (generic-args) (import-args) |
導入表表數據到HDFS
下面的命令用於從MySQL數據庫服務器中的emp表導入HDFS。
$bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --m 1
m是啟動reduce個數的的意思。
為了驗證在HDFS導入的數據,請使用以下命令查看導入的數據
$ $HADOOP_HOME/bin/hadoop fs -cat /user/hadoop/emp/part-m-00000
如果報錯:
從錯誤信息中需要訪問端口 10020 可以大概看出,DataNode 需要訪問 MapReduce JobHistory Server,如果沒有修改則用默認值:0.0.0.0:10020 。需要修改配置文件 mapred-site.xml :
[html] view plain copy <property> <name>mapreduce.jobhistory.address</name> <!-- 配置實際的主機名和端口--> <value>master:10020</value> </property>
並且啟動MapReduce JobHistory Server服務:
在namenode上執行命令:
1.sbin/mr-jobhistory-daemon.sh start historyserver
導入關系表到HIVE
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --table emp --hive-import --m 1
導入到HDFS指定目錄
在導入表數據到HDFS使用Sqoop導入工具,我們可以指定目標目錄。
以下是指定目標目錄選項的Sqoop導入命令的語法。
--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
下面的命令是用來驗證 /queryresult 目錄中 emp_add表導入的數據形式。
$HADOOP_HOME/bin/hadoop fs -cat /queryresult/part-m-* |
它會用逗號(,)分隔emp_add表的數據和字段。
1201, 288A, vgiri, jublee 1202, 108I, aoc, sec-bad 1203, 144Z, pgutta, hyd 1204, 78B, oldcity, sec-bad 1205, 720C, hitech, sec-bad |
導入表數據子集
我們可以導入表的使用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
按需導入
bin/sqoop import --connect jdbc:mysql://hdp-node-01:3306/test --username root --password root --target-dir /wherequery2 --query ‘select id,name,deg from emp WHERE id>1207 and $CONDITIONS‘ --split-by id --fields-terminated-by ‘\t‘ --m 1
下面的命令用來驗證數據從emp_add表導入/wherequery目錄
$HADOOP_HOME/bin/hadoop fs -cat /wherequery/part-m-* |
增量導入
增量導入是僅導入新添加的表中的行的技術。
它需要添加‘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 1208
Sqoop的數據導出
將數據從HDFS導出到RDBMS數據庫
導出前,目標表必須存在於目標數據庫中。
- 默認操作是從將文件中的數據使用INSERT語句插入到表中
- 更新模式下,是生成UPDATE語句更新表數據
語法
以下是export命令語法。
$ sqoop export (generic-args) (export-args) |
數據是在HDFS 中“EMP/”目錄的emp_data文件中。所述emp_data如下:
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中的目標表
$ 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)); |
然後執行導出命令
bin/sqoop export \ --connect jdbc:mysql://hdp-node-01:3306/test \ --username root \ --password root \ --table employee \ --export-dir /user/hadoop/emp/ |
驗證表mysql命令行。
mysql>select * from employee; 如果給定的數據存儲成功,那麽可以找到數據在如下的employee表。 +------+--------------+-------------+-------------------+--------+ | Id | Name | Designation | Salary | Dept | +------+--------------+-------------+-------------------+--------+ | 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 | +------+--------------+-------------+-------------------+--------+ |
sqoop數據遷移