在开始部署Flink on Yarn之前,我们需要确保底层基础设施已经准备就绪。这包括Hadoop集群的部署、系统环境配置以及必要的依赖安装。我曾在多个生产环境中部署过Flink on Yarn,发现环境准备阶段往往是最容易出问题的地方,特别是当系统环境变量配置不正确时。
首先,你需要一个正常运行的Hadoop Yarn集群。我建议使用Hadoop 3.x版本,因为它对资源管理和调度做了很多优化。你可以通过运行yarn node -list命令来验证Yarn集群是否正常运行。如果看到节点列表输出,说明Yarn已经就绪。
接下来是Java环境的配置。Flink 1.14+需要Java 8或11,我强烈建议使用OpenJDK 11,因为它在性能和稳定性方面都有显著提升。安装完成后,记得设置JAVA_HOME环境变量:
bash复制export JAVA_HOME=/usr/lib/jvm/java-11-openJDK
export PATH=$PATH:$JAVA_HOME/bin
另一个关键点是Hadoop类路径的配置。这是新手最容易忽略的地方,也是导致后续各种奇怪报错的根源。你需要在系统环境变量中添加:
bash复制export HADOOP_CLASSPATH=$(hadoop classpath)
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
我遇到过很多次因为HADOOP_CLASSPATH配置不正确导致Flink无法连接到Yarn的情况。建议把这些配置写入/etc/profile或者~/.bashrc文件中,然后执行source命令使其生效。
Flink的安装过程相对简单,但配置选项却非常丰富,这也是Flink强大灵活性的体现。我通常会选择从Apache官网下载预编译的二进制包,这样可以避免很多编译依赖的问题。
解压安装包后,第一件事就是配置环境变量:
bash复制export FLINK_HOME=/opt/flink-1.14.0
export PATH=$PATH:$FLINK_HOME/bin
接下来进入conf目录,我们需要修改几个关键配置文件。首先是flink-conf.yaml,这是Flink的核心配置文件。对于生产环境,我建议至少配置以下参数:
yaml复制jobmanager.memory.process.size: 4096m
taskmanager.memory.process.size: 8192m
taskmanager.numberOfTaskSlots: 4
parallelism.default: 4
这些值需要根据你的集群资源情况调整。在我的经验中,内存配置不当是导致任务失败的最常见原因之一。特别是当TaskManager内存设置过小时,很容易出现OOM错误。
另一个重要文件是masters和workers。在standalone模式下需要配置这些文件,但在Yarn模式下可以忽略,因为Yarn会负责管理这些进程。
Flink on Yarn支持两种运行模式,每种模式都有其适用场景。我在实际项目中使用过这两种模式,下面分享一些实战经验。
Session模式适合短时间频繁提交多个任务的场景。启动Session集群的命令如下:
bash复制./bin/yarn-session.sh -nm flink-session -d
这个命令会启动一个常驻的Flink集群。-nm参数指定了应用名称,-d表示以分离模式运行。我建议总是使用-d参数,否则终端关闭后Session也会终止。
Session模式的一个痛点是资源管理。由于资源是预先分配的,即使没有任务运行,这些资源也无法被其他应用使用。我曾经在一个资源紧张的集群上遇到过因为Session集群占用资源导致其他任务无法调度的情况。
Per-Job模式是我更推荐的部署方式,特别是对于生产环境。每个任务都会独立申请资源,任务完成后立即释放。提交任务的命令示例:
bash复制./bin/flink run -m yarn-cluster \
-ynm flink-wordcount \
-yjm 2048m \
-ytm 4096m \
./examples/batch/WordCount.jar
这里有几个关键参数需要注意:
-ynm:设置应用名称-yjm:指定JobManager内存-ytm:指定每个TaskManager内存Per-Job模式的一个优势是可以为不同任务配置不同的资源参数。比如,对于计算密集型任务,我可以增加TaskManager的CPU核数;对于内存密集型任务,则可以增加内存分配。
在真实生产环境中部署Flink on Yarn时,会遇到各种性能问题和异常情况。下面分享一些我在实践中总结的经验。
Flink的内存模型比较复杂,理解各个内存区域的用途对性能调优至关重要。主要包含以下几个部分:
一个常见的配置示例如下:
yaml复制taskmanager.memory.process.size: 8192m
taskmanager.memory.task.heap.size: 4096m
taskmanager.memory.managed.size: 1024m
taskmanager.memory.network.min: 512m
taskmanager.memory.network.max: 1024m
类加载器冲突是Flink on Yarn中常见的问题之一。错误信息通常包含"Trying to access closed classloader"。解决方法是在flink-conf.yaml中添加:
yaml复制classloader.check-leaked-classloader: false
资源不足错误也很常见。Yarn会报错"AM container is exited with exitCode: -104"。这通常是因为内存配置不足导致的。解决方法包括:
网络超时问题通常表现为任务长时间卡住或者随机失败。可以在flink-conf.yaml中调整这些参数:
yaml复制akka.ask.timeout: 60s
web.timeout: 60000
一个健壮的生产级Flink集群离不开完善的监控体系。下面介绍几种我在实际项目中使用的监控方案。
Flink提供了丰富的内置指标,可以通过Prometheus和Grafana进行收集和展示。配置方法如下:
首先在flink-conf.yaml中启用Prometheus reporter:
yaml复制metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
metrics.reporter.prom.port: 9250-9260
然后在Prometheus配置中添加Flink作业的抓取目标:
yaml复制scrape_configs:
- job_name: 'flink'
static_configs:
- targets: ['flink-jobmanager:9250']
Flink on Yarn的日志管理比较特殊,因为容器是动态创建的。我推荐以下两种方案:
bash复制yarn logs -applicationId <application_id>
properties复制appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 10
对于关键业务应用,建议配置高可用模式。这需要在flink-conf.yaml中添加:
yaml复制high-availability: zookeeper
high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181
high-availability.storageDir: hdfs:///flink/ha/
同时,Yarn应用恢复功能也需要启用:
yaml复制yarn.application-attempts: 10
在实际运维中,我发现定期检查以下指标非常重要:
这些指标能帮助我们及时发现潜在问题,避免大规模故障发生。