文章目录
前言
Resource Providers有以下三种:
- Standalone
- Native Kubernetes
- yarn
本文正是要将yarn,其他两个在Flink官网可查看。
入门
本入门部分将指导您在 YARN 上设置功能齐全的 Flink 集群。
简介
Apache Hadoop YARN是一个在许多数据处理框架中流行的资源提供程序。Flink 服务提交给 YARN 的 ResourceManager,它在 YARN NodeManager 管理的机器上生成容器。Flink 将其 JobManager 和 TaskManager 实例部署到此类容器中。
Flink 可以根据 JobManager 上运行的作业所需的处理槽数动态分配和取消分配 TaskManager 资源。
准备
本入门部分假定 YARN 环境从 2.8.5 版本开始。通过 Amazon EMR、Google Cloud DataProc 等服务或 Cloudera 等产品可以最方便地提供 YARN 环境。不建议在本地或集群上手动设置 YARN 环境来完成本入门教程。
- 通过运行 确保您的 YARN 集群已准备好接受 Flink 应用程序yarn top。它应该不显示错误消息。
- 从下载页面下载最近的 Flink 发行版并解压。
- 重要确保HADOOP_CLASSPATH设置了环境变量(可以通过运行检查echo $HADOOP_CLASSPATH)。如果没有,请使用
export HADOOP_CLASSPATH=hadoop classpath
在 YARN 上启动 Flink 会话
一旦你确定HADOOP_CLASSPATH环境变量设置好了,你就可以启动一个 Flink on YARN 会话,并提交一个示例作业:
# we assume to be in the root directory of
# the unzipped Flink distribution
# (0) export HADOOP_CLASSPATH
export HADOOP_CLASSPATH=`hadoop classpath`
# (1) Start YARN Session
./bin/yarn-session.sh --detached
# (2) You can now access the Flink Web Interface through the
# URL printed in the last lines of the command output, or through
# the YARN ResourceManager web UI.
# (3) Submit example job
./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
# (4) Stop YARN session (replace the application id based
# on the output of the yarn-session.sh command)
echo "stop" | ./bin/yarn-session.sh -id application_XXXXX_XXX
恭喜!通过在 YARN 上部署 Flink,您已成功运行 Flink 应用程序。
Flink 在 YARN 上支持的部署模式
对于生产使用,我们建议以Per-job 或 Application Mode部署 Flink 应用程序,因为这些模式为应用程序提供了更好的隔离。
yarn-application 模式
Application Mode 将在 YARN 上启动 Flink 集群,其中应用程序 jar 的 main() 方法在 YARN 中的 JobManager 上执行。应用程序完成后,集群将立即关闭。yarn application -kill 您可以使用或取消 Flink 作业手动停止集群。
./bin/flink run-application -t yarn-application ./examples/streaming/TopSpeedWindowing.jar
部署应用程序模式集群后,您可以与其交互以执行取消或获取保存点等操作。
# List running job on the cluster
./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
# Cancel running job
./bin/flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
请注意,取消应用程序集群上的作业将停止集群。
要释放应用程序模式的全部潜力,请考虑将其与yarn.provided.lib.dirs配置选项一起使用,并将您的应用程序 jar 预上传到集群中所有节点都可以访问的位置。在这种情况下,命令可能如下所示:
./bin/flink run-application -t yarn-application \
-Dyarn.provided.lib.dirs="hdfs://myhdfs/my-remote-flink-dist-dir" \
hdfs://myhdfs/jars/my-application.jar
以上将允许作业提交更加轻量级,因为所需的 Flink jar 和应用程序 jar 将由指定的远程位置拉取,而不是由客户端运送到集群。
per job 模式
Per-job Cluster 模式会在 YARN 上启动一个 Flink 集群,然后在本地运行提供的应用程序 jar,最后将 JobGraph 提交到 YARN 上的 JobManager。如果您传递–detached参数,一旦提交被接受,客户端将停止。
一旦作业停止,YARN 集群将停止。
./bin/flink run -t yarn-per-job --detached ./examples/streaming/TopSpeedWindowing.jar
部署 Per-Job 集群后,您可以与其交互以执行取消或获取保存点等操作。
# List running job on the cluster
./bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
# Cancel running job
./bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY <jobId>
yarn session 模式
会话模式有两种操作模式:
- 附加模式(默认):yarn-session.sh客户端将 Flink 集群提交给 YARN,但客户端一直在运行,跟踪集群的状态。如果集群失败,客户端将显示错误。如果客户端被终止,它也会发出集群关闭的信号。
- 分离模式(-d或–detached):yarn-session.sh客户端将 Flink 集群提交给 YARN,然后客户端返回。需要再次调用客户端或 YARN 工具来停止 Flink 集群。
会话模式将在 /tmp/.yarn-properties- 中创建一个隐藏的 YARN 属性文件,提交作业时,命令行界面将选取该文件以进行群集发现。
您也可以在提交 Flink 作业时在命令行界面中手动指定目标 YARN 集群。这是一个例子:
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY \
./examples/streaming/TopSpeedWindowing.jar
您可以使用以下命令重新附加到 YARN 会话:
./bin/yarn-session.sh -id application_XXXX_YY
除了通过文件传递配置外conf/flink-conf.yaml,您还可以在提交时./bin/yarn-session.sh使用-Dkey=value参数将任何配置传递给客户端。
YARN 会话客户端也有一些常用设置的“快捷参数”。它们可以用 列出./bin/yarn-session.sh -h。
Flink on YARN 参考
在 YARN 上配置 Flink
YARN 特定的配置列在配置页面上。
以下配置参数由 Flink on YARN 管理,因为它们可能在运行时被框架覆盖:
- jobmanager.rpc.address(Flink on YARN动态设置为JobManager容器的地址)
- io.tmp.dirs(如果不设置,Flink 设置 YARN 定义的临时目录)
- high-availability.cluster-id(HA服务中自动生成ID区分多个集群)
如果你需要向 Flink 传递额外的 Hadoop 配置文件,你可以通过HADOOP_CONF_DIR环境变量来完成,它接受一个包含 Hadoop 配置文件的目录名。默认情况下,所有必需的 Hadoop 配置文件都是通过HADOOP_CLASSPATH环境变量从类路径加载的。
资源分配行为
如果在 YARN 上运行的 JobManager 无法使用现有资源运行所有提交的作业,它将请求额外的 TaskManager。特别是在会话模式下运行时,如果需要,JobManager 将在提交额外作业时分配额外的 TaskManager。超时后未使用的 TaskManager 会再次被释放。
JobManager 和 TaskManager 进程的内存配置将受到 YARN 实现的制约。默认情况下,报告的 VCore 数等于每个 TaskManager 配置的插槽数。yarn.containers.vcores允许使用自定义值覆盖vcore的数量。为了让这个参数起作用,你应该在你的 YARN 集群中启用 CPU 调度。
失败的容器(包括 JobManager)被 YARN 替换。JobManager容器重启的最大次数是通过yarn.application-attempts配置的(默认为 1)。一旦所有尝试都用尽,YARN 应用程序将失败。
YARN 上的高可用性
YARN 上的高可用性是通过 YARN 和高可用性服务的组合来实现的。
一旦配置了 HA 服务,它将持久化 JobManager 元数据并执行领导者选举。
YARN 负责重启失败的 JobManager。JobManager 的最大重启次数是通过两个配置参数定义的。首先 Flink 的yarn.application-attempts配置会默认为 2。这个值受 YARN 的yarn.resourcemanager.am.max-attempts限制,也默认为 2。
请注意,Flinkhigh-availability.cluster-id在 YARN 上部署时正在管理配置参数。Flink 将其默认设置为 YARN 应用程序 ID。 在 YARN 上部署 HA 集群时,不应覆盖此参数。集群 ID 用于区分 HA 后端(例如 Zookeeper)中的多个 HA 集群。覆盖此配置参数会导致多个 YARN 集群相互影响。
Container容器关闭行为
- YARN 2.3.0 < version < 2.4.0 如果应用的appmaster失败,那么所有container都会重启
- YARN 2.4.0 < version < 2.6.0 TaskManager 容器在应用程序主节点故障期间保持活动状态。这样做的优点是启动时间更快,并且用户不必等待再次获取容器资源。
- YARN 2.6.0 <= version 将尝试失败有效间隔设置为 Flinks 的 Akka 超时值。尝试失败有效性间隔表示,只有在系统在一个时间间隔内看到应用程序尝试的最大次数后,应用程序才会被终止。这可以避免长时间的作业会耗尽其应用程序尝试次数。
Hadoop YARN 2.4.0 有一个主要 bug(在 2.5.0 中已修复),该错误阻止容器从重新启动的应用程序主机/作业管理器容器重新启动。有关详细信息,请参阅 FLINK-4142。我们建议至少使用Hadoop 2.5.0在YARN上进行高可用性设置。
支持的 Hadoop 版本
Flink on YARN 针对 Hadoop 2.8.5 编译,>= 2.8.5支持所有 Hadoop 版本,包括 Hadoop 3.x。
为了向 Flink 提供所需的 Hadoop 依赖项,我们建议设置已经在入门/准备HADOOP_CLASSPATH部分介绍的环境变量。
如果不行,也可以将依赖项放到lib/Flink 的文件夹中。
Flink 还提供了预先捆绑的 Hadoop fat jar,用于将它们放置在网站的Downloads / Additional Components部分的lib/文件夹中。这些预先捆绑的 fat jar 带有阴影,以避免与常见库的依赖冲突。Flink 社区没有针对这些预先捆绑的 jar 测试 YARN 集成。
在防火墙后面的 YARN 上运行 Flink
一些 YARN 集群使用防火墙来控制集群与网络其余部分之间的网络流量。在这些设置中,Flink 作业只能从集群网络内(防火墙后面)提交到 YARN 会话。如果这对于生产使用不可行,Flink 允许为其 REST 端点配置一个端口范围,用于客户端-集群通信。配置此范围后,用户还可以跨防火墙向 Flink 提交作业。
用于指定 REST 端点端口的配置参数是rest.bind-port。此配置选项接受单个端口(例如:“50010”)、范围(“50000-50025”)或两者的组合。
用户 jars & Classpath
会话模式
在 Yarn 上使用 Session Mode 部署 Flink 时,只有在启动命令中指定的 JAR 文件才会被识别为 user-jars 并包含在用户类路径中。
PerJob 模式和应用模式
在 Yarn 上以 PerJob/Application 模式部署 Flink 时,启动命令中指定的 JAR 文件和 Flinkusrlib文件夹中的所有 JAR 文件都会被识别为 user-jars。默认情况下,Flink 会将 user-jars 包含到系统类路径中。这种行为可以通过yarn.classpath.include-user-jar参数来控制。
当将此设置为DISABLEDFlink 时,会将 jar 包含在用户类路径中。
可以通过将参数设置为以下之一来控制类路径中的 user-jars 位置:
- ORDER:(默认)根据字典顺序将 jar 添加到系统类路径中。
- FIRST: 将 jar 添加到系统类路径的开头。
- LAST:将 jar 添加到系统类路径的末尾。