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 YARN Application 作业发布的核心痛点

  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 集群的资源余量,易将作业提交至资源不足的集群,导致作业启动失败。

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

       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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路边草随风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值