Flink源码探究:yarn-per-job模式解析——从脚本到主类

183 篇文章 ¥59.90 ¥99.00
本文深入解析Flink在yarn-per-job模式下的实现原理,涉及从脚本到主类的过程。介绍了yarn-per-job模式的基本概念,详细解释了提交Flink应用的Shell脚本和主类解析,展示了如何通过CommandLineClient和YarnClusterDescriptor部署作业。通过源码分析,帮助读者理解Flink在YARN集群上的作业提交和执行流程。

Flink源码探究:yarn-per-job模式解析——从脚本到主类

一、引言
Big Data 大数据技术在当今信息时代中的应用越来越广泛。Flink作为一种流式处理框架,具有高效、可扩展和容错性强等优点,成为大数据处理的首选之一。其中,Flink的yarn-per-job模式可实现将Flink应用提交到YARN集群上进行分布式运行。本文将深入解析Flink在yarn-per-job模式下的实现原理,涉及从脚本到主类的过程,并附有相应源代码。

二、yarn-per-job模式基本介绍
Flink的yarn-per-job模式是一种将Flink应用作为独立作业(job)提交到YARN集群上的方式。它能够根据应用的需求,在YARN上为每个应用创建一个独立的Application Master(AM),用于协调作业的执行和资源管理。相比yarn-session模式,yarn-per-job模式更适合于运行长时间或独立性较强的作业。

三、源码解析

  1. 脚本解析
    在yarn-per-job模式中,用户可以通过Shell脚本来提交Flink应用。脚本中包含了一些关键信息,如Flink程序的路径、运行参数、作业名称等。下面是一个示例脚本(submit.sh):
#!/bin/bash

flink run -m yarn-cluster 
<think> 我们正在分析用户的问题: 用户希望了解执行 `flink run -t yarn-per-job -c com.sxemc.chapter2.UnBoundWordCount original-demo11-1.0-SNAPSHOT.jar` 命令的含义以及可能出现的错误和解决办法。 首先,我们分解这个命令: 命令格式:`flink run [options] <jar-file> <arguments>` 具体参数解析- `-t yarn-per-job`:指定部署模式YARN per-job模式(每个作业启动一个单独的Flink集群)。 - `-c com.sxemc.chapter2.UnBoundWordCount`:指定入口(main方法所在的)。 - `original-demo11-1.0-SNAPSHOT.jar`:要运行的JAR包。 常见问题及解决方案: 1. **找不到(ClassNotFoundException)**:通常是因为指定的名错误或JAR包中不存在该。 解决:检查名拼写,确认JAR包中包含该。 2. **YARN资源不足**:YARN集群没有足够的资源启动ApplicationMaster或TaskManager。 解决:检查YARN资源队列的状态,调整Flink作业的资源请求(通过`-yjm`、`-ytm`等参数)。 3. **依赖冲突**:用户JAR包中的依赖与Flink或Hadoop的依赖冲突。 解决:使用`maven-shade-plugin`打包时重命名依赖,或排查冲突的依赖。 4. **HDFS权限问题**:Flink需要向HDFS上传作业JAR和配置文件,若当前用户没有权限则失败。 解决:使用`kinit`进行Kerberos认证,或联系管理员授权HDFS目录。 5. **网络问题**:作业提交过程中网络中断。 解决:重试提交,检查网络连接。 6. **入口错误**:入口没有继承正确的接口或main方法签名错误。 解决:确认实现了`org.apache.flink.api.java.utils.ParameterTool`或正确使用`env.execute()`。 7. **版本不兼容**:Flink客户端版本与YARN集群上的Flink版本不一致。 解决:确保提交作业的Flink客户端版本与集群上安装的版本一致。 8. **配置文件错误**:如`flink-conf.yaml`配置错误(例如HA配置不正确)。 解决:检查配置文件,特别是YARN相关的配置。 其他注意事项: -YARN per-job模式下,作业完成后集群资源会自动释放。 - 可以通过`-yD`参数指定动态属性,例如:`-yD taskmanager.memory.process.size=2048m`。 生成相关问题: 1. 如何查看提交到YARNFlink作业日志? 2. Flink on YARN 有哪些部署模式?它们之间有什么区别? 3. 如何为Flink作业指定自定义的YARN队列? 4. Flink作业提交时如何传递参数? 5. Flink on YARN 作业失败的原因有哪些?如何排查? 根据以上分析,我们组织答案。 </think> ### Flink命令解析:`flink run -t yarn-per-job -c com.sxemc.chapter2.UnBoundWordCount original-demo11-1.0-SNAPSHOT.jar` #### 一、命令结构解析 | 参数 | 含义 | 数学表示 | |------------------------------|----------------------------------------------------------------------|-----------------------------| | `flink run` | 提交Flink作业到集群 | $\text{job} \to \text{cluster}$ | | `-t yarn-per-job` | 部署模式YARN per-job(每个作业独立集群) | $\text{mode}_{\text{yarn-per-job}} = \text{isolated}$ | | `-c com.sxemc.chapter2.UnBoundWordCount` | 全限定名(程序入口) | $\text{main}_{\text{class}} \in \text{JAR}$ | | `original-demo11-1.0-SNAPSHOT.jar` | 应用程序JAR包路径 | $\text{job}_{\text{package}} = f(\text{path})$ | #### 二、部署模式对比 | 模式 | 资源隔离 | 启动速度 | 适用场景 | 资源方程 | |-----------------|----------------|----------|-------------------|------------------------| | **yarn-per-job**| 作业级隔离 | 慢 | 生产环境稳定作业 | $R_{\text{total}} = \sum R_{\text{job}}$ | | yarn-session | 会话级共享 | 快 | 开发/测试环境 | $R_{\text{pool}} = \text{const}$ | | kubernetes | 容器级隔离 | 中等 | 云原生环境 | $R_{\text{pod}} \subset R_{\text{node}}$ | #### 三、常见错误及解决方案 1. **找不到(ClassNotFoundException)** ```bash Caused by: java.lang.ClassNotFoundException: com.sxemc.chapter2.UnBoundWordCount ``` **原因**: - JAR包未包含指定:$\text{class} \notin \text{JAR}$ - 路径不正确:$ \text{classpath} \neq \text{actual\_path} $ **解决**: ```bash # 检查JAR内容 jar -tf original-demo11-1.0-SNAPSHOT.jar | grep UnBoundWordCount # 重新打包包含 mvn clean package ``` 2. **YARN资源不足** ```log Exception: Could not allocate resource manager ``` **资源方程分析**: $$ \text{requested}_{\text{vcpu}} > \text{available}_{\text{vcpu}} \quad \lor \quad \text{requested}_{\text{mem}} > \text{available}_{\text{mem}} $$ **解决**: ```bash # 降低资源请求 flink run -t yarn-per-job \ -yjm 1024 \ # AM内存(MB) -ytm 2048 \ # TM内存(MB) -ys 2 \ # slot数量 -c ... original-demo11-1.0-SNAPSHOT.jar ``` 3. **依赖冲突** ```log java.lang.NoSuchMethodError: org.apache.flink.api.common.functions.FlatMapFunction.flatMap ``` **原因**: $$ \exists \text{lib}_A, \text{lib}_B : \text{version}_A \neq \text{version}_B $$ **解决**: ```xml <!-- pom.xml 排除冲突依赖 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> ``` 4. **HDFS权限问题** ```log org.apache.hadoop.security.AccessControlException: Permission denied ``` **解决**: ```bash # Kerberos认证 kinit -kt user.keytab user@DOMAIN # 临时HDFS授权 hdfs dfs -chmod 755 /user/flink ``` 5. **网络超时** ```log org.apache.flink.runtime.rest.util.ConnectingTimeoutException: Timeout ``` **优化参数**: ```bash flink run -t yarn-per-job \ -yD akka.ask.timeout=120s \ -yD web.timeout=120000 \ -c ... original-demo11-1.0-SNAPSHOT.jar ``` #### 四、最佳实践建议 1. **资源计算公式**: $$ \text{TM内存} = \text{taskmanager.heap.mb} + \text{taskmanager.memory.off-heap.size} + \text{network\_buffers} $$ 2. **日志排查路径**: ```bash yarn logs -applicationId <app_id> > flink_debug.log ``` 3. **参数优先级(由高到低)**: CLI参数 > `flink-conf.yaml` > 默认值 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值