阿里DataX極簡教程

Naylor發表於2024-05-16

目錄
  • 簡介
  • 工作流程
  • 核心架構
    • 核心模組介紹
    • DataX排程流程
  • 支援的資料
  • 實踐
    • 下載
    • 環境
    • 執行流程
  • 引用

簡介

DataX是一個資料同步工具,可以將資料從一個地方讀取出來並以極快的速度寫入另外一個地方。常見的如將mysql中的資料同步到另外一個mysql中,或者另外一個mongodb中。

工作流程

  • read:設定一個源,DataX從源讀取資料
  • write:設定一個目的地,DataX將讀取到的資料寫入目的地
  • setting:同步設定,如設定併發通道、控制作業速度等
  • Framework:Framework用於連線reader和writer,作為兩者的資料傳輸通道,並處理緩衝,流控,併發,資料轉換等核心技術問題
  • 多執行緒:充分利用多執行緒來處理同步任務

核心架構

核心模組介紹

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作業,並且配置了20個併發,目的是將一個100張分表的mysql資料同步到odps裡面。 DataX的排程決策思路是:

  • DaXJob根據分庫分表切分成了100個Task。

  • 根據20個併發,DataX計算共需要分配4個TaskGroup。

  • 4個TaskGroup平分切分好的100個Task,每一個TaskGroup負責以5個併發共計執行25個Task。

支援的資料

型別 資料來源 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

實踐

作為極簡教程,本文將從mysql中讀取一張表的資料,然後同步到clickhouse中。

下載

開啟該專案的Github 首頁進行下載:https://github.com/alibaba/DataX

下載連結:https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz

下載下來是一個tar.gz的包,windows下解壓命令:


tar  -zxvf  xxx.tar.gz

程式目錄:

  • bin:使用裡面的 datax.py 來啟動程式
  • job:裡面放了一個job.json,用來檢查執行環境,一般的建議下載完畢之後執行一次。
  • log:存放執行日誌
  • plugin:外掛集,外掛分為read和write,分別對應datax可支援的資料庫
  • 其他目錄:......

環境

DataX是基於python和java的,需要機器擁有python和java 的執行環境。

在下載完畢後,透過執行自檢指令碼,可確認環境是否正確



 python {YOUR_DATAX_HOME}/bin/datax.py {YOUR_DATAX_HOME}/job/job.json

執行流程

編寫同步任務配置檔案,在job目錄中建立 mysql-to-clickhouse.json 檔案,並填入如下內容



{
    "job": {
        "setting": {
            "speed": {
                "channel": 3
            },
            "errorLimit": {
                "record": 0,
                "percentage": 0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "xxx",
                        "password": "xxx",
                        "column": [
                            "id",
                            "name"
                        ],
                        "splitPk": "id",
                        "connection": [
                            {
                                "table": [
                                    "table_name"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.1.xxx:xxx/db_name"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "clickhousewriter",
                    "parameter": {
                        "username": "xxx",
                        "password": "xxx",
                        "column": [
                            "id",
                            "ame"
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:clickhouse://192.168.1.xxx:xxx/table_name",
                                "table": [
                                    "table_name"
                                ]
                            }
                        ],
                        "preSql": [],
                        "postSql": [],
                        "batchSize": 65536,
                        "batchByteSize": 134217728,
                        "dryRun": false,
                        "writeMode": "insert"
                    }
                }
            }
        ]
    }
}



  • job:一個job包含兩個部分,setting中設定任務的執行速度,錯誤限制等,content中是任務具體的描述。
  • reader:任務的資料輸入源
  • writer:任務的資料輸出源

根據任務配置檔案啟動datax,先cd到datax的根目錄


python bin/datax.py    job/mysql-to-clickhouse.json


執行上述命令後,任務就開啟了。本例從mysql資料庫中的一張表中讀取了兩個欄位(id,name),然後同步到clickhouse中,clickhouse中需要先建立同樣的庫,表和列。

任務執行非常快,140W資料僅用了 18s 就完成了同步。



2024-05-16 16:24:57.312 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2024-05-16 16:24:38
任務結束時刻                    : 2024-05-16 16:24:57
任務總計耗時                    :                 18s
任務平均流量                    :            2.21MB/s
記錄寫入速度                    :         142425rec/s
讀出記錄總數                    :             1424252
讀寫失敗總數                    :                   0


引用

  • readme:https://github.com/alibaba/DataX
  • introduction:https://github.com/alibaba/DataX/blob/master/introduction.md

相關文章