Flink源码浅析:Yarn-per-job模式解析——从脚本到主类

122 篇文章 ¥59.90 ¥99.00
本文深入解析了Flink在Yarn-per-job模式下的运行机制,包括从脚本设置参数到主类执行的全过程。内容涵盖脚本解析、主类解析以及执行流程,帮助读者理解Flink如何在Yarn集群上独立运行作业。

在本篇文章中,我们将深入探讨Flink中的Yarn-per-job模式。我们将从脚本到主类的过程进行详细解析,并附上相应的源代码。

  1. 背景介绍
    Flink是一个开源的大数据处理框架,它提供了各种处理大规模数据的功能和工具。其中,Yarn是Apache Hadoop生态系统中的一部分,用于管理集群资源和任务调度。Yarn-per-job模式是Flink在Yarn上运行的一种模式,它允许每个作业在Yarn集群上独立运行。

  2. 脚本解析
    在Yarn-per-job模式下,我们首先需要编写一个脚本来提交Flink作业。脚本通常是一个Shell脚本,其中包含了一些必要的参数和配置信息。以下是一个示例脚本:

#!/bin/bash

FLINK_HOME=/path/to/flink
JOB_JAR=/path/to/job.jar
JOB_CLASS=com.example.MyJob
<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` > 默认值 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值