Flink on Yarn部署

环境信息:

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 指需要连接的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 配置:

  1. 测试 YARN_CONF_DIR, HADOOP_CONF_DIR 或 HADOOP_CONF_PATH 环境变量是否设置了(按该顺序测试)。如果它们中有一个被设置了,那么它们就会用来读取配置。
  2. 如果上面的策略失败了(如果正确安装了 YARN 的话,这不应该会发生),客户端会使用 HADOOP_HOME 环境变量。如果该变量设置了,客户端会尝试访问 $HADOOP_HOME/etc/hadoop (Hadoop 2) 和 $HADOOP_HOME/conf(Hadoop 1)。

当启动一个新的 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 就安装完成并准备接受任务了。

 

你可能感兴趣的:(Flink)