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