pentaho kettle 實現資料庫間增量同步
今天剛接觸 etl工具, 公司要求要實現一個 資料庫同步任務,要求從兩個表中同步資料。所以寫下這篇部落格記錄一下。
思路:
常用的同步機制 就是 在A表中新增 時間戳欄位 命名為 LastModifiedTime , B 表也新增相同的欄位。
在同步的時候,查詢A 表的 所有條目中 最大的更新時間, MAX(LastModifiedTime) ,在B表中只要
Select * From B where LastModifiedTime > ? 既可以查出所有的最新條目,新增 / 更新 即可, 這些在 kettle 中都有實現, 具體操作下文會講到。
1 首先下載 pentaho http://tenet.dl.sourceforge.net/project/pentaho/Data%20Integration/6.0/pdi-ce-6.0.1.0-386.zip
解壓到磁碟
2 因為任務後面需要mysql 資料庫之間的同步,所以先將mysql 驅動jar包加入lib目錄下, 由於這裡有三個 lib 目錄 ,分別是Data Service JDBC Driver lib libswt\win64 ,我不知道應該加入哪個目錄,於是乾脆點直接把mysql的jar包每個目錄都加了一遍。 之後在安裝目錄開啟命令列啟動Sqoop.bat 顯示如下介面
3 首先雙擊 "作業" ----》 "通用" ----》雙擊 START 出現如下介面
,接著可以雙擊右邊的Start圖示進行編輯
這個介面可以設定啟動選項,要設定定時執行,勾選重複,然後設定型別為時間間隔, 以分鐘的間隔 和 以秒計算的間隔分別是你想設定的定時。 我的同步任務是 以5 秒為單位同步一次所以設定上這樣
4 儲存完後關閉介面,又回到最上層 。 雙擊轉換建立一個轉換工程, 雙擊 “輸入”--》“表輸入” , 會在右邊建立一個可以連線資料庫連線,進入編輯介面 點選新建 設定資料庫引數,命名為 MysqlA ,代表一個輸入源。
點選確定後,編輯sql輸入框輸入 ,當然這是為了獲取A表中的最大時間戳 ,點選確定。
5 再從左邊導航欄新增一個 表輸入 選項,重複上一步操作, 此 表輸入 部件 是用來獲取B表中所有大於 "上一步最大的時間戳" 的所有條目 , 當然這時候也需要新建一個數據庫連線,指向的資料庫當然就是 B 表所在的資料庫 ,可以命名為 MysqlB。
此時,需要點選 ” 獲取查詢語句“ ,在資料庫瀏覽器中選擇你需要的表 如圖所示
該操作會為你自動生成 查詢sql語句, 這時候我們需要在最後一行手動新增自己的 WHERE 條件
問好就代表 從上一個輸入源 獲取 A表的最大的時間戳
其中再最下方 勾選如下,點選確定儲存。
6 接著在最左邊導航欄中 選擇 "輸出" ---》 ”插入/更新“ ,
此時設定的資料庫連線 應該選擇 A 資料表的 資料庫,目標表應該選擇 A 表 我這裡是 test1 ,
在下方 "用來查詢的關鍵字"
設定上查詢的關鍵字 ,這裡通常選擇 主鍵
然後在下方更新欄位中 設定 獲取更新欄位, 會自動獲取表中的所有 需要更新的欄位 ,當然很重要的一部就是需要把主鍵的更新選項設定為N
這一步如果不選會報 主鍵重複錯誤。
點選確定儲存。
之後介面上已經有三個 部件, 按住 SHift + 滑鼠左鍵 可以用箭頭連線兩個 部件 以此從左網友連線。
點選執行即可測試。此時也記得儲存 到桌面。
7 上一步如果成功了, 需要講轉換和 定時任務結合。 此時關閉介面 在主物件介面中選擇第2步建立的作業 , 雙擊 “通用” --- 》 “轉換” , 在編輯轉換
將轉換檔名指向前面索儲存的 “轉換檔案” , 並講兩個連在一起 ,執行即可實現5秒同步資料庫。
成功後可以在B 資料表 新增 更新 表, 會自動同步到 A
大功告成,第一次寫部落格真的很累,如果有不詳細的地方可以留言問我。