引言
在大数据计算领域,Apache Flink凭借其高性能、流批统一的特性,成为实时数据处理的首选框架。而YARN作为Hadoop生态的资源调度平台,能够为Flink提供强大的资源管理能力。将Flink部署在YARN上,既能充分利用集群资源,又能实现作业的灵活调度。本文将深入讲解Flink on YARN的部署要点,结合实际操作和常见问题解决,帮助开发者快速掌握这一关键技术。
一、前置条件:HADOOP_CLASSPATH配置
Flink集成YARN时,首先需要配置HADOOP_CLASSPATH
环境变量,该变量用于指定Hadoop相关类库的路径。若未正确配置,Flink将无法与YARN进行有效通信,导致部署失败。
1.1 检查环境变量
通过以下命令检查HADOOP_CLASSPATH
是否已设置:
bash
echo $HADOOP_CLASSPATH
若输出为空,则表示尚未配置该环境变量。
1.2 配置环境变量
编辑用户主目录下的.bash_profile
文件:
bash
vi ~/.bash_profile
在文件中添加以下内容,动态获取Hadoop类路径:
bash
export HADOOP_CLASSPATH=`hadoop classpath`
保存文件后,执行以下命令使配置生效:
bash
source ~/.bash_profile
1.3 未配置的异常情况
若未配置HADOOP_CLASSPATH
,启动Flink on YARN时会抛出类似以下异常:
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.yarn.api.records.ApplicationId not found
这是因为Flink无法找到YARN相关的类库,导致无法与YARN集群建立连接。
二、Flink on YARN的部署模式
Flink on YARN支持三种部署模式:Session Mode、Application Mode和Per-Job Cluster Mode,每种模式适用于不同的场景。
2.1 Session Mode(会话模式)
Session Mode是最常用的部署模式,它先在YARN上启动一个长期运行的Flink集群,然后多个作业可以共享这个集群资源。这种模式的优点是资源利用率高,适合运行多个小作业。
启动YARN会话:
bash
./bin/yarn-session.sh --detached
参数说明:
--detached
:以分离模式运行,即在后台启动YARN会话。
提交作业到会话:
bash
./bin/flink run -d ./examples/streaming/TopSpeedWindowing.jar
停止YARN会话:
bash
echo "stop" | ./bin/yarn-session.sh -id application_XXXXX_XXX
2.2 Application Mode(应用模式)
Application Mode是Flink 1.10引入的新模式,每个Flink应用都有自己独立的JobManager,适用于需要隔离资源的场景。
提交应用:
bash
./bin/flink run-application -d -t yarn-application ./examples/streaming/TopSpeedWindowing.jar
查看应用列表:
bash
./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
取消应用:
bash
./bin/flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
2.3 Per-Job Cluster Mode(单作业集群模式)
Per-Job Cluster Mode为每个作业创建一个独立的Flink集群,作业完成后集群自动销毁。这种模式提供了更好的资源隔离,但资源启动开销较大。
提交作业:
bash
./bin/flink run -t yarn-per-job --detached ./examples/streaming/TopSpeedWindowing.jar
查看作业:
bash
./bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
取消作业:
bash
./bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY <jobId>
2.4 模式对比与选择
模式 | 资源利用率 | 启动开销 | 隔离性 | 适用场景 |
---|---|---|---|---|
Session Mode | 高 | 低 | 低 | 多个小作业共享资源 |
Application Mode | 中 | 中 | 高 | 独立应用,需要资源隔离 |
Per-Job Mode | 低 | 高 | 高 | 资源密集型大作业 |
三、Flink on YARN常用参数详解
Flink on YARN提供了丰富的参数选项,用于控制集群资源分配和作业调度。以下是一些常用参数及其说明:
3.1 资源分配参数
bash
-yjm,--jobManagerMemory <arg> # 设置JobManager的内存,单位是MB
-ytm,--taskManagerMemory <arg> # 设置每个TaskManager的内存,单位是MB
-ys,--slots <arg> # 每个TaskManager使用的Slot数量
3.2 集群标识参数
bash
-ynm,--name <arg> # 给当前Flink application在YARN上指定名称
-yqu,--queue <arg> # 指定YARN资源队列
3.3 高级参数
bash
-d,--detached # 设置在后台运行
-yq,--query # 显示YARN中可用的资源(内存、CPU核数)
-yz,--zookeeperNamespace <arg> # 针对HA模式在Zookeeper上创建NameSpace
-yid,--applicationID <yarnAppId> # 指定YARN集群上的任务ID,附着到已运行的YARN Session中
3.4 参数使用示例
启动一个具有特定资源配置的YARN会话:
bash
./bin/yarn-session.sh -yjm 1024 -ytm 4096 -ys 4 -ynm "my-flink-job" -yqu production
四、端口配置与问题解决
4.1 端口占用问题
Flink on YARN部署时,经常会遇到端口被占用的问题,导致作业无法正常启动。常见的端口冲突包括REST API端口和内部通信端口。
4.2 端口配置参数
通过修改conf/flink-conf.yaml
文件中的以下参数,可以解决端口冲突问题:
yaml
rest.port: 7052 # REST API端口
rest.bind-port: 8080-8090 # REST API绑定端口范围
4.3 配置说明
rest.port
:指定Flink Web UI和REST API的固定端口。rest.bind-port
:指定Flink尝试绑定的端口范围,当固定端口被占用时,会自动从该范围中选择可用端口。
4.4 配置示例
修改flink-conf.yaml
文件,配置动态端口范围:
yaml
rest.port: 8081
rest.bind-port: 8080-8100
五、部署实战与最佳实践
5.1 生产环境部署建议
- 资源规划:根据作业负载和集群资源,合理分配JobManager和TaskManager的内存和CPU资源。
- 使用资源队列 :通过
-yqu
参数将Flink作业提交到指定的YARN队列,避免资源竞争。 - 启用HA模式:对于关键业务作业,启用Flink的高可用模式,确保集群稳定性。
- 监控与调优:结合Prometheus和Grafana等监控工具,实时监控Flink集群性能,并根据监控数据进行调优。
5.2 故障排查步骤
- 查看YARN日志:通过YARN Web UI查看应用日志,定位启动失败原因。
- 检查Flink配置 :确认
flink-conf.yaml
和yarn-site.xml
配置正确。 - 检查网络连接:确保Flink节点之间网络畅通,无防火墙限制。
- 查看端口占用 :使用
netstat
命令检查端口占用情况,调整冲突端口。
通过以上步骤,开发者可以高效地在YARN上部署和管理Flink作业,充分发挥两者的协同优势。掌握不同部署模式的特点和适用场景,合理配置资源参数,能够有效提升作业性能和集群稳定性。