Flink On Yarn Resource Isolation
解决问题
Flink目前没有资源隔离,不同任务的task可能跑在同一个JVM进程中,无法进行资源隔离,一个应用出问题,容易导致集群全部挂掉。
Flink on Yarn
Flink提供两种Yarn的部署方式 Yarn Setup :
-
Start a long-running Flink cluster on YARN
- 通过命令 yarn-session.sh 来实现,本质上是在yarn集群上启动一个flink集群。
- 由yarn预先给flink集群分配若干个container给flink使用,在yarn的界面上只能看到一个 Flink session with X TaskManagers 的任务。
- 只有一个Flink界面,可以从Yarn的ApplicationMaster链接进入。
- 使用bin/flink run命令发布任务时,本质上是使用Flink自带的调度,与普通的在Flink集群上发布任务并没有不同。 不同的任务可能在一个TaskManager中,也即是在一个JVM进程中,无法实现资源隔离。
-
Run a Flink job on YARN
- 通过命令 bin/flink run -m yarn-cluster 实现,一次只发布一个任务,本质上给每个flink任务启动了一个集群。
- yarn不事先给flink分配container,而是在任务发布时,启动JobManager(对应Yarn的AM)和TaskManager,如果一个任务指定了
n
个TaksManager(-yn n),则会启动 n+1
个Container,其中一个是JobManager。
- 发布
m
个应用,则有 m
个Flink界面,对比方式一,同样发布 m
个应用,会多出 m-1
个JobManager的。
- 发布任务时,实际上是使用了Yarn的调用。 不同的任务不可能在一个Container(JVM)中,也即是实现了资源隔离。
Example
假设已经搭建好了yarn和hdfs集群。Flink目录放在yarn集群的某台机器上,最好是ResourceManager。该机器必须配置有YARN_CONF_DIR 或HADOOP_CONF_DIR环境变量,且Flink能访问。
集群模式
- 命令:./bin/yarn-session.sh -n 10 -tm 8192 -s 8,表示启动10个TaskManager,每个内存为8G,slots数为8个的Flink集群。
- 点开Tracking UI中的ApplicationMaster,可以看到Flink的页面。
- Flink页面中能看到目前只启动了一个TaskMananger(一个JVM进程),并且有FreeSlot,新启动的Flink Job会在这些slots中启动,直到没有更多FreeSlots了才会分配新的TaskMananger。
- 运行两个命令: ./bin/flink run ./examples/streaming/SocketWindowWordCount.jar –port 12345 和 ./bin/flink run ./examples/streaming/SocketWindowWordCount.jar –port 1234 启动两个flink任务(需要预先启动nc -l 12345和nc -l 1234才能正常运行),截图如下:
- 可以看到是在同一个JVM进程中运行的, 没有资源隔离。
单个任务模式
- 命令 ./bin/flink run -m yarn-cluster -yn 2 -ys 4 ./examples/streaming/SocketWindowWordCount.jar –port 12345 和 ./bin/flink run -m yarn-cluster -yn 2 -ys 2 ./examples/streaming/SocketWindowWordCount.jar –port 1234 分别表示以yarn-cluster模式,启动了两个flink任务,第一个使用了2个container,每个container 4个slots,第二个使用了2个container,每个container 2个slots
- Yarn中能看到两个任务,分别有两个ApplicationMaster,对应Flink的JobMananger。
- 可以看到两个Flink集群中,均没有Free Slots,所有的资源仅提供给当前任务运行。使用jps查看进程也能看到集群上共有2个ApplicationMaster和4个TaskMananger。 实现了资源隔离。
其他
- slots数的指定:对于standalone cluster而言,由于一台机器上只有一个TaskManager,slots数应与机器核数相同。对于single job on yarn模式和yarn cluster模式而言,一台机器上可能有多个TaskManager(取决于yarn在该机器上分配的container数),理论上应该与该Container分配的核数一致为佳。
- Flink命令执行后,在任务执行完之前不会返回,控制台是不能退出的。可以在命令后加-d 参数,表示
detached
,但此时无法再通过flink命令结束任务,需要通过yarn命令 yarn application -kill < appId > 结束任务。
原文
http://www.nilday.com/flink-on-yarn-resource-isolation/