一、Datax簡介
DataX 是一個異構數據源離線同步工具,致力於實現包括關系型數據庫(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各種異構數據源之間穩定高效的數據同步功能。
二、框架設計
DataX本身作為離線數據同步框架,采用Framework + plugin架構構建。將數據源讀取和寫入抽象成為Reader/Writer插件,納入到整個同步框架中。
- Reader:Reader為數據采集模塊,負責采集數據源的數據,將數據發送給Framework。
- Writer: Writer為數據寫入模塊,負責不斷向Framework取數據,並將數據寫入到目的端。
- Framework:Framework用於連接reader和writer,作為兩者的數據傳輸通道,並處理緩沖,流控,並發,數據轉換等核心技術問題。
三、簡單的調研
前段時間,簡單的調研了一下datax,主要通過抽取速度、抽取數據的穩定性,抽取日志,增量抽取等方面進行了datax和kettle之間的對比
3.1抽取速度
先后采用datax和kettle抽取382萬左右的數據:從oracle抽取到mysql
datax需要2分30秒:
kettle需要21分鍾:
而將數據量增加至千萬級別時:大概1864萬左右的數據
datax需要21分鍾左右:
kettle需要2小時58分:
以上datax是在channel為1的情況下測試的,即單線程抽取
3.2抽取日志
日志方面,datax和kettle的日志都是比較好的。不過,當datax的job失敗時,他的日志更加人性化一點:
提供了任務失敗的可能原因:
3.3抽取穩定性
當我們使用kettle從mysql抽取數據導入到hdfs上時,存在丟數據的情況。
對於datax,目前我們處於調研階段,只是運行了個demo,並不能確定是否存在丟數據的情況。目前未發現網上有說丟數據的情況
3.4增量抽取
增量抽取一般會先從我們自己的數據庫中查詢出最大的增量標識(一般為id或時間),再從數據源中抽取大於最大標識的數據。
在增量方面,kettle還是支持的很好,但datax缺乏對增量更新的內置支持
kettle可以使用工作流的形式,先查詢出目標表的最大值,把這個值作為一個變量傳入下一個階段中。
datax:因為datax的job是一個json文件來描述的,增量抽取的where條件需要動態傳入,動態修改json文件不是很方便。所以網上的解決辦法是在json中的where條件使用占位符,並通過shell腳本來動態傳入最大值。
具體可以參考以下兩篇博文:
https://blog.csdn.net/quadimodo/article/details/82186788
http://ju.outofmemory.cn/entry/360202
3.5動態感知namenode的切換
使用kettle往hdfs上導數據時,namenode的地址是在kettle.properties配置文件中配的,所以當我們的集群重啟時,namenode有可能發生切換,導致kettle導數據任務失敗
而datax往hdfs上導數據時,可以配置namenode 的HA:
3.6其他
當然kettle還有一個優勢是有一個可視化界面,我們在服務器中通過vnc可以界面化操作
四、增量更新的思路
網上提供了一種思路是通過shell腳本來實現的,當然,更重要的是我們已有的增量更新中,不僅有用時間來做增量的,還有通過自增id來抽取的,不同的任務不一樣
所以最好是讓用戶直接配置他們想要的增量字段,通過用戶的配置字段確認需要更新的數據范圍,實現kettle的那一套。
我在網上找了一個開源項目,雖然跟我們的需求有點不一樣,但改改就可以了
https://github.com/Jawf/DataX-Migration
這個項目我大致看了一下,它是將一個庫中的表抽取到另一個庫中,里面有些是需要改動的地方:
1.在配置文件中,他會取imformation.scheme庫中,通過Table表和Column表去查詢源數據庫的對應表的元數據信息,但里面的查詢sql語句是在配置文件中配的,所以在程序中需要動態維護需要導的表名,即執行sql時,需要replace對應的字符串
2.目標數據庫中的表是不會自動創建的,需要手動提前創建好