热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flink是如何统一批流引擎的

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

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

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

前言
unify-blocks

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

数据交换模型

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

unify-exec

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

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

unify-example

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

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

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

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

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

unify-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:

unify-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 之间的依赖关系,一定程度上,利用这种调度模型我们可以将过去需要拆分为多个作业的执行模式放到一个作业中来执行,比如上面提到的批流混合的作业。

猜你喜欢
Spark SQL知识点与实战
Hive计算最大连续登陆天数
Hadoop 数据迁移用法详解
Hbase修复工具Hbck
数仓建模分层理论
大数据组件重点学习这几个



推荐阅读
  • 两种方式实现Flink异步IO查询Mysql
    如官网所描述的Flink支持两种方式实现异步IO查询外部系统http ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 在OpenShift上部署基于MongoDB和Node.js的多层应用程序
    本文档详细介绍了如何在OpenShift 4.x环境中部署一个包含MongoDB数据库和Node.js后端及前端的多层应用程序。通过逐步指导,读者可以轻松完成整个部署过程。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
author-avatar
wugege12
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有