sqoop 數據遷移
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
sqoop 數據遷移