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下编译
3种方式帮你完成J2EE业务系统根据taskID启动对应spark应用_第1张图片

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

你可能感兴趣的:(Spark,Java)