公司有需求將兩張業務表從oracle遷移至mysql,表的數據量大概3000W左右,在對比了各種遷移方法后,決定使用kettle。
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。kettle的數據抽取主要在於抽取數據,而沒有考慮數據庫的函數、存儲過程、視圖、表結構以及索引、約束等等,如果想對這些內容進行遷移,就需要通過寫腳本或者更改kettle源碼的方式實現了。
一、安裝java 環境
參考:https://www.cnblogs.com/nothingonyou/p/11936850.html
二、部署kettle
官網下載較慢,這里選擇國內鏡像下載,使用的是pdi-ce-7.1.0.0-12.zip 版本。
官網地址:https://community.hitachivantara.com/s/article/data-integration-kettle
下載地址:http://mirror.bit.edu.cn/pentaho/Data%20Integration/7.1/
解壓后進入到Kettle目錄,雙擊運行spoon.bat文件,出現如下界面及說明kettle成功部署。
1. 數據庫連接驅動
在運行之前,我們需要下載對應數據庫的jar包導入到Kettle的lib目錄下,比如我們需要把oracle遷移到mysql,那就需要oracle和mysql兩個jar包:
2. 配置kettle轉換
雙擊打開spoon.bat,在左側主對象菜單欄,新建一個轉換,命名為o2m,如下圖:
2.1配置oracle和mysql連接
在DB連接一欄,右擊新建連接,配置oracle連接:
點擊測試,顯示成功即為配置完成
配置mysql連接:
點擊測試,顯示成功即為配置完成
2.2 配置字符集
遷移時要確認兩邊數據庫使用的是哪種字符集,不然可能會出現遷移后出現亂碼的問題,我這里oracle是16GBK,mysql是UTF-8,UTF-8兼容16GBK,故沒有配置。
2.3 配置遷移步驟
在左側菜單欄【轉換】里面,選擇【核心對象】,【輸入】一欄接着雙擊【表輸入】,或者選中將【表輸入】拖拽到右側空白區域。
雙擊你拖進來的【表輸入】,修改“步驟名稱”,選擇源數據,點擊獲取【獲取SQL查詢語句】,選擇你想同步的表,點擊確定后就可以了。當然也可以自己寫sql語句,我這里是自己寫的sql,點擊【預覽】可以查看要遷移的數據。
接下來配置表輸出,在左側菜單欄【轉換】里面,選擇【核心對象】,【輸出】一欄接着雙擊【表輸出】,或者選中將【表輸出】拖拽到右側空白區域。
單擊【表輸入】,按shift鍵連接【表輸入】,建立起【表輸入】和【表輸出】的連接,如圖:
雙擊【表輸出】,配置要遷移的目標表,我這里兩邊數據庫字段一樣,故而可以不用修改,如圖:
ctrl+s保存為o2m.ktr文件,到這里一個簡單的轉換就配置完成了。
2.4 運行轉換
手工運行作業,點擊下圖紅色圈圈里面的按鈕。
點擊啟動,日志級別這里可以選擇錯誤日志,這樣只記錄錯誤信息
轉換輸出欄如下圖:
最后檢測兩邊表,如記錄數count(*)、表中數據對比等沒問題的話表示轉換完成。
2.5 kettle運行的一些優化
本地跑kettle速度不是很給力,查了資料做了些優化。
2.5.1 修改JVM內存大小
JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指 定,默認是物理內存的1/4。默認空余堆內存小於 40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、 -Xmx相等以避免在每次GC 后調整堆的大小。可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行堆內存設置,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值,建議堆的最大值設置為可用內存的最大值的80%。
本機內存8G,修改spoon.bat 相關參數如下:
修改完效率不是很高,但是略微能提升一點讀寫性能。
2.5.2 表輸出設置多線程
表輸入和表輸出都可以設置多線程,但是【表輸入】開啟多線程容易造成數據重復,比如select * from table設置為3,就會遷移3份重復數據,故只設置表輸出:
數字8就代表開啟了8個輸出線程,開啟后速度明顯提升不少。
2.5.3 修改輸出參數
mysql表輸出的時候出現減速的原因可能是因為網絡鏈接的屬性設置
在此處添加參數:
useServerPrepStmts=false
rewriteBatchedStatements=true
useCompression=true
如圖:
以上就是在windows上使用kettle的一些心得,但是考慮到表數據量太大,故而后續把kettle轉換配置放在linux 服務器跑了,速度得到大大提升,將在下一篇說明。