分布式計算(二)使用Sqoop實現MySQL與HDFS數據遷移


近期接觸了一個需求,業務背景是需要將關系型數據庫的數據傳輸至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" 對應命令的兩個模式。

二、架構

通過上圖可以看出,Sqoop Client 通過 shell 命令來使用 Sqoop,Sqoop 中的 Task Translater 將命令轉換成 Hadoop 中的 MapReduce 任務進行具體的數據操作。可以這樣理解,例如 Mysql 中某個表數據同步到 Hadoop 這個場景,Sqoop 會將表記錄分成多份,每份分到各自 Mapper 中去進行落地 Hadoop(保證同步效率)。大家可能發現,其實這里的 MapReduce沒有 reduce,只有 map。

三、安裝

前提:已經安裝好JDK和Hadoop集群,若沒安裝,請參考:分布式計算(一)Ubuntu搭建Hadoop分布式集群

 1. 下載Sqoop

Sqoop安裝包可以從官網下載:http://sqoop.apache.org/

從官網可以看到,Sqoop有兩個大的版本:Sqoop1和Sqoop2。

1.4.x 的為 Sqoop1,1.99.X 為 Sqoop2。

關於 Sqoop1 與 Sqoop2 的區別,通俗來講就是:

  1. sqoop1 只是一個客戶端工具,Sqoop2 加入了 Server 來集中化管理連接器
  2. Sqoop1 通過命令行來工作,工作方式單一,Sqoop2 則有更多的方式來工作,比如 REST api接口、Web 頁
  3. 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*

工作中一般常用的幾個操作或者命令如下:

  1. list-databases : 查看有哪些數據庫
  2. list-tables : 查看數據庫中有哪些表
  3. import : 關系型數據庫到 hadoop 數據同步
  4. export : hadoop 到關系型數據庫數據同步
  5. 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的空目錄即可解決問題。

 

參考:Sqoop教程(一) Sqoop數據遷移工具

Mysql 與 hadoop 數據同步(遷移),你需要知道 Sqoop


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM