前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flink 内部原理之分布式运行环境

Flink 内部原理之分布式运行环境

作者头像
smartsi
发布2019-08-07 11:47:33
1.5K0
发布2019-08-07 11:47:33
举报
文章被收录于专栏:SmartSiSmartSi

1. 任务链与算子链

在分布式运行中,Flink将算子(operator) SubTask 连接成 Task。每个 Task 都只由一个线程执行。将算子链接到 Task 是一个很有用处的优化:它降低了线程间切换和缓冲的开销,并增加了整体吞吐量,同时降低了延迟。链接行为可以在API中配置。

下图中的示例数据流由五个子任务执行,因此具有五个并行线程。

2. 作业管理器, 任务管理器, 客户端

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

(1) 作业管理器JobManagers(也称为masters)协调分布式运行。主要功能是调度任务,协调检查点,协调故障恢复等。

至少有一个JobManager。高可用配置下将有多个JobManagers,其中一个始终是领导者,其他都是备份。

(2) 任务管理器TaskManagers(也称为workers)执行数据流中的任务(更具体地说是子任务),并对数据流进行缓冲和交换。

JobManager一样,也是至少有一个TaskManager

JobManagersTaskManagers可以以不同方式启动:直接在机器上,在容器中,或者由像YARN这样的资源框架来管理。TaskManagersJobManagers进行连接,来报告自己可用,并分配工作。

客户端不是运行时和程序执行的一部分,而是用来准备数据流并将其发送到JobManager。之后,客户端可以断开连接或保持连接来接收进度报告。客户端作为触发执行的Java/Scala程序的一部分运行,或者在命令行中运行./bin/flink命令来运行….

3. 任务槽与资源

每个worker(TaskManager)都是一个JVM进程,可以在不同的线程中执行一个或多个子任务(译者注:一个任务有一个线程执行)。worker使用任务槽(至少一个)来控制worker能接受多少任务。

每个任务槽代表TaskManager的一个固定资源子集。例如,一个拥有三个任务槽的TaskManager将为每个任务槽分配1/3的内存。资源任务槽化意味着子任务不会与其他作业中的子任务争夺内存,而是任务具有一定数量的保留托管内存。请注意,这里不会对CPU进行隔离。目前任务槽只分离任务的托管内存。

通过调整任务槽的数量,用户可以定义子任务与其他子任务进行隔离。如果每个TaskManager只拥有一个任务槽意味着每个任务组都会在独立的JVM中运行(例如,可以在单独的容器中启动)。如果拥有多个任务槽意味着多个子任务共享同一个JVM。同一JVM中的任务共享TCP连接(通过多路复用)和心跳消息,他们也可以共享数据集和数据结构,从而降低单个任务的开销。

默认情况下,Flink允许子任务共享任务槽,即使它们是不同任务的子任务,只要它们来自同一个作业。结果是一个任务槽可能会是一个完整的作业管道。允许任务槽共享有两个主要好处:

(1) Flink集群所需的任务槽数与作业中使用的最高并行度数保持一致。不需要计算一个程序总共包含多少个任务(不同任务具有不同的并行度)。

(2) 提高资源利用率。如果没有使用任务槽共享机制,那么非密集的sour/map()子任务就会与资源密集型window子任务阻塞一样多的资源。在我们的示例中,通过任务槽共享,将基本并行度从两个增加到六个,可以充分利用已分配的资源,同时确保繁重的子任务在TaskManager之间公平分配。

这些API还包括一个资源组机制,可以避免不合理的任务槽共享。

根据经验来说,默认任务槽数应该设置为CPU核的数量。如果使用超线程技术,每个任务槽需要2个或更多的硬件线程上下文(With hyper-threading, each slot then takes 2 or more hardware thread contexts)。

4. 后端状态

键/值索引存储的确切数据结构取决于所选的后端状态。一个后端状态将数据存储在内存中hash map中,另一个后端状态使用RocksDB存储键/值。除了定义保存状态的数据结构之外,后端状态还实现了获取键/值状态的时间点快照逻辑并将该快照存储为检查点的一部分。

5. 保存点

Data Stream API编写的程序可以从保存点恢复执行。保存点允许更新你的程序和你的Flink集群,而不会丢失任何状态。

保存点是手动触发的检查点,它会捕获程序的快照并将其写入后端状态。他们依赖于常规检查点机制。在执行期间的程序定期在工作节点上生成快照并生成检查点。为了恢复,只需要最后完成的检查点,一旦新的检查点完成,可以安全地丢弃较旧的检查点。

保存点与这些定期检查点类似,只不过它们是由用户触发的,不会在新检查点完成时自动失效。

原文:https://ci.apache.org/projects/flink/flink-docs-release-1.4/concepts/runtime.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 任务链与算子链
  • 2. 作业管理器, 任务管理器, 客户端
  • 3. 任务槽与资源
  • 4. 后端状态
  • 5. 保存点
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档