java实现发布flink yarn application模式作业

一.背景

在企业级实时与批处理融合的大数据场景中,Apache Flink 凭借流批一体的计算能力,成为金融风控、实时数仓、物联网数据处理等核心业务的首选引擎;YARN 作为 Hadoop 生态的核心资源调度系统,仍是企业私有化大数据集群的主流资源管理底座。Flink YARN Application 模式作为 Flink 1.10+ 推出的核心部署模式,相比 Session 模式具备 "作业与集群生命周期绑定、资源独享、隔离性强" 的优势,适配大规模、高优先级、长运行时的 Flink 作业场景。但传统的 Flink YARN Application 作业发布方式(如 flink run-application -t yarn-application 命令行、脚本化提交),已难以满足企业对 "标准化、自动化、可管控、高可靠" 的运维诉求,基于 Java 实现程序化发布该模式作业,成为解决传统痛点、适配企业级落地的核心选择。

  1. 发布流程碎片化,自动化适配难 传统发布依赖 flink run-application 命令行手动执行,或通过 Shell 脚本封装参数,存在显著短板:一是参数体系复杂(需指定 YARN 队列、资源配额、依赖包、主类、HDFS 路径、Flink 配置等),易因参数遗漏、格式错误导致作业提交失败;二是无法无缝集成至企业 CI/CD 流水线、大数据调度平台,大量依赖人工操作,发布效率低且易引发人为故障;三是测试 / 生产等多环境的配置(如 YARN 资源规格、数据源地址、Flink 配置项)需手动修改脚本,缺乏统一的配置管理机制,环境一致性难以保障。

  2. 作业全生命周期管控能力缺失 flink run-application 仅能完成作业 "提交" 动作,无法程序化管控作业全生命周期:提交后无法实时获取作业在 YARN 上的运行状态(ACCEPTED/RUNNING/FAILED/KILLED)、容器资源使用情况;作业异常时(如 JobManager 挂掉、TaskManager 异常退出)无法自动触发重试、扩容或告警;需人工登录 YARN ResourceManager、Flink WebUI 排查问题,运维成本高,且无法快速响应核心业务作业的故障。

  3. 与企业级系统集成性不足 企业级场景中,作业发布需对接权限管控、资源审批、日志审计、成本计量等系统,但 flink run-application 作为独立命令行工具,无法直接联动这些系统:例如,提交前无法校验用户是否有 YARN 队列的使用权限,提交后无法自动记录作业的资源消耗用于成本核算,作业日志无法自动归集至企业统一日志平台(如 ELK),难以满足合规与精细化运维诉求。

  4. 多集群 / 多版本适配成本高 企业往往部署多套 YARN 集群(测试 / 生产、异地容灾集群)、多个 Flink 版本,传统脚本化发布需为不同集群 / 版本维护不同的 flink run-application 脚本,版本兼容、集群地址切换成本高;且无法程序化识别 YARN 集群的资源余量,易将作业提交至资源不足的集群,导致作业启动失败。

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

  1. 标准化发布接口,提升自动化水平 基于 Flink 官方提供的 YarnApplicationClusterDescriptorClusterClient 等 Java API 封装统一的发布接口,将 YARN Application 作业的核心配置(主类、jar 包路径、YARN 队列、资源配额、并行度、Flink 配置项、集群地址等)抽象为可配置参数,替代碎片化的 flink run-application 命令。该接口可无缝集成至企业 CI/CD 流水线(Jenkins、GitLab CI)、大数据调度平台,实现 "代码编译 - 打包 - 作业发布 - 状态校验" 的全流程自动化,减少人工干预,降低发布错误率。

  2. 全生命周期管控,强化运维能力Java 程序可通过 Flink Rest API、YARN ResourceManager REST API 联动作业与集群:提交作业后实时监听作业状态,捕获 ACCEPTED/RUNNING/FAILED 等状态变更;作业失败时自动触发重试逻辑(如重新提交作业至 YARN),或推送告警至企业监控平台(如 Prometheus、AlertManager);作业运行中可查询 TaskManager 数量、CPU / 内存使用情况,拉取作业日志并归集至统一日志系统;作业完成后自动记录运行时长、资源消耗等数据,支撑成本核算与资源优化。

  3. 深度集成企业级系统,满足合规诉求Java 发布程序可对接企业现有系统:提交作业前调用权限系统校验用户 / 应用对 YARN 队列、Flink 资源的使用权限;提交过程中记录审计日志(提交人、时间、配置、集群信息),满足合规审计要求;作业运行后将资源消耗数据同步至成本计量系统,实现作业成本的精细化核算;同时可集成 Nacos、Apollo 等配置中心,统一管理多环境配置,避免手动修改脚本导致的配置不一致问题。

  4. 灵活适配多集群 / 多版本场景通过 Java 程序的配置化设计,将不同 YARN 集群的连接信息(ResourceManager 地址、HDFS 地址)、不同 Flink 版本的适配参数封装为配置项,发布作业时按需加载对应配置,无需修改核心代码即可适配多集群、多版本场景。例如,通过配置中心切换测试 / 生产集群的 YARN 地址,一键发布作业至目标集群;通过版本适配逻辑,自动兼容 Flink 1.15、1.18 等不同版本的 API 差异,降低版本升级成本。

3.典型应用场景

  1. 企业级流批一体计算平台作业发布:构建统一的 Flink 流批一体平台,基于 Java 实现 YARN Application 作业的标准化发布入口,支撑各业务部门提交大规模实时数仓同步、金融交易风控、物联网数据批流融合计算等作业,统一管控资源配额、权限、日志,提升平台易用性与可维护性。
  2. 核心业务长运行时作业发布:金融、电商等行业的核心业务作业(如 7×24 小时实时风控、订单实时计算),通过 Java 程序发布为 YARN Application 模式,利用其资源独享、隔离性强的优势保障作业稳定性,同时通过程序化监控实现故障快速响应。
  3. 多集群作业分发与容灾:企业部署多套 YARN 集群(本地集群、异地容灾集群),通过 Java 程序实现作业的批量发布、状态统一监控,当主集群故障时自动将作业切换至容灾集群,保障核心业务不中断。
  4. 业务系统触发的批流融合计算:供应链系统、用户画像系统等业务系统触发大规模批流融合计算需求时,通过 Java 接口直接发布 Flink YARN Application 作业,作业完成后将计算结果回调至业务系统,实现 "业务触发 - 批流计算 - 结果返回" 的闭环。

综上,Java 实现发布 Flink YARN Application 模式作业,是企业将 Flink 流批一体计算能力从 "手工运维" 转向 "工程化、自动化管控" 的关键路径:既充分利用 Flink YARN Application 模式的资源独享、隔离性强的优势,又通过 Java 语言的企业级特性,解决发布碎片化、管控缺失、集成性差等痛点,适配企业级核心业务大数据处理的规模化、规范化诉求,为大规模、高可靠的流批一体计算场景提供稳定、可管控的发布支撑。

二.具体实现

1.添加依赖

复制代码
<dependency>
	<groupId>org.apache.flink</groupId>
	<artifactId>flink-yarn</artifactId>
	<version>1.18.1</version>
</dependency>
<dependency>
	<groupId>org.apache.flink</groupId>
	<artifactId>flink-clients</artifactId>
	<version>1.18.1</version>
</dependency>
<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-yarn-api</artifactId>
	<version>3.2.1</version>
</dependency>

2.填充flink参数

复制代码
Configuration flinkConfig = new Configuration();

flinkConfig.setString(JobManagerOptions.TOTAL_FLINK_MEMORY.key(), "1024m");
flinkConfig.setString(TaskManagerOptions.TOTAL_FLINK_MEMORY.key(), "1024m");
flinkConfig.setInteger(TaskManagerOptions.NUM_TASK_SLOTS, 4);
flinkConfig.setString(CoreOptions.FLINK_HADOOP_CONF_DIR, "/xxx/xxx");
flinkConfig.setString(YarnConfigOptions.APPLICATION_TYPE, "Flink");
flinkConfig.setString(PipelineOptions.JARS.key(), "");
flinkConfig.setString(YarnConfigOptions.APPLICATION_NAME.key(), "");
flinkConfig.setString(YarnConfigOptions.APPLICATION_TYPE.key(), "");
flinkConfig.setString(YarnConfigOptions.FLINK_DIST_JAR.key(), "");
flinkConfig.set(YarnConfigOptions.PROVIDED_LIB_DIRS, new ArrayList<>());
... ...

3.初始化客户端

复制代码
DefaultClusterClientServiceLoader clusterClientServiceLoader = new DefaultClusterClientServiceLoader();
ClusterClientFactory clientFactory = clusterClientServiceLoader.getClusterClientFactory(flinkConfig);
ClusterDescriptor clusterDescriptor = clientFactory.createClusterDescriptor(flinkConfig);
ClusterClient<ApplicationId> clusterClient = null;

ClusterSpecification clusterSpecification = clientFactory.getClusterSpecification(flinkConfig);

ApplicationConfiguration applicationConfiguration = ApplicationConfiguration.fromConfiguration(flinkConfig);

4.提交作业

复制代码
clusterClient = clusterDescriptor.deployApplicationCluster(clusterSpecification, applicationConfiguration).getClusterClient();
ApplicationId applicationId = clusterClient.getClusterId();
String jobManagerUrl = clusterClient.getWebInterfaceURL();
相关推荐
维天说6 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19947 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
Elastic 中国社区官方博客7 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
abcy0712137 小时前
storm核心实时机制
大数据·storm
灵机一物7 小时前
合伙制律所分红和提成律师个税怎么合规优化?
大数据·人工智能
噢,我明白了8 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品8 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘8 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记8 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵9 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph