Flink概念:分布式运行环境

Posted 合格的程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink概念:分布式运行环境相关的知识,希望对你有一定的参考价值。

任务和操作符链


对于分布式执行而言,Flink将多个子任务连接 到一起组成任务。每一个任务由一个线程来执行。把操作符连接到一起组成任务是有效的优化:这减少了线程之间切换和缓存的开销,并且在降低延时的同时提升了总体的吞吐量。可以配置连接行为,参考连接文档(https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/stream/operators/#task-chaining-and-resource-groups)查看详情。


在下图中的示例数据流是通过五个子任务执行的,因此使用5个并发线程执行。



Job Managers,Task Managers,Clients


Flink的运行时由两种类型进程组成:


  • JobManagers(也被称作masters)协调分布式执行。他们调度任务、协调检查点以及协调故障恢复等等。


应该至少有一个Job Manager,然而高可用配置则有多个JobManagers,他们中的一个是leader,其他的是备用的(standby)


  • TaskMasters(也被称作workers)执行数据流的任务(或者更具体地说,是子任务),并且缓存和交换数据流


JobManagers和TaskManagers可以以各种各样的方式启动:直接在那台机器上启动作为standalone cluster,在容器或者被像YARN或Mesos之类的资源管理框架中。TaskManager 与JobManager建立连接并且宣布自己是可用的,然后被分配工作。


client 并不是运行时和程序执行的一部分,但是被用于准备和发送数据流到JobManager。然后,client可以断开连接或者保持连接来接收执行报告。client能够作为Java/Scala程序触发执行的部分来执行,也可以在命令行中执行 ./bin/flink run ... 。


Flink概念:分布式运行环境



任务槽和资源(Task Slots and Resources)


每个worker(TaskManager)是一个JVM进程,可能会在不同的线程中执行一个或多个子任务。为了控制一个进程可以接受多少任务,worker中有至少一个被称为task slot的东东。


每个task slot代表TaskManager的资源的固定的子集。譬如,一个TaskManager中有三个slot,那么他会提供1/3它管理的内存给每一个slot。对资源进行分槽意味着该子任务将不会与其他job的子任务竞争管理的内存,相反,它有一定数量的保留托管内存。注意:没有CPU隔离;当前的slot仅仅拆分管理的任务内存。


通过调整任务slot的数量,用户可以定义子任务是如何相互隔离的。TaskManager只有一个slot的意味着每个任务组运行在单独的JVM中(比如:它可以在单独的容器中启动)。拥有多个slot意味着更多子任务共享同一个JVM。在同一JVM中的任务共享TCP链接(通过多路复用multiplexing)以及心跳信息。他们也共享数据集以及数据结构,通过这样降低每个任务的负载。


Flink概念:分布式运行环境


默认情况下,Flink允许子任务共享slot,即使他们是不同任务的子任务,只要他们是来自同一job就可以。这产生的结果是一个slot可能持有该job的所有管道(pipline)。允许slot sharing有两个好处:


  • Flink集群需要与Job中最高的并行度一样多的slot。不需要计算一个程序中总共包含多少个任务(当具有不同并行度的情况下)。

  • 更容易获得更好地资源使用。假如没有共享的话,非密集型的source/map()子任务将会阻塞资源密集型窗口窗口子任务的资源。在slot共享的情况下,把我们例子中的并行度从2增加到6有利于充分利用已经分配的资源,同时确保比较重的任务在任务调度中得到公平的分配。


Flink概念:分布式运行环境

                        

API中也包含resource group机制,它可以用来避免不良的slot共享。

经验法则:好的task slot的默认数量是CPU的核数。在超线程技术之下,每个slot需要2个或者更多硬件线程上下文。



后端状态(State Backends)


key/values索引所存在的确切的数据结构的存储是取决于选择的state backend(https://ci.apache.org/projects/flink/flink-docs-release-1.5/ops/state/state_backends.html)。其中一种后端状态在内存的hash-map中存储数据,另一种后端状态使用RocksDB作为key/value的存储。除了定义保存状态的数据结构之外,后端状态也实现了key/value状态在某个点的快照,并且存储快照作为检查点的一部分。



保存点(Savepoints)


使用DataStream API编写的程序可以从保存点恢复执行。保存点允许在不丢失任何状态的情况下升级程序和Flink集群。


保存点是手动触发的检查点,它获取程序的快照并且把它写到state backend中。对这件事情而言,它是依赖常规的检查点机制。在执行期间,程序周期性地在工作节点上产生快照并且生成检查点。对于恢复来说,仅仅需要最后完成的检查点,旧的检查点可以在新的检查点完成后安全地丢弃。


除了它们是手动触发的,并且在更新的检查点完成的时候不能自动过期之外,保存点与这些周期性的检查点是类似的。保存点可以通过命令行或者当通过REST API 取消一个job的时候创建。


相关阅读:



以上是关于Flink概念:分布式运行环境的主要内容,如果未能解决你的问题,请参考以下文章

1.flink简介与重要概念

FlinkWhat is Apache Flink?

Flink的安装和部署--伪分布模式

Flink安装部署

Flink的安装和部署--伪分布模式

Flink学习笔记:搭建Flink on Yarn环境并运行Flink应用