赞
踩
Flink运行时由两种类型的进程组成:
JobManager和TaskManager有多种启动方式:可以直接作为standalone集群启动,也可以通过YARN或Mesos之类的资源管理框架启动。TaskManager连接到JobManager,通知JobManager宣布自己可用,并请求分配task。
JobManager有许多协调Flink应用程序分布式执行的职责:它决定了何时调度下一个task或者task集合,对完成的task或执行失败的task做处理,协调checkpoints,以及失败时进行恢复等等。JobManager进行有以下3中组件组成:
Flink集群中至少有一个JobManager。对于高可用集群,必须由多个JobManager,其中一个是主节点,其他的是备节点。
TaskManager(也称为worker)用来执行任务流、缓存并交换数据流。
集群中必须至少有一个TaskManager。TaskManager中最小的资源调度单位是task slot。一个TaskManager中的task slot的数量代表着TaskManager处理task的并发数。注意多个operator是可以在同一个task中执行的。
对于分布式执行,Flink将operator子任务串起来形成tasks。每个task由一个线程来执行。将operators串成tasks是一种非常有用的优化:它减少了线程间切换和缓冲的开销,并在降低延时的同时增加了总体的吞吐量。这种链式的行为是可以进行配置的,详细参考chaining docs。
下图中的dataflow由5个subtask执行,因此使用5个线程并行执行。
每一个TaskManager对应着一个JVM进程,可以在单独的线程中执行一个或多个subtask。task alot是为了控制一个TaskManager可以接受多少个task,并且至少需要一个task slot。
每个task slot代表TaskManager资源的一个固定子集。一个拥有3个slot的TaskManager, 将会分配她1/3的内存给每个slot。这样对资源的划分意味着一个job中的subtask不会与其他job中的subtask进行内存上的资源竞争,而是会有一定量的预留内存。注意,目前slot只对内存进行了隔离,CPU是没有隔离的。
用户可以通过调节task slot的数量,来决定subtask之间如何进行隔离。一个TaskManager只有一个slot就意味着每个task组运行在一个单独的JVM进程中。如果一个TaskManager有多个slot,就意味着subtasks共享同一个JVM。同一个JVM中的tasks会共享TCP连接(通过多路复用)和心跳信息。它们还可以共享数据集和数据结构,从而减少每个task的开销。
默认情况下,Flink允许subtask共享slot,甚至这些subtask属于不同的task,只要这些task来同一个Job。结果就是,一个slot可能会容纳整个job的pipeline。允许slot共享有两个主要好处:
Flink应用程序是从其main()方法生成一个或多个Flink Job的用户程序。这些Job可以在本地JVM(LocalEnvironment)中执行,也可以在远程具有多台机器的集群中执行。对于每个程序,ExecutionEnvironment提供了控制作业执行(例如,设置并行度)和外部交互的方法。
Flink应用程序中的job可以被提交到一个长时间运行的Flink Session集群上、一个专用的Flink Job集群上,或者一个Flink Application集群上。不同集群的的区别主要在于集群的生命周期和资源隔离保证。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。