环境信息:
Hadoop版本:2.6.0
Flink版本:1.1.2
快速部署Flink on Yarn环境:
比如启动一个有4个TaskManager(每个节点都有4GB堆内存)的Yarn会话:
1. 下载Flink的软件包,如flink-1.1.2-bin-hadoop26-scala_2.11.tgz(因为我的Hadoop集群版本为2.6.0,Flink的Binary包是包含Yarn客户端的)
2. 解压缩
su - hadoop
tar -zxvf flink-1.1.2-bin-hadoop26-scala_2.11.tgz
ln -s flink-1.1.2 flink
3. 启动Flink Yarn Session
cd flink
bin/yarn-session.sh -n 4 -jm 1024 -tm 4096 -s 32
对参数说明:
-n,--Container 指YARN container分配的个数(即TaskManagers的个数)
-jm,--jobManagerMemory 指JobManager Containe的内存大小,单位为MB
-tm,--taskManagerMemory 指每个TaskManagerContainer的内存大小,单位为MB
-s 指每个TaskManager的slot个数。
执行上面命令来分配 4个 TaskManager,每个都拥有 4GB 的内存和 32 个 slot,同时会请求启动 5 个容器,因为对于 ApplicationMaster 和 JobManager 还需要一个额外的容器。
注:
A. Flink的JobManager和TaskManager的内存大小不要小于YARNContainer的最小值(yarn.scheduler.minimum-allocation-mb,默认值为1024MB)。
B. 请注意客户端需要提前设置环境变量 YARN_CONF_DIR 或 HADOOP_CONF_DIR,用来读取 YARN 和 HDFS 配置。
启动的日志中会连接Yarn的ResourceManager,如下:
org.apache.flink.yarn.YarnClusterDescriptor- Using values:
org.apache.flink.yarn.YarnClusterDescriptor- TaskManager count = 4
org.apache.flink.yarn.YarnClusterDescriptor- JobManager memory = 1024
org.apache.flink.yarn.YarnClusterDescriptor- TaskManager memory = 4096
org.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at /192.168.1.128:9080
这里省略将Flink的配置文件和Jar等上传到
hdfs://gpmaster:9000/user/hadoop/.flink/application_1474521395841_0004/目录下的过程
org.apache.flink.yarn.YarnClusterDescriptor - Submitting application master application_1474521395841_0004
org.apache.hadoop.yarn.client.api.impl.YarnClientImpl -Submitted application application_1474521395841_0004
org.apache.flink.yarn.YarnClusterDescriptor- Waiting for the cluster to be allocated
org.apache.flink.yarn.YarnClusterDescriptor- Deploying cluster, current state ACCEPTED
org.apache.flink.yarn.YarnClusterDescriptor - YARN application has been deployed successfully.
Flink JobManageris now running on 192.168.1.128:17642
JobManager Web Interface: http://gpmaster:8088/proxy/application_1474521395841_0004/
org.apache.flink.yarn.YarnClusterClient- Starting client actor system.
akka.event.slf4j.Slf4jLogger- Slf4jLogger started
Remoting - Starting remoting
Remoting - Remoting started; listening on addresses :[akka.tcp://[email protected]:18282]
org.apache.flink.yarn.YarnClusterClient - Start application client.
org.apache.flink.yarn.ApplicationClient - Notification about new leader address akka.tcp://[email protected]:17642/user/jobmanagerwith session ID null.
org.apache.flink.yarn.ApplicationClient - Received address of new leader akka.tcp://[email protected]:17642/user/jobmanager with sessionID null.
org.apache.flink.yarn.ApplicationClient - Disconnect from JobManager null.
org.apache.flink.yarn.ApplicationClient - Trying to register at JobManager akka.tcp://[email protected]:17642/user/jobmanager.
org.apache.flink.yarn.ApplicationClient - Successfully registered at the ResourceManager using JobManagerActor[akka.tcp://[email protected]:17642/user/jobmanager#-1966299512]
Number of connected TaskManagers changed to 1. Slots available: 32
Number of connected TaskManagers changed to 2. Slots available: 64
Number of connected TaskManagers changed to 4. Slots available: 128
此时的Flink YARN客户端会一直运行,不会退出。如果你希望放到后台运行,那么可以使用-d或--detached参数,即:
bin/yarn-session.sh -d -n 4 -jm 1024 -tm 4096
在这种情况下,Flink YARN 客户端只会提交 Flink 到集群中然后关闭自己。注意在这种情况下,不能像上面这样停止 YARN 会话了,必须手动停止,如下面日志中提示的内容:
yarn application -kill application_1474521395841_0008
Flink YARN客户端以detached模式启动,我们也可以从这种启动方式的日志中查看到如下内容:
org.apache.flink.yarn.cli.FlinkYarnSessionCli - The Flink YARN client has been started in detached mode.In order to stop Flink on YARN, use the following command or a YARN web interface to stop it:
yarn application -kill application_1474521395841_0008
Please also note that the temporary files of the YARN session in hdfs://gpmaster:9000/user/hadoop/.flink/application_1474521395841_0008 will not be removed.
既然Flink on Yarn模式启动了,下面我们查看一下相关的进程。
在Hadoop的ResourceManager节点查看进程:
[hadoop@gpmaster~]$ jps
9062 YarnTaskManager
8872 FlinkYarnSessionCli
8985 YarnApplicationMasterRunner
9196 Jps
5325 ResourceManager
4990 NameNode
5086 DataNode
5423 NodeManager
在Hadoop的NodeManager节点查看进程:
[hadoop@gpseg~]$ jps
6208 YarnTaskManager
4336 DataNode
6327 Jps
4441 NodeManager
4. 运行Flink的example实例
上面我们已经基于Yarn启动了Flink,我们来测试一个例子:
[hadoop@gpmaster flink]$ bin/flink run ./examples/batch/WordCount.jar
返回的结果为:
(action,1)
(after,1)
(against,1)
(and,12)
(arms,1)
(arrows,1)
(awry,1)
(ay,1)
(bare,1)
(be,4)
……
使用 run 操作来提交一个任务到 YARN。客户端自己就能确定 JobManager 的地址。在遇到罕见的问题时,你可以使用 -m 参数传入 JobManager 的地址。JobManager 的地址可以在 YARN 控制台找到。
5. 在YARN上直接运行单个Flink任务
上面介绍了在 Hadoop YARN 环境中启动一个 Flink 集群。另外,也可以在 YARN 中启动只执行单个任务的 Flink。请注意该客户端需要提供 -yn 参数值(TaskManager 的数量)。
这里不需要先启动Flink服务后,再运行Flink程序。
[hadoop@gpmaster flink]$ bin/flink run -m yarn-cluster -yn2 -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar
输出结果为:
(action,1)
(after,1)
(against,1)
(and,12)
(arms,1)
(arrows,1)
(awry,1)
(ay,1)
(bare,1)
(be,4)
……
相关参数说明:
-m,--jobmanager
-yn,--yarncontainer 指分配的YARN container个数(等于TaskManagers个数)
-yjm,--yarnjobManagerMemory 指JobManager Container的内存大小,单位为MB
-ytm,--yarntaskManagerMemory 指每个TaskManagerContainer的内存大小,单位为MB
可以看到对于yarn-cluster模式来说,这些选项都带了一个 y 或 yarn (长参数选项)的前缀。
注:通过为每个任务设置不同的环境变量 FLINK_CONF_DIR,可以为每个任务使用不同的配置目录。从 Flink 分发包中复制 conf 目录,然后修改配置,例如,每个任务不同的日志设置。
6. Flink YARN会话
YARN 是一个集群资源管理框架。它允许在一个集群之上运行多种分布式应用。Flink 与其他应用程序一同运行在 YARN 之上。如果用户已经安装 YARN,就不需要安装其他东西了。
上面的操作中,我们在YARN集群中启动了一个Flink会话,此会话会启动所有需要的 Flink 服务(JobManager 和 TaskManager),因此可以提交程序到集群中。注意每个会话都可以运行多个程序。
Flink YARN会话启动时,系统会使用 conf/flink-config.yaml 中的配置。
Flink on YARN 会覆盖这些配置参数 jobmanager.rpc.address(因为JobManager 一直被分配在不同的机器上),taskmanager.tmp.dirs(我们使用 YARN 提供了的 tmp 目录)和 parallelism.default(如果指定了 slot 数目)。
如果你不想通过修改配置文件的方法来设置配置参数,你可以通过 -D 标记传入动态属性。所以你可以这样传递参数,如下:
-Dfs.overwrite-files=true-Dtaskmanager.network.numberOfBuffers=16368
一旦 Flink 在 YARN 集群中部署了,它会显示 JobManager 连接的详细信息。
要停止 YARN 会话,可以通过结束 unix 进程(使用 CTRL+C)或者通过在客户端中输入'stop'。
7. Flink on YARN的恢复机制
Flink的YARN客户端可以通过参数来控制容器出现故障情况下的行为,这些参数定义在conf/flink-conf.yaml来设置,当然也可以通过启动YARN会话时通过-D参数进行设置。
yarn.reallocate-failed:该参数控制了 Flink 是否该重新分配失败的 TaskManager容器。默认:true。
yarn.maximum-failed-containers:ApplicationMaster能接受最多的失败容器的数量,直到 YARN 会话失败。默认:初始请求的 TaskManager 个数(-n)。
yarn.application-attempts:ApplicationMaster(以及它的TaskManager 容器)的尝试次数。默认值为 1,当 ApplicationMaster 失败了,整个 YARN 会话也会失败。可以通过设置更大的值来更改 YARN 重启ApplicationMaster 的次数。
8. Flink on YARN内部实现
YARN 客户端需要访问 Hadoop 配置,从而连接 YARN 资源管理器和 HDFS。可以使用下面的策略来决定 Hadoop 配置:
当启动一个新的 Flink YARN Client会话,客户端首先会检查所请求的资源(容器和内存)是否可用。之后,它会上传包含了 Flink 配置和 jar文件到 HDFS(步骤 1)。
客户端的下一步是请求(步骤 2)一个 YARN 容器启动 ApplicationMaster (步骤 3)。因为客户端将配置和jar 文件作为容器的资源注册了,所以运行在特定机器上的 YARN 的 NodeManager 会负责准备容器(例如,下载文件)。一旦这些完成了,ApplicationMaster (AM) 就启动了。
JobManager 和 AM 运行在同一个容器中。一旦它们成功地启动了,AM 知道 JobManager 的地址(它自己)。它会为 TaskManager 生成一个新的 Flink 配置文件(这样它们才能连上 JobManager)。该文件也同样会上传到 HDFS。另外,AM 容器同时提供了 Flink 的 Web 界面服务。Flink 用来提供服务的端口是由用户 + 应用程序 id 作为偏移配置的。这使得用户能够并行执行多个 Flink YARN 会话。
之后,AM 开始为 Flink 的 TaskManager 分配容器,这会从 HDFS 下载 jar 文件和修改过的配置文件。一旦这些步骤完成了,Flink 就安装完成并准备接受任务了。