关注公众号:大数据技术派,回复“资料”,领取1000G资料。

本文首发于我的个人博客:Flink 是如何统一批流引擎的

2015 年,Flink 的作者就写了 Apache Flink: Stream and Batch Processing in a Single Engine 这篇论文。本文以这篇论文为引导,详细讲讲 Flink 内部是如何设计并实现批流一体的架构。

前言

通常我们在 Flink 中说批流一体指的是这四个方向,其中 Runtime 便是 Flink 运行时的实现。

数据交换模型

Flink 对于流作业和批作业有一个统一的执行模型。

Flink 中每个 Task 的输出会以 IntermediateResult 做封装,内部并没有对流和批两种作业做一个明确的划分,只是通过不同类型的 IntermediateResult 来表达 PIPELINED 和 BLOCKING 这两大类数据交换模型。

在了解数据交换模型之前,我们来看下为什么 Flink 对作业类型不作区分,这样的好处是什么?

如上图所示,假如我们有一个工作需要将批式作业执行结果作为流式作业的启动输入,那怎么办?这个作业是算批作业还是流作业?

很显然,以我们的常识是无法定义的,而现有的工业界的办法也是如此,将这个作业拆分为两个作业,先跑批式作业,再跑流式作业,这样当然可以,但是人工运维的成本也是足够大的:

  1. 需要一个外界存储来管理批作业的输出数据。
  2. 需要一个支持批流作业依赖的调度系统。

如果期望实现这样一个作业,那么首先执行这个作业的计算引擎的作业属性就不能对批作业和流作业进行强绑定。那么 Flink 能否实现这样的需求呢?我们先来看看数据交换的具体细节,最后再来一起看看这个作业的可行性。

我们以 PIPELINED 数据交换模型为例,看看是如何设计的:

PIPELINED 模式下,RecordWriter 将数据放入到 Buffer 中,根据 Key 的路由规则发送给对应的 Partition,Partition 将自己的数据封装到 Reader 中放入队列,让 Netty Server 从队列中读取数据,发送给下游。

我们将数据交换模式改为 BLOCKING,会发现这个设计也是同样可行的。Partition 将数据写入到文件,而 Reader 中维护着文件的句柄,上游任务结束后调度下游任务,而下游任务通过 Netty Client 的 Partition Request 唤醒对应的 Partition 和 Reader,将数据拉到下游。

调度模型

有 LAZY 和 EAGER 两种调度模型,默认情况下流作业使用 EAGER,批作业使用 LAZY。

EAGER

这个很好理解,因为流式作业是 All or Nothing 的设计,要么所有 Task 都 Run 起来,要么就不跑。

LAZY

LAZY 模式就是先调度上游,等待上游产生数据或结束后再调度下游。有些类似 Spark 中的 Stage 执行模式。

Region Scheduling

可以看到,不管是 EAGER 还是 LAZY 都没有办法执行我们刚才提出的批流混合的任务,于是社区提出了 Region Scheduling 来统一批流作业的调度,我们先看一下如何定义 Region:

以 Join 算子为例,我们都知道如果 Join 算子的两个输入都是海量数据的话,那么我们是需要等两个输入的数据都完全准备好才能进行 Join 操作的,所以 Join 两条输入的边对应的数据交换模式对应的应该是 BLOCKING 模式,我们可以根据 BLOCKING 的边将作业划分为多个子 Region,如上图虚线所示。

如果实现了 Region Scheduling 之后,我们在上面提到的批流混合的作业就可以将深色部分流式作业划为一个 Region,浅色部分批式作业再划分为多个 Region,而浅色部分是深色部分 Region 的输入,所以根据 Region Scheduling 的原则会优先调度最前面的 Region。

总结

上面提到了数据交换模型和调度模型,简单来讲其实就两句话:

1 实现了用 PIPELINED 模型去跑批式作业

用 PIPELINED 模型跑流式作业和用 BLOCKING 模型跑批式作业都是没有什么新奇的。这里提到用 PIPELINED 模式跑批作业,主要是针对实时分析的场景,以 Spark 为例,在大部分出现 Shuffle 或是聚合的场景下都会出现落盘的行为,并且调度顺序是一个一个 Stage 进行调度,极大地降低了数据处理的实时性,而使用 PIPELINED 模式会对性能有一定提升。

可能有人会问类似 Join 的算子如何使用 PIPELINED 数据交换模型实现不落盘的操作?事实上 Flink 也会落盘,只不过不是在 Join 的两个输入端落盘,而是将两个输入端的数据传输到 Join 算子上,内存撑不住时再进行落盘,海量数据下和 Spark 的行为并没有本质区别,但是在数据量中等,内存可容纳的情况下会带来很大的收益。

2 集成了一部分调度系统的功能

根据 Region 来调度作业时,Region 内部跑的具体是流作业还是批作业,Flink 自身是不关心的,更关心的 Region 之间的依赖关系,一定程度上,利用这种调度模型我们可以将过去需要拆分为多个作业的执行模式放到一个作业中来执行,比如上面提到的批流混合的作业。

Flink 是如何统一批流引擎的的更多相关文章

  1. 统一批处理流处理——Flink批流一体实现原理

    实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的MapReduce,Hive,Spark等等.这些都是处理有限数据流的经典方式.而Flink专注的是无限流处理,那么他是怎么做到 ...

  2. 阿里重磅开源全球首个批流一体机器学习平台Alink,Blink功能已全部贡献至Flink

    11月28日,Flink Forward Asia 2019 在北京国家会议中心召开,阿里在会上发布Flink 1.10版本功能前瞻,同时宣布基于Flink的机器学习算法平台Alink正式开源,这也是 ...

  3. DataPipeline CTO陈肃:构建批流一体数据融合平台的一致性语义保证

    文 | 陈肃 DataPipelineCTO 交流微信 | datapipeline2018 本文完整PPT获取 | 关注公众号后,后台回复“陈肃” 首先,本文将从数据融合角度,谈一下DataPipe ...

  4. 最佳实践:Pulsar 为批流处理提供融合存储

    非常荣幸有机会和大家分享一下 Apache Pulsar 怎样为批流处理提供融合的存储.希望今天的分享对做大数据处理的同学能有帮助和启发. 这次分享,主要分为四个部分: 介绍与其他消息系统相比, Ap ...

  5. 开源一个自己造的轮子:基于图的任务流引擎GraphScheduleEngine

    GraphScheduleEngine是什么: GraphScheduleEngine是一个基于DAG图的任务流引擎,不同语言编写.运行于不同机器上的模块.程序,均可以通过订阅GraphSchedul ...

  6. F2BPM作流引擎系列索引

    索引如下 F2工作流引擎遵循参考WFCM标准规范,符合中国国情特色,更轻量级的工作流引擎,支持多种数据库(mmsqlserver,mysql,oracle),有强大智能的组织模型接口可快速应用到任何基 ...

  7. Flink系列(0)——准备篇(流处理基础)

    Apache Flink is a framework and distributed processing engine for stateful computations over unbound ...

  8. 仅1年GitHub Star数翻倍,Flink 做了什么?

    Apache Flink 是公认的新一代开源大数据计算引擎,其流水线运行系统既可以执行批处理程序也可以执行流处理程序.目前,Flink 已成为 Apache 基金会和 GitHub 社区最为活跃的项目 ...

  9. Flink Forward Asia 2019 - 总结和展望(附PPT下载链接)

    11 月 28 - 30 日,北京迎来了入冬以来的第一场雪,2019 Flink Forward Asia(FFA)也在初雪的召唤下顺利拉开帷幕.尽管天气寒冷,FFA 实际到会人次超过 2000,同比 ...

随机推荐

  1. 1. SSTI(模板注入)漏洞(入门篇)

    好久没更新博客了,现在主要在作源码审计相关工作,在工作中也遇到了各种语言导致的一些SSTI,今天就来大概说一下SSTI模板注入这个老生常谈的漏洞 前言 模板引擎 模板引擎(这里特指用于Web开发的模板 ...

  2. 【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:

    问题: 假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示: unsigned char[16] = {0x3f, 0xa0, 0x00, 0x00, 0x ...

  3. js--Symbol 符号基本数据类型

    前言 ECMAScript 6 中新增了 Symbol 符号这一基本数据类型,那么Symbol 是用来干什么的,对开发又有什么帮助呢?本文来总结记录一下 Symbol 的相关知识点. 正文 Symbo ...

  4. 【c++ Prime 学习笔记】目录索引

    第1章 开始 第Ⅰ部分 C++基础 第2章 变量和基本类型 第3章 字符串.向量和数组 第4章 表达式 第5章 语句 第6章 函数 第7章 类 第 Ⅱ 部分 C++标准库 第8章 IO库 第9章 顺序 ...

  5. [Java]Sevlet

    0 前言 对于Java程序员而言,Web服务器(如Tomcat)是后端开发绕不过去的坎.简单来看,浏览器发送HTTP请求给服务器,服务器处理后发送HTTP响应给浏览器. Web服务器负责对请求进行处理 ...

  6. 改善深层神经网络-week1编程题(Initializaion)

    Initialization 如何选择初始化方式,不同的初始化会导致不同的结果 好的初始化方式: 加速梯度下降的收敛(Speed up the convergence of gradient desc ...

  7. 安装多个版本的 JDK

    安装多个版本的 JDK 刚刚开始学 Java 的时候安装了 JDK9 版本,后续发现还是 JDK8 使用的多些,而又不想删除原先版本 因此安装两个版本的 JDK 在需要是切换一下即可 1. 安装第一个 ...

  8. freemarker中使用String字符串作为模板

    在日常开发中,我们有时候需要发送短信.邮件等通知,但是这些通知的内容通常都是动态的,而且可能会发生变动,为了程序的灵活性,我们通常会将通知的内容配置在页面上,然后后台通过渲染这些模板,来获取具体的内容 ...

  9. 将manjaro作为主力开发系统,我遇到了哪些坑。

    首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...

  10. openmp学习心得(一)

    主要在vs2015下使用OMP,写一些自己omp的学习心得: 一.在VS2015下OpenMP的使用: 1.VS2015也仅仅支持OpenMP2.0版本,VS对OpenMP的支持并不太好. 2.在VS ...