3種方式幫你完成J2EE業務系統根據taskID啓動對應spark應用

1. 根據taskID啓動對應spark應用的方式

1.1 調用本地的shell腳步來啓動spark的應用

Java程序中調用本地的shell腳步來啓動spark的應用
shell腳步中是spark-submit的命令

  • 優點:簡單
  • 缺點:
    • 需要將shell腳本放到所有可能執行的服務器上
    • spark應用的jar文件和spark的環境(spark-submit腳本和相關的lib)需要放到可能只需的服務器上

1.2 調用遠程機器上的shell腳本執行spark-submit命令

Java程序調用遠程機器上的shell腳本執行spark-submit命令(通過ssh)

  • 優點:簡單、jar和shell以及環境不需要放到太多的機器上
  • 缺點:如果放置spark應用jar文件的機器宕機的話,需要考慮容錯的機制

1.3 直接在Spark代碼中進行任務提交到yarn

這種方式在windows上運行可能出錯,linux上不不會,需要配置HADOOP_HOME環境變量

  1. 需要將yarn-site.xml放置到應用的classpath環境中(給定yarn的資源管理的IP地址和端口號)
  2. 在構建spark應用的時候,需要在SparkConf對象中給定一些相關屬性
    val conf = new SparkConf()
    .setMaster(“yarn-cluster”)
    .setAppName(“xxxxx”)
    .setJars(“spark應用jar文件在當前機器上所在路徑”)

2. 演示

2.1 Java代碼調用本地shell

public class ProcessTest {
    public static void main(String[] args) {
        String path = "/home/spark/bin/test.sh";
        String execCmd = "sh " + path + " " + args[0];

        try {
            Process process = Runtime.getRuntime()  // 獲取當前運行環境
                    .exec(execCmd);     // 執行腳本
            int waitValue = process.waitFor();
            if (waitValue == 0) {
                System.out.println("正常");
            } else {
                System.out.println("異常:" + waitValue);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

測試用的shell腳本如下:

#!/bin/bash

mkdir -p $1

將以上代碼在Linux下編譯
在這裏插入圖片描述

2.2 Java代碼調用封裝了spark-submit的腳本

public class SparkApplicationSubmitTest {
    public static void main(String[] args) {
        long taskId = 1L;

        submitSparkApplication(taskId);
    }

    /**
     * 啓動taskid對應的spark應用
     *
     * @param taskId
     */
    public static void submitSparkApplication(long taskId) {
        // 1. 從數據庫/緩存中獲取該taskid對應的task類型,並獲取類型對應的class名稱
        String clz = "xxxxxxx";

        // 2. 構建執行命令
        // shell所在的地址路徑
        String shellPath = "/opt/module/shell/sparkSubmit.sh";
        // shell腳本需要傳遞的參數
        String argParam = clz + " " + taskId;
        // 最終執行的命令
        String cmd = "sh " + shellPath + " " + argParam;

        try {
            // 執行命令,獲取執行命令的進程對象
            Process process = Runtime.getRuntime().exec(cmd);
            // 等等進程執行完成
            process.waitFor();

            // 獲取進程執行的結果值
            int exitValue = process.exitValue();
            if (exitValue == 0) {
                // 腳本執行正常
                // TODO: 更新任務的一些狀態信息
            } else {
                // 腳步執行失敗
                // TODO: 通知開發人員,執行失敗
            }
        } catch (IOException e) {
            // 腳步執行失敗
            // TODO: 通知開發人員,執行失敗
            e.printStackTrace();
        } catch (InterruptedException e) {
            // 腳步執行失敗
            // TODO: 通知開發人員,執行失敗
            e.printStackTrace();
        }
    }
}

shell腳本里,spark-submit的寫法如下:

#!/bin/sh

SPARK_HOME=/opt/cdh-5.3.6/spark-1.6.1-bin-2.5.0-cdh5.3.6

## spark submit
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--class $1 \
--xxx \
--conf "xx=yy" \
--conf "spark.ui.port=5050" \
${SPARK_HOME}/user_track_0.0.1.jar \
## taskid
$2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章