Java如何批量執(zhí)行datax腳本
一、前言
最近在使用datax同步數(shù)據(jù)表,由于好多個(gè)表,一開(kāi)始每次都需要等一個(gè)執(zhí)行完再執(zhí)行下一個(gè),這樣明顯效率很低,于是寫(xiě)了個(gè)Java方法來(lái)批量操作;
環(huán)境: linux
服務(wù)器
二、Java代碼
import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: Huang JX * @Date: 2021/11/11 * @Description: datax 批量執(zhí)行腳本,日志存放在當(dāng)前目錄的 DataxSyncLogs 中; * 注意:需要輸入 datax 腳本的文件夾路徑作為 main 函數(shù)的參數(shù),如 home/xxx/datax/job/ * <p> * 使用說(shuō)明: * 1、去掉文件的包名package; * 2、將此Java文件放到 /datax/bin/目錄下; * 3、javac DataxSyncUtil.java * 4、java DataxSyncUtil [參數(shù)]datax腳本文件夾路徑 */ public class DataxSyncUtil { public static void main(String[] args) throws Exception { FileOutputStream out = null; StringBuffer sb = new StringBuffer(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); try { String jobPath = args[0]; if (jobPath == null && "".equals(jobPath.trim())) { throw new Exception("請(qǐng)輸入datax腳本文件夾路徑"); } String logDir = jobPath + "DataxSyncLogs"; File logDirFile = new File(logDir); if (!logDirFile.exists()) { logDirFile.mkdir(); // 創(chuàng)建日志文件夾 } String logFileName = logDir + "/datax_sync_" + sdf.format(new Date()) + ".log"; File file = new File(logFileName); if (!file.exists()) file.createNewFile(); out = new FileOutputStream(file, true); sb.append("==========================================\n"); sb.append("==========Datax Sync Job Start!==========\n"); sb.append("==========================================\n"); File f = new File(jobPath); if (!f.exists()) { sb.append(jobPath + " not exists\n"); return; } System.out.print(sb.toString()); out.write(sb.toString().getBytes("utf-8")); String cmdStr; File fa[] = f.listFiles(); for (int i = 0; i < fa.length; i++) { sb = new StringBuffer(); File fs = fa[i]; if (!fs.isDirectory()) { Process pr = null; cmdStr = "python3 datax.py " + jobPath + fs.getName(); sb.append("start cmd: " + cmdStr + "\n"); System.out.print("start cmd: " + cmdStr + "\n"); pr = Runtime.getRuntime().exec(cmdStr); BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line; while (true) { if (!((line = in.readLine()) != null)) break; sb.append(line + "\n"); System.out.print(line + "\n"); } in.close(); pr.waitFor(); out.write(sb.toString().getBytes("utf-8")); } } sb.append("==========================================\n"); sb.append("===========Datax Sync Job End!===========\n"); sb.append("==========================================\n"); System.out.print(sb.toString()); out.write(sb.toString().getBytes("utf-8")); } finally { out.flush(); out.close(); } } }
注意:
看一下注釋的說(shuō)明,將job的文件路徑做為main函數(shù)的參數(shù);
【更新記錄】
1、2021-12-06 更新寫(xiě)日志方式,每跑完一個(gè)任務(wù)就寫(xiě)日志到文件中;
三、使用說(shuō)明
1.把DataxSyncUtil
拷到服務(wù)器中datax的bin目錄下,如/home/xxx/datax/bin/
,注意去除Java類(lèi)的包名;
2.編譯Java程序,javac DataxSyncUtil.java
3.執(zhí)行Java程序,傳入?yún)?shù)為放置datax腳本的文件夾,如java DataxSyncUtil /home/xxx/datax/job/
4.如果想在后臺(tái)運(yùn)行,則為nohup java DataxSyncUtil /home/xxx/datax/job/ &
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用DateTimeFormatter格式化輸入的日期時(shí)間
這篇文章主要介紹了Java使用DateTimeFormatter格式化輸入的日期時(shí)間,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01springboot引入druid解析sql的過(guò)程
在開(kāi)發(fā)中,有時(shí)我們可能會(huì)需要獲取SQL中的表名,那么因?yàn)椴煌臄?shù)據(jù)源類(lèi)型SQL會(huì)存在部分差異,那么我們就可以使用alibaba 的druid包實(shí)現(xiàn)不同的數(shù)據(jù)源類(lèi)型的sql解析,需要的朋友可以參考下2023-08-08Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解
這篇文章主要介紹了Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07優(yōu)雅地在Java應(yīng)用中實(shí)現(xiàn)全局枚舉處理的方法
這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅地在Java應(yīng)用中實(shí)現(xiàn)全局枚舉處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解
這篇文章主要介紹了IDEA實(shí)現(xiàn)遠(yuǎn)程調(diào)試步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java數(shù)據(jù)開(kāi)發(fā)輔助工具Docker與普通程序使用方法
這是為數(shù)據(jù)開(kāi)發(fā)人員使用的輔助工具,用于數(shù)據(jù)庫(kù)之間的表同步,說(shuō)同步并不嚴(yán)謹(jǐn),因?yàn)椴皇菍?shí)時(shí)更新的,更確切的說(shuō)法是復(fù)制,可以方便的從一個(gè)數(shù)據(jù)庫(kù)復(fù)制表到另一個(gè)數(shù)據(jù)庫(kù),以下遇到同步的詞請(qǐng)理解為復(fù)制2021-09-09解決使用@Value(${×××))從properties文件取值的坑
這篇文章主要介紹了解決使用@Value(${×××))從properties文件取值的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07詳解Spring中@Valid和@Validated注解用法
本文將以新增一個(gè)員工為功能切入點(diǎn),以常規(guī)寫(xiě)法為背景,慢慢烘托出?@Valid?和?@Validated?注解用法詳解,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-07-07Java數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解
在之前的學(xué)習(xí)中,我們主要了解了很多 Java 的 基本語(yǔ)法,但是在之后的 Java學(xué)習(xí)中,了解基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的知識(shí)非常重要,數(shù)據(jù)結(jié)構(gòu)的思想可以幫助我們更加清晰明白的了解 Java 的解題思路等等.今天我們就來(lái)開(kāi)始學(xué)習(xí)實(shí)現(xiàn)一個(gè)Java基礎(chǔ)的單鏈表,需要的朋友可以參考下2021-05-05