Flink On Yarn Resource Isolation

Flink On Yarn Resource Isolation

解决问题

Flink目前没有资源隔离,不同任务的task可能跑在同一个JVM进程中,无法进行资源隔离,一个应用出问题,容易导致集群全部挂掉。

Flink on Yarn

Flink提供两种Yarn的部署方式Yarn Setup

  1. 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进程中,无法实现资源隔离。
  2. 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。实现了资源隔离。

其他

  1. slots数的指定:对于standalone cluster而言,由于一台机器上只有一个TaskManager,slots数应与机器核数相同。对于single job on yarn模式和yarn cluster模式而言,一台机器上可能有多个TaskManager(取决于yarn在该机器上分配的container数),理论上应该与该Container分配的核数一致为佳。
  2. Flink命令执行后,在任务执行完之前不会返回,控制台是不能退出的。可以在命令后加-d 参数,表示detached,但此时无法再通过flink命令结束任务,需要通过yarn命令yarn application -kill < appId > 结束任务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注