java实现发布spark yarn作业

一.背景

        在企业级大数据处理场景中,Apache Spark 凭借高效的分布式计算能力,成为批处理、流处理、机器学习等场景的核心引擎,而 YARN 作为 Hadoop 生态的核心资源调度系统,是企业私有化大数据集群的主流调度底座。Spark 作业提交至 YARN 集群运行,能充分利用集群的分布式资源,支撑 TB/PB 级数据的高效处理。但传统的 Spark 作业发布方式(如 spark-submit 命令行、脚本化提交)已难以适配企业级 “标准化、自动化、可管控” 的运维诉求,基于 Java 实现 Spark YARN 作业的程序化发布,成为解决传统痛点、适配企业级落地的核心选择。

1.传统 Spark YARN 作业发布的核心痛点

  1. 发布方式碎片化,自动化程度低传统发布依赖 spark-submit 命令行手动执行,或通过 Shell 脚本封装命令,存在显著短板:一是命令参数繁琐(如指定 YARN 队列、资源配额、依赖包、主类等),易因参数配置错误导致作业提交失败;二是难以集成至企业自动化体系(如 CI/CD 流水线、运维平台),大量依赖人工操作,发布效率低且易出错;三是不同环境(测试 / 生产)的配置(如资源大小、YARN 队列、数据源地址)需手动修改脚本,缺乏统一的配置管理机制,易引发环境不一致问题。

  2. 作业生命周期管控能力缺失spark-submit 仅能完成作业 “提交” 动作,无法程序化管控作业全生命周期:提交后无法实时获取作业在 YARN 上的运行状态(如 RUNNING/FAILED/KILLED)、资源使用情况、日志信息;作业异常时无法自动重试、降级或告警;需人工登录 YARN ResourceManager 控制台查询状态,运维成本高,且无法快速响应作业故障。

  3. 与企业级系统集成性差企业级场景中,Spark 作业发布需对接权限管控、资源审批、日志审计、成本计量等系统,但 spark-submit 是独立的命令行工具,无法直接与这些系统联动:例如,无法在作业提交前校验用户是否有 YARN 队列的使用权限,无法自动记录作业的资源消耗用于成本核算,无法将作业日志归集至企业统一日志平台。

  4. 多版本 / 多集群适配困难企业往往部署多套 YARN 集群(测试 / 生产)、多个 Spark 版本,传统脚本化发布需为不同集群 / 版本维护不同的 spark-submit 脚本,版本兼容、配置切换成本高;且无法程序化适配不同集群的 YARN 配置(如 ResourceManager 地址、提交模式),易因集群环境差异导致作业发布失败。

2.Java 实现发布 Spark YARN 作业的核心价值

Java 作为企业级开发的主流语言,也是 Spark 底层开发的核心语言,基于 Java 实现 Spark YARN 作业的程序化发布,本质是构建 “标准化、自动化、可管控” 的作业发布体系,解决传统方式的痛点:

  1. 标准化发布接口,提升自动化能力

  2. 全生命周期管控,强化运维能力

  3. 深度集成企业级系统,满足合规诉求

  4. 灵活适配多集群 / 多版本场景

3.典型应用场景

  1. 企业级大数据平台作业发布:构建统一的大数据作业调度平台,基于 Java 实现 Spark YARN 作业的标准化发布入口,支撑各业务部门提交 Spark 批处理 / 流处理作业,统一管控资源配额、权限、日志,提升平台的易用性与可维护性。
  2. 核心业务数据计算自动化:金融、电商等行业的核心报表计算、交易数据清洗等作业,通过 Java 程序实现定时、自动发布至 YARN 集群,作业异常时自动告警,保障核心业务数据处理的稳定性。
  3. 多集群作业分发与管控:企业部署多套 YARN 集群(如本地集群、异地容灾集群),通过 Java 程序实现作业的批量发布、状态统一监控,适配跨集群的数据处理与容灾需求。
  4. Spark 作业与业务系统联动:业务系统(如订单系统、用户画像系统)触发数据计算需求时,通过 Java 接口直接发布 Spark YARN 作业,作业完成后将计算结果回调至业务系统,实现 “业务触发 - 数据计算 - 结果返回” 的闭环。

        综上,Java 实现发布 Spark YARN 作业,是企业将 Spark 计算能力从 “手工运维” 转向 “工程化、自动化管控” 的关键路径:既充分利用 Spark 与 YARN 的原生能力,又通过 Java 语言的企业级特性,解决发布碎片化、管控缺失、集成性差等痛点,适配企业级大数据处理的规模化、规范化诉求,为 TB/PB 级数据的高效处理提供稳定、可管控的发布支撑。

二.具体实现

1.引入依赖

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-yarn_2.12</artifactId>
            <version>3.2.2</version>
        </dependency>

2.设置参数

System.setProperty("SPARK_YARN_MODE","true");

SparkConf sparkConf=new SparkConf();

sparkConf.setAppName("app名称");

sparkConf.set("spark.submit.deployMode","cluster");

sparkConf.set("spark.yarn.jar","hdfs://xxx/xxx/spark2/jars/*.jar");

sparkConf.set("yarn.resourcemanager.hostname","xxx.xxx.xxx.xxx");

sparkConf.set("spark.yarn.preserve.staging.files",false);

3.初始化客户端

List sargs= Lists.newArrayList("--jar",jarPath,"--class",executeClass);

for(String item : executeClassArgs){
     sargs.add("--arg");
     sargs.add(item);
}

ClientArguments cArgs=new ClientArguments((String [])sargs.toArray(new String[sargs.size()]));

Client client=new Client(cArgs,sparkConf,null);

4.提交作业

ApplicationId appId=client.submitApplication();

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路边草随风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值