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環境變量
- 需要將yarn-site.xml放置到應用的classpath環境中(給定yarn的資源管理的IP地址和端口號)
- 在構建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