DataX原理


一、概述

1. 設計理念


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

2. 架構設計


DataX本身作為離線數據同步框架,采用Framework + plugin架構構建。將數據源讀取和寫入抽象成為Reader/Writer插件,納入到整個同步框架中。
Reader:Reader為數據采集模塊,負責采集數據源的數據,將數據發送給Framework。
Writer: Writer為數據寫入模塊,負責不斷向Framework取數據,並將數據寫入到目的端。
Framework:Framework用於連接reader和writer,作為兩者的數據傳輸通道,並處理緩沖,流控,並發,數據轉換等核心技術問題。

二、核心概念

1. Job、Task Group與Task


根據切分策略將一個 Job 切分成多個 Task,根據分配策略將多個 Task 組成一個 TaskGroup。

Task

Job 的最小執行單元,一個 Job 可根據 Reader 端切分策略,且分成若干個 Task,以便於並發執行。

Task Group

一組 Task 的集合,根據 DataX 的公平分配策略,公平地分配 Task 到對應的 TaskGroup 中。一個 TaskGroup 對應一個 TaskGroupContainer,負責執行一組 Task。

Job

在 DataX 中用來描述一個源端到一個目的端的同步作業,是 DataX 數據同步面向用戶的最小業務單元。一個Job 對應 一個 JobContainer, JobContainer 負責 Job 的全局切分、調度、前置語句和后置語句等工作。

2. Reader、Writer與Transformer


DataX 可支持任意數據源到數據源,只要實現了 Reader/Writer Plugin,官方已經實現了主流的數據源插件,比如 MySQL、Oracle、SQLServer 等,也可以開發一個 DataX 插件。
DataX 默認提供了豐富的數據轉換實現類,用戶還可以根據項目自身需求,擴展數據轉換。

3. Channel(通道)


DataX 會單獨啟動一條線程運行運行一個 Task,而 Task 會持有一個 Channel,用作 Reader 與 Writer 的數據傳輸媒介,DataX 的數據流向都是按照 Reader—>Channel—>Writer 的方向流轉。
Channel 作為傳輸通道,即能充當緩沖層,同時還能對數據傳輸進行限流操作。

三、調度流程

1. 任務切分

1)計算並發量

並發量即,所需通道數量(needChannelNumber)。

  • 按表數量
    配置了每個通道處理1張表,那么同時處理100張表,就需要100個通道

  • 按記錄數
    配置了每個通道處理1000條記錄,那么同時處理10000條記錄,就需要10個通道

  • 按流量
    ......

2)任務切分

將Job切分成多個Task:根據所需通道數量將Job切分成多個Task

  • 如果用戶配置了具體的 Table 數量,那么就按照 Table 為最小單元進行拆分(即一個 Table 對應一個 Task),並生成對應的 querySql;
  • 如果用戶還配置了 splitPk,則會根據 splitPk 進行切分,具體邏輯是根據 splitPk 區間對 Table 進行拆分,並生成對應的 querySql。

2. 任務分配

1)配置通道數量(ChannelNumber)
2)設置每個TaskGroup分配的通道數(默認為每個TaskGroup分配5個通道)
3)計算TaskGroup數量=通道數量/每個TaskGroup分配的通道數
4)將Task平均分配至每個TaskGroup

3. 調度策略示例

目標

構建了一個數據同步作業,該作業的目的是將 MySql 的 100 張表同步到 Oracle 庫中。
且此時設置了 20 個並發(即 channelNumber=20)。

調度步驟

  1. 按表數量計算,需要100個通道(Channel);
  2. 將此Job切分成 100 個 Task;
  3. DataX 默認給每個 TaskGroup 分配 5 個 Channel,因此 taskGroupNumber = channelNumber / channelsPerTaskGroup = 20 / 5 = 4;
  4. 根據 DataX 的公平分配策略,會將 100 個 Task 平均分配給每個 TaskGroup,因此每個 TaskGroup 處理 taskNumber / taskGroupNumber = 100 / 4 = 25 個 Task。

圖示

  • 詳細圖
  • 簡圖

四、參考資料

  1. 圖解 DataX 核心設計原理:https://segmentfault.com/a/1190000023925704
  2. DataX介紹:https://blog.csdn.net/burpee/article/details/53734393


免責聲明!

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



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