Flink基本概念(一)

Flink是一个分布式、可拓展并行计算的流式计算引擎。大数据生态中,流式计算引擎还真不少,比如Spark、Storm;他们在处理数据时各有优缺点,那么Flink在流处理中,性能是不是要优于前两者,下面针对几个方面我们来快速的入个门。主要描述Flink中的基本概念。

Job Managers、Task Managers、客户端(Clients)

下面简单说一说Flink中比较重要的三个组件,它们分别是JobManagers,TaskManagers,Client。

1AB09791-ABB6-4B9E-B8CF-5772F8D835BB.png

1.什么是JobManager?

Job Managers,是整个应用的Master。它负责调度任务,协调checkpoint,协调故障恢复等。一个Job至少会有一个Job Manager。高可用部署下会有多个JobManagers,其中一个作为leader,其余的处于standby状态。

2.什么是TaskManagers?

TaskManagers,是整个应用的Workers。它主要执行dataflow中的tasks(更准确来说应该是subtasks),并且缓存和交换数据streams。每个job至少会有一个taskmanager。

3.什么是client?

client用户端主要负责提交DataFlow 到JobManager,取消或者更新Job。客户端的代码由Java或者Scala编写。运行代码指令如 flink run xxx.jar…

4.怎么启动JobManagers和TaskManagers

JobManagers和TaskManagers有多种启动方式:直接在机器上启动(standalone cluster);在容器或资源管理框架中启动,比如Mesos、Yarn。后续我们会使用Yarn取启动JobManager

Task 和 SubTasks

分布式计算中,Flink 将算子(operator)的 subtask 链接(chain)成 task。每个 task 由一个线程执行。把算子链接成 tasks 能够减少线程间切换和缓冲的开销,在降低延迟的同时提高了整体吞吐量。链接操作的配置详情可参考:chaining docs

下图的 dataflow 由五个 subtasks 执行,因此具有五个并行线程。

A290B58A-3250-43C5-848A-4865916DEB3E.png

Task Slots和资源

1.什么是slots(槽)?

flink中一个TaskManager中至少有一个slot(槽),每个Slot代表了TasManager的一份固定资源子集。subtasks实际运行在slot内,划分资源意味着subtask之间不会竞争资源,但是也意味着它们只拥有固定的资源。这里没有CPU的隔离,只是划分任务的内存资源。

CE0C1C58-70EE-47AE-9135-7A8885527B86.png

2.substasks怎么共享slot

在代码中可以使用slotSharingGroup()函数来设置共享槽,如果不设置默认为default。

默认情况下,Flink 允许 subtasks 共享 slots,即使它们是不同 tasks 的 subtasks,只要它们来自同一个 job。因此,一个 slot 可能会负责这个 job 的整个管道(pipeline)。允许 slot sharing 有两个好处:

  • Flink 集群需要与 job 中使用的最高并行度一样多的 slots。这样不需要计算作业总共包含多少个 tasks(具有不同并行度)。

  • 更好的资源利用率。在没有 slot sharing 的情况下,简单的 subtasks(source/map())将会占用和复杂的 subtasks (window)一样多的资源。通过 slot sharing,将示例中的并行度从 2 增加到 6 可以充分利用 slot 的资源,同时确保繁重的 subtask 在 TaskManagers 之间公平地获取资源。

4B04802A-2045-468A-8085-B560661FD9C5.png

参考资料:https://ci.apache.org/projects/flink/flink-docs-release-1.9/concepts/runtime.html

后续总结

  • Flink 部署方式,重点Flink on yarn
  • 如何向yarn申请Flink运行资源(JobManager)
  • 如何提交一个简单的Flink程序