DataX的知識碎片

yu_lu發表於2024-07-10

DATAX概覽

DataX 是一個異構資料來源離線同步工具,致力於實現包括關係型資料庫(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各種異構資料來源之間穩定高效的資料同步功能。

  • 設計理念

    為了解決異構資料來源同步問題,DataX將複雜的網狀的同步鏈路變成了星型資料鏈路,DataX作為中間傳輸載體負責連線各種資料來源。當需要接入一個新的資料來源的時候,只需要將此資料來源對接到DataX,便能跟已有的資料來源做到無縫資料同步。

  • 當前使用現狀

    DataX在阿里巴巴集團內被廣泛使用,承擔了所有大資料的離線同步業務,並已持續穩定執行了6年之久。目前每天完成同步8w多道作業,每日傳輸資料量超過300TB。

DataX框架設計

DataX本身作為離線資料同步框架,採用Framework + plugin架構構建。將資料來源讀取和寫入抽象成為Reader/Writer外掛,納入到整個同步框架中。

  • Reader:Reader為資料採集模組,負責採集資料來源的資料,將資料傳送給Framework。
  • Writer: Writer為資料寫入模組,負責不斷向Framework取資料,並將資料寫入到目的端。
  • Framework:Framework用於連線reader和writer,作為兩者的資料傳輸通道,並處理緩衝,流控,併發,資料轉換等核心技術問題。

DataX外掛體系

經過幾年積累,DataX目前已經有了比較全面的外掛體系,主流的RDBMS資料庫、NOSQL、大資料計算系統都已經接入。DataX目前支援資料如下:

型別 資料來源 Reader(讀) Writer(寫) 文件
RDBMS 關係型資料庫 MySQL
Oracle
OceanBase
SQLServer
PostgreSQL
DRDS
達夢
通用RDBMS(支援所有關係型資料庫)
阿里雲數倉資料儲存 ODPS
ADS
OSS
OCS
NoSQL資料儲存 OTS
Hbase0.94
Hbase1.1
MongoDB
Hive
無結構化資料儲存 TxtFile
FTP
HDFS
Elasticsearch

DataX Framework提供了簡單的介面與外掛互動,提供簡單的外掛接入機制,只需要任意加上一種外掛,就能無縫對接其他資料來源。

DataX核心架構

核心模組介紹:

  1. DataX完成單個資料同步的作業,我們稱之為Job,DataX接受到一個Job之後,將啟動一個程序來完成整個作業同步過程。DataX Job模組是單個作業的中樞管理節點,承擔了資料清理、子任務切分(將單一作業計算轉化為多個子Task)、TaskGroup管理等功能。
  2. DataXJob啟動後,會根據不同的源端切分策略,將Job切分成多個小的Task(子任務),以便於併發執行。Task便是DataX作業的最小單元,每一個Task都會負責一部分資料的同步工作。
  3. 切分多個Task之後,DataX Job會呼叫Scheduler模組,根據配置的併發資料量,將拆分成的Task重新組合,組裝成TaskGroup(任務組)。每一個TaskGroup負責以一定的併發執行完畢分配好的所有Task,預設單個任務組的併發數量為5。
  4. 每一個Task都由TaskGroup負責啟動,Task啟動後,會固定啟動Reader—>Channel—>Writer的執行緒來完成任務同步工作。
  5. DataX作業執行起來之後, Job監控並等待多個TaskGroup模組任務完成,等待所有TaskGroup任務完成後Job成功退出。否則,異常退出,程序退出值非0

DataX排程流程:

舉例來說,使用者提交了一個DataX作業,並且配置了25個併發,目的是將一個100張分表的mysql資料同步到odps裡面。 DataX的排程決策思路是:

  1. DataXJob根據分庫分表切分成了100個Task。
  2. 根據25個併發,DataX計算共需要分配4個TaskGroup
  3. 4個TaskGroup平分切分好的100個Task,每一個TaskGroup負責以5個併發共計執行25個Task。

DataX六大核心優勢

  • 可靠的資料質量監控

    • 完美解決資料傳輸個別型別失真問題
    • 提供作業全鏈路的流量、資料量執行時監控
    • 提供髒資料探測
  • 豐富的資料轉換功能

    DataX作為一個服務於大資料的ETL工具,除了提供資料快照搬遷功能之外,還提供了豐富資料轉換的功能,讓資料在傳輸過程中可以輕鬆完成資料脫敏,補全,過濾等資料轉換功能,另外還提供了自動groovy函式,讓使用者自定義轉換函式。

  • 精準的速度控制

    新版本DataX3.0提供了包括通道(併發)、記錄流、位元組流三種流控模式,可以隨意控制你的作業速度,讓你的作業在庫可以承受的範圍內達到最佳的同步速度。

    "speed": {
       "channel": 5,
       "byte": 1048576,
       "record": 10000
    }
    
  • 強勁的同步效能

    DataX3.0每一種讀外掛都有一種或多種切分策略,都能將作業合理切分成多個Task並行執行,單機多執行緒執行模型可以讓DataX速度隨併發成線性增長。在源端和目的端效能都足夠的情況下,單個作業一定可以打滿網路卡。另外,DataX團隊對所有的已經接入的外掛都做了極致的效能最佳化,並且做了完整的效能測試

  • 健壯的容錯機制

    DataX作業是極易受外部因素的干擾,網路閃斷、資料來源不穩定等因素很容易讓同步到一半的作業報錯停止。因此穩定性是DataX的基本要求,在DataX 3.0的設計中,重點完善了框架和外掛的穩定性。目前DataX3.0可以做到執行緒級別、程序級別(暫時未開放)、作業級別多層次區域性/全域性的重試,保證使用者的作業穩定執行。

    • 執行緒內部重試
    • 執行緒級別重試
  • 極簡的使用體驗

    • 易用

    • 詳細

      DataX在執行日誌中列印了大量資訊,其中包括傳輸速度,Reader、Writer效能,程序CPU,JVM和GC情況等等。

      • 傳輸過程中列印傳輸速度、進度等
      • 傳輸過程中會列印程序相關的CPU、JVM等
      • 在任務結束之後,列印總體執行情況

DataX與Sqoop對比

功能 DataX Sqoop
執行模式 單程序多執行緒 MR
分散式 不支援,可以透過排程系統規避 支援
流控 有流控功能 需要定製
統計資訊 已有一些統計,上報需定製 沒有,分散式的資料收集不方便
資料校驗 在core部分有校驗功能 沒有,分散式的資料收集不方便
監控 需要定製 需要定製

DataX使用

模板介紹

生成模板的命令
datax.py -r mysqlreader -w hdfswriter
{
 "job": {
     "content": [
         {
             "reader": {
                 "name": "mysqlreader", 
                 "parameter": {
                     "column": [
                         "列"
                     ], 
                     "connection": [
                         {
                             "jdbcUrl": ["url"], 
                             "table": ["tablename"]
                         }
                     ], 
                     "password": "", 
                     "username": "", 
                     "where": ""
                 }
             }, 
             "writer": {
                 "name": "hdfswriter", 
                 "parameter": {
                     "column": [
                         "列"
                     ], 
                     "compress": "是否需要壓縮", 
                     "defaultFS": "", 
                     "fieldDelimiter": ",", 
                     "fileName": "tablename", 
                     "fileType": "text/orc", 
                     "path": "hdfs", 
                     "writeMode": "insert/overwrite"
                 }
             }
         }
     ], 
     "setting": {
         "speed": {
             "channel": "1/2/.."
         }
     }
 }
}

1、使用說明

  1. DataX任務提交命令

    DataX的使用十分簡單,使用者只需根據自己同步資料的資料來源和目的地選擇相應的Reader和Writer,並將Reader和Writer的資訊配置在一個json檔案中,然後執行如下命令提交資料同步任務即可。

    python ./bin/datax.py ./job/job.json
    
    
    datax.py xxx.json
    
  2. DataX配置檔案格式

    編寫json檔案的步驟:

    1、根據你確定的reader和writer來使用命令生成對應的模板

    2、去github上找到對應引數值的寫法,主要是看引數是否是必須項,有什麼影響

DataX基本使用

  1. mysql2mysql(資料遷移)

    生成Mysql到Mysql同步的模板:

    {
        "job": {
            "content": [
                {
                    "reader": {
                        "name": "mysqlreader", 
                        "parameter": {
                            "column": ["*"], 
                            "connection": [
                                {
                                    "jdbcUrl": ["jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8"], 
                                    "table": [tablename]
                                }
                            ], 
                            "password": "******", 
                            "username": "******", 
                            "where": "where條件"
                        }
                    }, 
                    "writer": {
                        "name": "mysqlwriter", 
                        "parameter": {
                            "column": [
                            "col1"...
                            ], 
                            "connection": [
                                {
                                    "jdbcUrl": "jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8", 
                                    "table": ["tablename"]
                                }
                            ], 
                            "password": "******",, 
                            "preSql": [], 
                            "session": [], 
                            "username": "******",, 
                            "writeMode": "insert/overwrite"
                        }
                    }
                }
            ], 
            "setting": {
                "speed": {
                    "channel": "1"
                }
            }
        }
    }
    
    

    使用datax之前需要先建表

    datax.py mysql2mysql.json
    
  2. mysql2hdfs

    檢視模板

    datax.py -r mysqlreader -w hdfswriter
    
    {
        "job": {
            "content": [
                {
                    "reader": {
                        "name": "mysqlreader", 
                        "parameter": {
                            "column": ["*"], 
                            "connection": [
                                {
                                    "jdbcUrl": ["jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8"], 
                                    "table": [tablename]
                                }
                            ], 
                            "password": "******", 
                            "username": "******", 
                            "where": ""
                        }
                    }, 
                    "writer": {
                        "name": "hdfswriter", 
                        "parameter": {
                            "column": [
                                {
                                 "name": "col1",
                                 "type": "string"
                         		},
                                {
                                 "name": "col2",
                                 "type": "string"
                         		}
                            ], 
                            "compress": "", 
                            "defaultFS": "hdfs://master:9000", 
                            "fieldDelimiter": ",", 
                            "fileName": "tablename", 
                            "fileType": "text", 
                            "path": "yourpath", 
                            "writeMode": "append"
                        }
                    }
                }
            ], 
            "setting": {
                "speed": {
                    "channel": "1"
                }
            }
        }
    }
    

    執行之前需要先建表

    執行同步任務

    datax.py mysql2hdfs.json
    
  3. mysql2hive

    (1)、目前HdfsWriter僅支援textfile和orcfile兩種格式的檔案,且檔案內容存放的必須是一張邏輯意義上的二維表;
    (2)、由於HDFS是檔案系統,不存在schema的概念,因此不支援對部分列寫入;
    (3)、目前僅支援與以下Hive資料型別: 數值型:TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE 字串型別:STRING,VARCHAR,CHAR 布林型別:BOOLEAN 時間型別:DATE,TIMESTAMP 目前不支援:decimal、binary、arrays、maps、structs、union型別;
    (4)、對於Hive分割槽表目前僅支援一次寫入單個分割槽;
    (5)、對於textfile需使用者保證寫入hdfs檔案的分隔符與在Hive上建立表時的分隔符一致,從而實現寫入hdfs資料與Hive表欄位關聯;
    (6)、HdfsWriter實現過程是:首先根據使用者指定的path,建立一個hdfs檔案系統上不存在的臨時目錄,建立規則:path_隨機;然後將讀取的檔案寫入這個臨時目錄;全部寫入後再將這個臨時目錄下的檔案移動到使用者指定目錄(在建立檔案時保證檔名不重複); 最後刪除臨時目錄。如果在中間過程發生網路中斷等情況造成無法與hdfs建立連線,需要使用者手動刪除已經寫入的檔案和臨時目錄。
    

    檢視模板

    datax.py -r mysqlreader -w hdfswriter
    

    建立hive資料庫

    create database dataxinfo;
    

    建立表

    CREATE TABLE IF NOT EXISTS xuqiu1(
        id STRING,
        name STRING,
        sum_score bigint,
        clazz STRING
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ',';
    

    編寫配置檔案mysql2hdfs2.json

    {
        "job": {
            "content": [
                {
                    "reader": {
                        "name": "mysqlreader", 
                        "parameter": {
                            "column": ["*"], 
                            "connection": [
                                {
                                    "jdbcUrl": ["jdbc:mysql://master:3306/db?useUnicode=true&characterEncoding=utf-8"], 
                                    "table": ["new_students"]
                                }
                            ], 
                            "password": "******", 
                            "username": "******"
                        }
                    }, 
                    "writer": {
                        "name": "hdfswriter", 
                        "parameter": {
                            "column": [
                                {
                                 "name": "id",
                                 "type": "int"
                         		},
                                {
                                 "name": "name",
                                 "type": "string"
                         		},
                                {
                                 "name": "email",
                                 "type": "string"
                         		},
                                {
                                 "name": "age",
                                 "type": "int"
                         		}
                            ], 
                            "defaultFS": "hdfs://master:9000", 
                            "fieldDelimiter": ",", 
                            "fileName": "new_students", 
                            "fileType": "text", 
                            "path": "/user/hive/warehouse/dataxinfo.db/new_students", 
                            "writeMode": "append"
                        }
                    }
                }
            ], 
            "setting": {
                "speed": {
                    "channel": "1"
                }
            }
        }
    }
    

    執行同步任務

    datax.py mysql2hdfs2.json
    

此外還有MySQL2Hive、hive2mysql、mysql2hbase等。。。。

相關文章