一. 快速启动
在YARN上启动一个长时间运行的Flink集群
启动一个带有4个TaskManager的YARN会话(每一个TaskManager分配4GB的堆内存):
# 从Flink下载页下载hadoop2下载包。
# 下载地址为:http://flink.apache.org/downloads.html
curl -O <flink_hadoop2_download_url>
tar xvzf flink-1.6.1-bin-hadoop2.tgz
cd flink-1.6.1/
./bin/yarn-session.sh -n 4 -jm 1024m -tm 4096m
特别地 -s参数表示每个Task Manager的slot数量。一般我们推荐slot的数量为机器的处理器个数(核数)。
当YARN会话启动之后,就可以用./bin/flink工具来向集群提交任务了。
在YARN上运行Flink任务
curl -O <flink_hadoop2_download_url>
tar xvzf flink-1.6.1-bin-hadoop2.tgz
cd flink-1.6.1/
./bin/flink run -m yarn-cluster -yn 4 -yjm 1024m -ytm 4096m ./examples/batch/WordCount.jar
二. Flink YARN会话
Apache Hadoop YARN是一个集群资源管理框架。它允许在集群上运行各种分布式应用程序。Flink在YARN上运行,与其他应用程序类似。如果已经设置了YARN,则用户无需设置或安装任何内容。
要求:
- 至少是Apache Hadoop 2.2
- HDFS (Hadoop Distributed File System) (或者被Hadoop支持的其他的分布式文件系统)
启动Flink会话
按照以下说明学习如何在YARN集群内启动Flink会话。
会话将启动所有需要的Flink服务(JobManager和TaskManager),以便您可以向集群提交程序。注意,每个会话可以运行多个程序。
下载Flink
下载Flink安装包,Hadoop >= 2。该包包含了我们要求的所有文件。
提取包:
tar xvzf flink-1.6.1-bin-hadoop2.tgz
cd flink-1.6.1/
启动会话
利用下面命令来启动会话:
./bin/yarn-session.sh
该命令的相关参数如下:
用法:
要求参数
-n,–container 分配的YARN容器数量(=Task Managers的数量)
可选参数
-D 动态配置参数
-d,–detached Start detached
-jm,–jobManagerMemory 分配给Job Manager容器的内存(default: MB)
-nm,–name 给YARN分配一个名字
-q,–query 展现可用的YARN资源(内存,核数)
-qu,–queue 指定YARN队列.
-s,–slots 每个TaskManager的slot数量
-tm,–taskManagerMemory 分配个人TaskManager的内存 (default: MB)
-z,–zookeeperNamespace 为HA模式创建ZK子目录的命名空间
请注意,客户端需要设置YARN_CONF_DIR或HADOOP_CONF_DIR环境变量以读取YARN和HDFS配置。
例如:下面这条指令是启动一个YARN会话,分配10个TaskManager,然后每个TaskManager的内存大小分配8G,并且每个TaskManagers分配了32个slots。
./bin/yarn-session.sh -n 10 -tm 8192 -s 32
YARN上的Flink将覆盖以下配置参数jobmanager.rpc.address(因为JobManager总是在不同的机器上分配)、taskmanager.tmp.dirs(我们正在使用YARN给出的tmp目录)和parallelism.default(如果指定了槽的数量)。
如果不想更改配置文件来设置配置参数,可以选择-D标志传递动态属性。比如利用下面这种方式来传递参数: -Dfs.overwrite-files=true -Dtaskmanager.network.memory.min=536346624。
示例调用启动11个容器(尽管只请求了10个容器),因为还需要一个额外的容器分配给ApplicationMaster和Job Manager。
在YARN集群中部署Flink之后,它将向您显示Job Manager的连接细节。
通过停止unix进程(使用CTRL+C)或向客户端输入“stop”来停止YARN会话。
只有在集群上有足够的可用资源时,YARN上的Flink才会启动所有请求的容器。大多数YARN调度程序负责容器的请求内存,有些还负责vcore的数量。默认情况下,vcore的数量等于处理slot(-s)参数。vcores允许用自定义值覆盖vcore的数量。为了使这个参数工作,您应该在集群中启用CPU调度。
独立YARN会话
如果不希望一直运行Fllink的YARN客户端,也可以启动独立的YARN会话。它的参数称为-d或–detached。
在这种情况下,Flink的YARN客户端将只向集群提交Flink, 然后关闭自身。注意,在这种情况下,不可能使用Flink停止YARN会话。
利用YARN工具 (yarn application -kill ) 来停止YARN会话.
附加到现有会话
使用以下命令启动会话:
./bin/yarn-session.sh
此命令将显示以下概述:
Required
-id,–applicationId YARN application Id
如前所述,必须设置YARN_CONF_DIR或HADOOP_CONF_DIR环境变量以读取YARN和HDFS配置。
示例:发出以下命令以附加到正在运行的Flink YARN会话application_1463870264508_0029:
./bin/yarn-session.sh -id application_1463870264508_0029
附加到正在运行的会话将使用YARN ResourceManager来确定作业管理器RPC端口。
通过停止unix进程(使用CTRL+C)或向客户端输入“stop”来停止YARN会话。
提交任务的Flink
使用以下命令向YARN集群提交Flink程序:
./bin/flink
相关参数,请参阅:command-line client。
该命令将向您显示如下帮助菜单:
[...]
Action "run" compiles and runs a program.
Syntax: run [OPTIONS] <jar-file> <arguments>
"run" action arguments:
-c,--class <classname> Class with the program entry point ("main"
method or "getPlan()" method. Only needed
if the JAR file does not specify the class
in its manifest.
-m,--jobmanager <host:port> Address of the JobManager (master) to
which to connect. Use this flag to connect
to a different JobManager than the one
specified in the configuration.
-p,--parallelism <parallelism> The parallelism with which to run the
program. Optional flag to override the
default value specified in the
configuration
使用run操作向YARN提交作业。客户端能够确定JobManager的地址。在偶尔出现问题的情况下,还可以使用-m参数传递JobManager地址。JobManager地址在YARN控制台中可见。
示例:
wget -O LICENSE-2.0.txt http://www.apache.org/licenses/LICENSE-2.0.txt
hadoop fs -copyFromLocal LICENSE-2.0.txt hdfs:/// ...
./bin/flink run ./examples/batch/WordCount.jar \
hdfs:///..../LICENSE-2.0.txt hdfs:///.../wordcount-result.txt
如果有以下错误,请确保所有TaskManager都已启动:
Exception in thread "main" org.apache.flink.compiler.CompilerException:
Available instances could not be determined from job manager: Connection timed out.
您可以在JobManager网络接口中检查TaskManager的数量。此接口的地址打印在YARN会话控制台中。
如果任务管理器一分钟后没有出现,则应该使用日志文件调查问题。
在YARN上运行单个Flink作业
上面的文档描述了如何在Hadoop YARN环境中启动Flink集群。也可以仅在YARN内启动Flink,用于执行单个作业。
请注意,客户机期望设置-yn值(TaskManager的数量)。
示例:
./bin/flink run -m yarn-cluster -yn 2 ./examples/batch/WordCount.jar
YARN会话的命令行选项也可以使用./bin/flink工具。它们前缀有y或yarn(用于长参数选项)。
注意:可以通过设置环境变量FLINK_CONF_DIR,为每个作业使用不同的配置目录。若要使用此副本,请从Flink发行版复制conf目录,并根据每个作业修改日志设置。
User jars & Classpath
默认情况下,Flink在运行单个作业时将包含用户jar到系统类路径中。可以使用yarn.per-job-cluster.include-user-jar参数控制此行为。
当将此设置为DISABLED时,Flink将包括用户类Classpath。
可以通过将参数设置为下列参数之一来控制Classpath中的用户jar位置:
- ORDER: (default) 根据字典顺序将jar添加到系统类路径。
- FIRST: 将jar添加到系统类路径的开头。
- LAST: 将jar添加到系统类路径的末尾。
恢复Flink在YARN上的行为
Flink的YARN客户端具有以下配置参数,用于控制在容器发生故障时的行为。这些参数既可以从conf/flink-conf.yaml设置,也可以在启动YARN会话时使用-D参数设置。
- yarn.reallocate-failed: 此参数控制Flink是否应该重新分配失败的TaskManager容器,Default:
true。 - yarn.maximum-failed-containers:ApplicationMaster在YARN会话失败之前接受的最大失败容器数量,Default:
最初请求的TaskManagers的数量(-n)。 - yarn.application-attempts: ApplicationMaster(+它的TaskManager容器)尝试的次数。如果将该值设置为1(默认),则当Application Master失败时,整个YARN会话将失败。较高的值指定由YARN重新启动ApplicationMaster的次数。
Debugging失败的YARN会话
Flink YARN会话部署失败的原因有很多。配置错误的Hadoop设置(HDFS权限、YARN配置)、版本不兼容(在Cloudera Hadoop上运行Flink要依赖于特定版本的Hadoop)或其他错误。
日志文件
Flink YARN会话在部署过程中失败的情况下,用户必须依赖Hadoop YARN的日志记录能力。最有用的特性是YARN日志聚合。为了启用它,用户必须在yarn-site.xml文件中将yarn.log-aggregation-enable属性设置为true。启用此功能后,用户可以使用以下命令来检索(失败的)YARN会话的所有日志文件。
yarn logs -applicationId <application ID>
请注意,会话完成之后需要几秒钟,直到日志显示出来。
YARN客户端控制台 & Web界面
Flink YARN客户端在运行时出现错误时(例如,如果任务管理器在一段时间后停止工作),也在终端中打印错误消息。
除此之外,还有YARN资源管理器网络接口(默认情况下在端口8088上)。资源管理器网络接口的端口由yarn.resourcemanager.webapp.address配置值决定。
它允许访问运行YARN应用程序的日志文件,并显示失败应用程序的诊断。
背景/内部
本章节简要描述了Flink和YARN如何交互。
YARN客户端需要访问Hadoop配置以连接到YARN资源管理器和HDFS。它使用以下策略确定Hadoop配置:
- 测试是否设置了YARN_CONF_DIR、HADOOP_CONF_DIR或HADOOP_CONF_PATH(按照该顺序)。如果设置了这些变量之一,则使用它们读取配置。
- 如果上面的策略失败(在正确的YARN设置中不应该出现这种情况),客户端将使用HADOOP_HOME环境变量。如果设置了,客户端尝试访问$HADOOP_HOME/etc/hadoop(Hadoop 2)和$HADOOP_HOME/conf(Hadoop 1)。
当启动新的Flink YARN会话时,客户端首先检查请求的资源(容器和内存)是否可用。之后,它将包含Flink和配置的jar上传到HDFS(步骤1)。
客户端的下一步是请求(步骤2)YARN容器启动ApplicationMaster(步骤3)。由于客户机将配置和jar-file注册为容器的资源,所以运行在该特定机器上的YARN的NodeManager将负责准备容器(例如,下载文件)。完成之后,启动ApplicationMaster(AM)。
JobManager和AM在同一个容器中运行。一旦它们成功启动,AM就知道JobManager(它自己的主机)的地址。它为TaskManagers生成一个新的Flink配置文件(以便它们可以连接到JobManager)。该文件也被上传到HDFS。此外,AM容器还为Flink的网络接口提供服务。YARN代码分配的所有端口都是临时端口。这允许用户并行执行多个Flink YARN会话。
之后,AM开始为Flink的任务管理器分配容器,这将从HDFS下载jar文件和修改后的配置。完成这些步骤后,Flink就设置好了,准备接受Jobs。