近期接觸了一個需求,業務背景是需要將關系型數據庫的數據傳輸至HDFS進行計算,計算完成后再將計算結果傳輸回關系型數據庫。聽到這個背景,腦海中就蹦出了Sqoop遷移工具,可以非常完美的支持上述場景。
當然,數據傳輸工具還有很多,例如Datax、Kettle等等,大家可以針對自己的工作場景選擇適合自己的遷移工具。
目錄
一、介紹
二、架構
三、安裝
1. 下載Sqoop
2. 配置環境變量
四、操作
1. 列出數據庫
2. 列出數據表
3. MySQL導入到HDFS
4. HDFS導出到MySQL
一、介紹
Sqoop的命名,仔細一看是不是有點像 sql 和 hadoop 兩個詞語的拼接產物。其實從它的命名來看也就很明顯,Sqoop是一個用來將Hadoop和關系型數據庫中的數據相互轉移的工具,可以將一個關系型數據庫(例如:MySQL、Oracle、Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關系型數據庫中。對於某些NoSQL數據庫它也提供了連接器。Sqoop,類似於其他ETL工具,使用元數據模型來判斷數據類型並在數據從數據源轉移到Hadoop時確保類型安全的數據處理。Sqoop專為大數據批量傳輸設計,能夠分割數據集並創建Hadoop任務來處理每個區塊。
從關系型數據庫到 hadoop 我們稱之為 import,從 hadoop 到關系型數據庫我們稱之為 export。文章后面大家就會看到 "import"、"export" 對應命令的兩個模式。
二、架構
三、安裝
前提:已經安裝好JDK和Hadoop集群,若沒安裝,請參考:分布式計算(一)Ubuntu搭建Hadoop分布式集群
1. 下載Sqoop
Sqoop安裝包可以從官網下載:http://sqoop.apache.org/
從官網可以看到,Sqoop有兩個大的版本:Sqoop1和Sqoop2。
1.4.x 的為 Sqoop1,1.99.X 為 Sqoop2。
關於 Sqoop1 與 Sqoop2 的區別,通俗來講就是:
- sqoop1 只是一個客戶端工具,Sqoop2 加入了 Server 來集中化管理連接器
- Sqoop1 通過命令行來工作,工作方式單一,Sqoop2 則有更多的方式來工作,比如 REST api接口、Web 頁
- Sqoop2 加入權限安全機制
對於筆者來說,Sqoop 就是一個同步工具,命令行足夠滿足工作需求,並且大部分數據同步都是在同一個局域網內部(也就沒有數據安全之類問題),所以選擇的是 Sqoop1(具體版本是 1.4.7)。
下載好了之后,在你想安裝的路徑下進行解壓, 這里選擇將Hadoop 安裝到當前路徑下:
# tar xvzf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz # mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
2. 配置環境變量
# vi /etc/profile export SQOOP_HOME=/root/sqoop export PATH=$PATH:$SQOOP_HOME/bin
使得sqoop命令在當前終端立即生效
# source /etc/profile
配置好環境變量后,將數據庫連接驅動放入 $SQOOP_HOME/lib 目錄中。這里使用的是MySQL數據庫,選擇的MySQL連接驅動mysql-connector-java-5.1.46.jar ,當然,如果你使用的是其他關系型數據庫,相應的就需要導入其他關系型數據庫的jar包。
四、操作
了解了 Sqoop 是什么,能做什么以及大概的框架原理,接下來我們直接使用 Sqoop 命令來感受一下使用 Sqoop 是如何簡單及有效。本文案例中的關系型數據庫使用的是 MySQL,Oracle 以及其他使用 jdbc 連接的關系型數據庫操作類似,差別不大。
運行 sqoop help 可以看到 Sqoop 提供了哪些操作
# sqoop help 19/04/09 22:37:04 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import Import a table from a database to HDFS import-all-tables Import tables from a database to HDFS import-mainframe Import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information See 'sqoop help COMMAND' for information on a specific command.
這些操作其實都會一一對應到 sqoop bin 目錄下的一個個可運行腳本文件,如果想了解細節,可以打開這些腳本進行查看
# ll bin/ total 96 drwxr-xr-x 2 1000 1000 4096 Dec 19 2017 ./ drwxr-xr-x 9 1000 1000 4096 Dec 19 2017 ../ -rwxr-xr-x 1 1000 1000 6770 Dec 19 2017 configure-sqoop* -rwxr-xr-x 1 1000 1000 6533 Dec 19 2017 configure-sqoop.cmd* -rwxr-xr-x 1 1000 1000 3133 Dec 19 2017 sqoop* -rwxr-xr-x 1 1000 1000 1055 Dec 19 2017 sqoop.cmd* -rwxr-xr-x 1 1000 1000 3060 Dec 19 2017 sqoop-codegen* -rwxr-xr-x 1 1000 1000 3070 Dec 19 2017 sqoop-create-hive-table* -rwxr-xr-x 1 1000 1000 3057 Dec 19 2017 sqoop-eval* -rwxr-xr-x 1 1000 1000 3059 Dec 19 2017 sqoop-export* -rwxr-xr-x 1 1000 1000 3057 Dec 19 2017 sqoop-help* -rwxr-xr-x 1 1000 1000 3059 Dec 19 2017 sqoop-import* -rwxr-xr-x 1 1000 1000 3070 Dec 19 2017 sqoop-import-all-tables* -rwxr-xr-x 1 1000 1000 3069 Dec 19 2017 sqoop-import-mainframe* -rwxr-xr-x 1 1000 1000 3056 Dec 19 2017 sqoop-job* -rwxr-xr-x 1 1000 1000 3067 Dec 19 2017 sqoop-list-databases* -rwxr-xr-x 1 1000 1000 3064 Dec 19 2017 sqoop-list-tables* -rwxr-xr-x 1 1000 1000 3058 Dec 19 2017 sqoop-merge* -rwxr-xr-x 1 1000 1000 3062 Dec 19 2017 sqoop-metastore* -rwxr-xr-x 1 1000 1000 3060 Dec 19 2017 sqoop-version* -rwxr-xr-x 1 1000 1000 3987 Dec 19 2017 start-metastore.sh* -rwxr-xr-x 1 1000 1000 1564 Dec 19 2017 stop-metastore.sh*
工作中一般常用的幾個操作或者命令如下:
- list-databases : 查看有哪些數據庫
- list-tables : 查看數據庫中有哪些表
- import : 關系型數據庫到 hadoop 數據同步
- export : hadoop 到關系型數據庫數據同步
- version :查看 Sqoop 版本
1. 列出數據庫
# sqoop list-databases --connect jdbc:mysql://192.168.1.123:3306/?useSSL=false --username root --password 12345678
2. 列出數據表
# sqoop list-tables --connect jdbc:mysql://192.168.1.123:3306/databasename?useSSL=false --username root --password 12345678
3. MySQL導入HDFS
# sqoop import --connect jdbc:mysql://192.168.1.123:3306/databasename?useSSL=false --username root --password 12345678 --table product --target-dir /hadoopDir/ --fields-terminalted-by '\t' -m 1 --columns 'PRODUCT_ID,PRODUCT_NAME,LIST_PRICE,QUANTITY,CREATE_TIME' --last-value num --incremental append
--where 'QUANTITY > 500'
選項 | 說明 |
--connect | 數據庫的 JDBC URL,后面的 databasename 想要連接的數據庫名稱 |
--table | 數據庫表 |
--username | 數據庫用戶名 |
--password | 數據庫密碼 |
--target-dir | HDFS 目標目錄,不指定,默認和數據庫表名一樣 |
--fields-terminated-by | 數據導入后每個字段之間的分隔符,不指定,默認為逗號 |
-m | mapper 的並發數量 |
--columns | 指定導入時的參考列,這里是PRODUCT_ID,PRODUCT_NAME,LIST_PRICE,QUANTITY,CREATE_TIME |
--last-value | 上一次導入的最后一個值 |
--incremental append | 導入方式為增量 |
--where | 按條件篩選數據,where條件的內容必須在單引號內 |
注意:工作中需要增量同步的場景下,我們就可以使用 --incremental append 以及 --last-value。比如這里我們使用 id 來作為參考列,如果上次同步到了 1000, 這次我們想只同步新的數據,就可以帶上參數 --last-value 1000。
4. HDFS導出MySQL
# sqoop export --connect 'jdbc:mysql://192.168.1.123:3306/databasename?useSSL=false&useUnicode=true&characterEncoding=utf-8' --username root --password '12345678' --table product --m 1 --export-dir /hadoopDir/ --input-fields-terminated-by '\t' --columns 'PRODUCT_ID,PRODUCT_NAME,LIST_PRICE,QUANTITY,CREATE_TIME'
HDFS導出到MySQL時,數據有可能亂碼,此時需要在--connect參數中指定編碼。
問題
1. Sqoop配置好后,執行sqoop命令會出現以下日志:
# sqoop job -list Warning: /root/sqoop/../hbase does not exist! HBase imports will fail. Please set $HBASE_HOME to the root of your HBase installation. Warning: /root/sqoop/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /root/sqoop/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. Warning: /root/sqoop/../zookeeper does not exist! Accumulo imports will fail. Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation. 19/04/10 00:32:50 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 Available jobs:
此時只需要在sqoop的安裝路徑下創建hbase、hcatalog、accumulo、zookeeper的空目錄即可解決問題。