1. 程式人生 > >Sqoop 資料遷移工具

Sqoop 資料遷移工具

目錄

1.概述

2.工作機制

3.Sqoop安裝

4.Sqoop基本命令介紹

5.Sqoop資料匯入

5.1.匯入MySQL資料到HDFS

5.1.1.普通匯入

5.1.2.指定分隔符和匯入路徑

5.1.3.匯入where條件資料

5.1.4.匯入Query結果資料

5.2.匯入MySQL資料到Hive

5.2.1.普通匯入

5.2.2.增量匯入

5.3.匯入MySQL資料到HBase

6.Sqoop資料匯出

6.1.匯出HDFS資料到MySQL

6.2.匯出Hive資料到MySQL

6.3.匯出HBase資料到MySQL

7.Sqoop匯入匯出的原理剖析

7.1.Sqoop匯入原理

7.2.Sqoop匯出原理

8.資料


1.概述

sqoop 是 apache 旗下一款“Hadoop 和關係資料庫伺服器之間傳送資料”的工具。

匯入資料:MySQL,Oracle 匯入資料到 Hadoop 的 HDFS、HIVE、HBASE 等資料儲存系統
匯出資料:從 Hadoop 的檔案系統中匯出資料到關係資料庫 mysql 等

Sqoop 的本質還是一個命令列工具,和 HDFS,Hive 相比,並沒有什麼高深的理論。

2.工作機制

本質上是將sqoop的命令轉換為MR任務,並自定義輸入/輸出,而且只需要maptask就可以完成。

資料匯入時,map端的資料來源是關係型資料庫,由DBInputFormat類讀取,一條資料一條資料讀取,將資料直接寫到hadoop平臺就可以了。和自己前面寫MR相比,相當於自定義了資料輸入(關係型資料庫的輸入)。

資料匯出時,map端資料來源是大資料平臺,一條資料一條資料讀取,將資料寫出到關係型資料庫,由DBOutputFormat類寫出,相當於自定義了輸出。

 

3.Sqoop安裝

安裝 Sqoop 的前提是已經具備 Java 和 Hadoop 的環境。

安裝包下載地址 http://ftp.wayne.edu/apache/sqoop/1.4.6/
安裝包:sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz

安裝步驟

1.準備安裝包 sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz

2.解壓安裝包到安裝目錄
tar -zxvf sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar.gz -C apps/
cd apps
mv sqoop-1.4.6.bin_hadoop-2.0.4-alpha/ sqoop-1.4.6

3.進入到 conf 資料夾,找到 sqoop-env-template.sh,修改其名稱為 sqoop-env.sh
cd conf
mv sqoop-env-template.sh sqoop-env.sh

4.修改 sqoop-env.sh

export HADOOP_COMMON_HOME=/home/hadoop/apps/hadoop-2.6.5
export HADOOP_MAPRED_HOME=/home/hadoop/apps/hadoop-2.6.5
export HBASE_HOME=/home/hadoop/apps/hbase-1.2.6
export HIVE_HOME=/home/hadoop/apps/apache-hive-1.2.1-bin
export ZOOCFGDIR=/home/hadoop/apps/zookeeper-3.4.10/conf
zookeeper 和 hbase 沒有安裝。那就不用管了。如果也安裝的有,並且要使用,那麼就給配置上。

5. 加入 mysql 驅動包到 sqoop1.4.6/lib 目錄下
cp mysql-connector-java-5.1.40-bin.jar ~/apps/sqoop1.4.6/lib/

6.配置系統環境變數
vi ~/.bashrc
然後輸入:
export SQOOP_HOME=/home/hadoop/apps/sqoop1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
然後儲存退出
source ~/.bashrc

7.驗證安裝是否成功
sqoop-version 或者 sqoop version

8.出現如圖所示畫面,證明安裝成功,那麼接下來就可以正常使用了。

4.Sqoop基本命令介紹

首先,我們可以使用 sqoop help 來檢視,sqoop 支援哪些命令

然後得到這些支援了的命令之後,如果不知道使用方式,可以使用 sqoop command 的方式來檢視某條具體命令的使用方式,比如:sqoop help import

5.Sqoop資料匯入

“匯入工具”匯入單個表從 RDBMS 到 HDFS。表中的每一行被視為 HDFS 的記錄。所有記錄都儲存為文字檔案的文字資料(或者 Avro、sequence 檔案等二進位制資料)。

下面的語法用於將資料匯入 HDFS
sqoop import (generic-args) (import-args)

常用引數:

示例:

先看 Mysql 表資料:這是 mysql 中 help_keyword 表的資料

5.1.匯入MySQL資料到HDFS

5.1.1.普通匯入

sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
-m 1

如果我們沒有給該命令指定匯出的檔案的儲存路徑,那麼預設會儲存在 HDFS 上的 /user/hadoop/help_keyword 目中。其中,第一個 user 是固定的,第二個 hadoop,表示連結的使用者名稱,第三個表示表名。

檢視結果:
執行過程結果:

HDFS 上檔案結果:

可以下載下來使用本地文字編輯器檢視比對結果(檔案內容結果)

也可以使用 hadoop 命令檢視:hadoop fs -cat /user/hadoop/help_keyword/part-m-00000

從以上結果可以得出一個結論:如果沒有指定路徑,則會按預設規則生成路徑,如果沒有指定分隔符,預設按照逗號分隔。

5.1.2.指定分隔符和匯入路徑

先看指定匯入路徑的語法規則:
--target-dir <new or exist directory in HDFS>

再看指定匯入的文字檔案的列分隔符:
--fields-terminated-by '\t'

看具體例項:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/my_help_keyword \
--fields-terminated-by '\t' \
-m 1

看結果:

hadoop fs -cat /user/hadoop/my_help_keyword/part-m-00000

5.1.3.匯入where條件資料

我們可以匯入表的使用 Sqoop 匯入工具,"where"子句的一個子集。它執行在各自的資料庫伺服器相應的 SQL 查詢,並將結果儲存在 HDFS 的目標目錄。

where 子句的語法如下。
--where <condition>

下面我們看具體例項:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--where "name='STRING' " \
--table help_keyword \
--target-dir /sqoop/hadoop/myoutport1 \
-m 1

看執行結果:

看匯出的文字結果:
hadoop fs -cat /sqoop/hadoop/myoutport1/part-m-00000

5.1.4.匯入Query結果資料

sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--target-dir /user/hadoop/myimport2 \
--query 'select help_keyword_id,name from help_keyword WHERE name = "STRING" and 
$CONDITIONS' \
--split-by help_keyword_id \

--fields-terminated-by '\t' \
-m 1
注意:外層使用單引號,SQL 語句當中的條件使用雙引號,否則會報錯或者這麼寫:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--target-dir /user/hadoop/myimport22 \
--query "select help_keyword_id,name from help_keyword WHERE name = 'STRING' and 
\$CONDITIONS" \
--split-by help_keyword_id \

--fields-terminated-by '\t' \
-m 1

檢視執行結果:

5.2.匯入MySQL資料到Hive

Sqoop 匯入關係型資料到 hive 的過程是先匯入到 hdfs,然後再 load 進入 hive。

5.2.1.普通匯入

示例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hive-import \
-m 1
注意:匯入資料到 hive 表,預設表在 default 庫下,表名一樣,採用'\u0001'分隔
檢視執行結果:

檢視結果,確實生成結果在 hive 的 default 庫中,查看錶資料:
hive> select * from help_keyword limit 3;

接下來,再看一例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--hive-table mydb_test.new_help_keyword \
--delete-target-dir

注意:表會自動建立,但是庫不會。所以在執行該語句之前,一定要確保 hive 的資料庫mydb_test 是存在的,否則程式會報錯

檢視執行結果:

5.2.2.增量匯入

增量匯入是僅匯入表中新新增的行的技術。
它需要新增 'incremental' , 'check-column', 和 'last-value' 選項來執行增量匯入。
下面的語法結構用於 Sqoop 匯入命令增量選項。
--incremental <mode>
--check-column <column name>
--last value <last check column value>

下面的命令執行增量匯入:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/myimport3 \
--incremental append \
--check-column help_keyword_id \
--last-value 500 \

-m 1
此處結果不包含 help_keyword_id = 500 資料,資料是大於 500 的

檢視執行結果:

 

5.3.匯入MySQL資料到HBase

首先看示例:
sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family person \
--hbase-row-key help_keyword_id

欄位解釋:
--connect jdbc:mysql://hadoop04:3306/mysql 表示遠端或者本地 Mysql 服務的 URI
--hbase-create-table 表示在 HBase 中建立表。
--hbase-table new_help_keyword 表示在 HBase 中建立表 new_help_keyword。
--hbase-row-key help_keyword_id 表示hbase表的rowkey是mysql表的help_keyword_id欄位。
--column-family person 表示在表 new_help_keyword 中建立列族 person。
--username 'root' 表示使用使用者 root 連線 mysql。
--password 'root' 連線 mysql 的使用者密碼
--table help_keyword 表示匯出 mysql 資料庫的 help_keyword 表。

看結果:

6.Sqoop資料匯出

6.1.匯出HDFS資料到MySQL

注意:匯出前,目標表必須存在於目標資料庫中

HDFS:hadoop distributed file system
RDBMS:Relation DataBase Manager System
OOP:orentied object programming
AOP:orentied aspect programming

預設操作是從將檔案中的資料使用 INSERT 語句插入到表中
更新模式下,是生成 UPDATE 語句更新表資料

Export 語法結構:
sqoop export (generic-args) (export-args)

Export 常用引數:

第一步,先看需要匯出到 mysql 的資料:

然後第二步,需要首先在 mysql 資料庫中新建表:

create database sqoopdb default character set utf8 COLLATE utf8_general_ci; 
use sqoopdb;
CREATE TABLE sqoopstudent ( 
 id INT NOT NULL PRIMARY KEY, 
 name VARCHAR(20), 
 sex VARCHAR(20),
 age INT,
department VARCHAR(20)
);

第三步,執行匯出:
sqoop export \
--connect jdbc:mysql://hadoop02:3306/sqoopdb \
--username root \
--password root \
--table sqoopstudent \
--export-dir /sqoopdata \
--fields-terminated-by ','

檢視結果:

注意:如果匯出資料到 mysql 出現亂碼,那麼請參考這個解決方案

https://my.oschina.net/u/559635/blog/498990

6.2.匯出Hive資料到MySQL

sqoop export \
--connect jdbc:mysql://hadoop02:3306/sqoopdb \
--username root \
--password root \
--table uv_info \
--export-dir /user/hive/warehouse/uv/dt=2011-08-03 \
--input-fields-terminated-by '\t'
其實跟直接匯出 HDFS 資料到 MySQL 沒什麼兩樣

6.3.匯出HBase資料到MySQL

很遺憾,現在還沒有直接的命令將 HBase 的資料匯出到 MySQL
一般採用如下 3 種方法:
1.將 Hbase 資料,扁平化成 HDFS 檔案,然後再由 sqoop 匯入
2.將 Hbase 資料匯入 Hive 表中,然後再匯入 mysql
3.直接使用 Hbase 的 Java API 讀取表資料,直接向 mysql 匯入,不需要使用 sqoop

7.Sqoop匯入匯出的原理剖析

7.1.Sqoop匯入原理

從上面的演示例子中,我們大致能得出一個結論,sqoop 工具是通過 MapReduce 進行匯入作業的。總體來說,是把關係型資料庫中的某張表的一行行記錄都寫入到 hdfs

下面給大家奉上一張原理圖:

上面這張圖大致解釋了 sqoop 在進行資料匯入工作的大致流程,下面我們用文字來詳細描述一下:
1.第一步,Sqoop 會通過 JDBC 來獲取所需要的資料庫元資料,例如,匯入表的列名,資料型別等。
2.第二步,這些資料庫的資料型別(varchar, number 等)會被對映成 Java 的資料型別(String, int等),根據這些資訊,Sqoop 會生成一個與表名同名的類用來完成序列化工作,儲存表中的每一行記錄。
3.第三步,Sqoop 啟動 MapReducer 作業
4.第四步,啟動的作業在 input 的過程中,會通過 JDBC 讀取資料表中的內容,這時,會使用 Sqoop 生成的類進行反序列化操作
5.第五步,最後將這些記錄寫到 HDFS 中,在寫入到 HDFS 的過程中,同樣會使用 Sqoop 生成的類進行反序列化。

7.2.Sqoop匯出原理

Sqoop 進行資料匯出,總體也是基於 mapreduce 任務。

下面先看圖:

詳細文字描述:
1.第一步,sqoop 依然會通過 JDBC 訪問關係型資料庫,得到需要匯出資料的元資料資訊
2.第二步,根據獲取到的元資料的資訊,sqoop 生成一個 Java 類,用來進行資料的傳輸載體。該類必須實現序列化和反序列化
3.第三步,啟動 mapreduce 作業
4.第四步,sqoop 利用生成的這個 java 類,並行的從 hdfs 中讀取資料
5.第五步,每個 map 作業都會根據讀取到的匯出表的元資料資訊和讀取到的資料,生成一批 insert 語句,然後多個 map 作業會並行的向資料庫 mysql 中插入資料。

所以,資料是從 hdfs 中並行的進行讀取,也是並行的進入寫入,那並行的讀取是依賴 hdfs的效能,而並行的寫入到 mysql 中,那就要依賴於 mysql 的寫入效能嘞。

8.資料

Sqoop 詳細可以參照我的部落格:

http://blog.csdn.net/zhongqi2513/article/details/52777727

http://blog.csdn.net/zhongqi2513/article/details/53281255

當然最重要的是官網文件:

http://sqoop.apache.org/docs/