来源
「StreamProcessingwithApacheFlink」
作者
FabianHueskeandVasilikiKalavri
翻译
吴邪大数据4年从业经验,目前就职于广州一家互联网公司,负责大数据基础平台自研、离线计算实时计算研究
校对
gongyouliu
编辑
auroral-L
全文共字,预计阅读时间60分钟。
目录
一、数据流编程简介
.数据流图(DataflowGraphs)
二、数据并行度和任务并行度
三、数据交换策略
四、并行流处理
五、延迟和吞吐量
.延迟
.吞吐量
3.延迟vs吞吐量
六、数据流算子
七、数据加载和数据输出
八、转换操作
九、滚动聚合
十、窗口操作
十一、时间语义
.一分钟在流处理中意味着什么?
.处理时间(ProcessingTime)
3.事件时间(EventTime)
4.水位线(Watermarks)
5.处理时间vs事件时间
十二、状态与一致性模型
十三、任务失败
.什么是任务失败?
.结果保证
十四、总结
学完第一章「有限状态流简介」,你应该了解了流处理引擎是如何解决传统批处理存在的瓶颈,以及如何在流处理引擎架构中运行应用程序,知晓了开源分布式流处理引擎一步步演进的历程,通过本章内容的学习,你将对流处理引擎有更深的认知。本章的目的是介绍流处理的基本概念及其框架与组件,我们希望你在阅读完本章之后,能够充分理解主流的流处理引擎的相关特性。一、数据流编程简介在我们开始介绍流处理的基本概念之前,我们先了解一下数据流编程(DataflowProgramming)的背景,这是一个非常重要的概念,会贯穿整本书。数据流图(DataflowGraphs)顾名思义,DataflowGraph描述了数据流程序算子之间的关系图,类似于spark的DAG有向无环图,数据流图通常表现为有向图,由节点(nodes)和边(edge)构成,也有人叫结点或者顶点,本质上是一个意思,节点表示逻辑算子,边则代表算子之间的依赖关系,其中,算子是数据流应用程序计算的基本单元,可以通过消费输入的数据进行一系列逻辑计算,不仅如此,还可以对计算后的数据做进一步处理。一个完整的数据流图包括数据源(source)、算子(operation)和数据接收端(sink)这几个要素,最基本的数据流图必须要包含一个数据源和一个数据接收端,图-展示是数据流程序对数据源Tweetssource做标签提取转换和计数的流程。图-描绘的DataflowGraph实际上是一个计算过程的逻辑图,清晰分解了执行过程的细节,在真正执行计算的时候,流处理引擎会将逻辑视图的操作转换为物理执行计划,包括了整个流应用程序执行的详细步骤,在实际进行分布式处理时,每个算子可能会在不同机器上运行多个并行计算任务。图-的物理执行计划对应的是图-的计算逻辑,其中“Extracthashtags”和“Count”都指定了两个并行度,每个并行任务负责计算输入流的一部分数据,最终才进行结果汇总。二、数据并行度和任务并行度在DataflowGraphs中,你可以通过不同的方式去指定程序的并行度。第一种方式是针对数据本身,你可以通过对输入数据进行分区,然后针对不同的分区执行相同的处理逻辑,这种方式称为数据并行度,提高数据并行度有很多的好处,可以有效实现数据负载均衡,将数据分散到多个计算节点上去,避免数据集中在一个节点上,有利于充分利用计算资源和降低计算节点负载。第二种方式是针对算子操作,通过指定算子的并行度,不同的算子可以对相同或者不同的数据进行计算,这种方式我们称之为任务并行度,并行度类似并发,通过提高任务并行度可以更好地利用集群资源,更加高效地获取最终结果。三、数据交换策略数据交换策略是用来体现在数据流的物理执行计划中数据是如何分发到不同的task上的,task是计算的基本单元,下面简单介绍一下几种常见的交换策略,如图-3所示。前向策略(Forward):将数据从上游的task发送到下游的task。如果恰巧两个task均在一个机器上,则可以避免网络传输,减少IO损耗。广播策略(Broadcast):数据发送到所有并行task中。广播策略涉及到数据复制以及网络传输,所以较为消耗IO资源和内存。Key-based策略:根据key做分区,使具有相同key的条目可以被同一个task处理。随机策略(Random):将数据随机均匀分布到task中,以此均衡集群计算负载。四、并行流处理在我们了解完以上关于数据流编程的基本概念之后,接下来我们来看一下这些概念是如何应用到并行数据流上的,数据可以被分为无界数据流和有界数据流。无界数据流:有始无终,有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,意思是数据被摄取后需要快递处理。我们不能等到所有数据都到达再处理,因为这种情况下输入流是无穷无尽的,在任何时候输入都不会结束。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性,无界流处理通常代表实时计算。有界数据流:有始有终,有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算,有界流的所有数据可以被排序,所以并不需要按顺序进行摄取。有界流处理通常被称为批处理。任何类型的数据都可以形成一种事件流。如信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据都可以形成数据流。在本章的内容中,你将学习到如何通过数据流编程对无界流进行并行处理。五、延迟和吞吐量在第一章的学习中,相信你已经知道了流式计算和批处理在应用场景和底层API实现上存在着很大的差别,包括对实时性和性能的要求也各不相同,我们一般