23日上午,数据学院徐辰副教授为我们带来了题为《浅析分布式批处理流计算系统》的报告,对分布式批处理流计算系统的架构和运行原理进行了详细介绍。
报告伊始,徐老师给我们介绍了分布式批处理流计算的一些基本概念以及批处理和流计算的区别:批处理是针对非实时性的需求,处理的数据一般是静态,有限的,而流计算是针对实时应用,其处理的是无限的,动态的数据。批处理系统和流计算系统的发展历程包括以下几个阶段。
批处理系统的发展包括两个阶段:
(1)基于MapReduce框架,例如Hadoop,HaLoop。
(2)支持DAG计算框架,例如Spark,Dryad,Stratosphere。
流处理系统的发展包括:
(1)基于MapReduce框架修改,例如Hadoop Online,MapUpdate。
(2)基于流水线处理模式,例如S4,Stream Cloud,Storm。
(3)基于微批处理模式,例如Spark Streaming。
(4)批处理和流处理融合的系统,比如Google DataFlow 和Flink。
在接下来的报告中,徐老师从五个部分来介绍分布式批处理流计算系统。
第一部分是系统架构,以MapReduce,Spark,Flink为例。MapReduce包括Client,Master Node,Slave Node等角色,Client把Job发送到Master Node节点,由Master Node节点将任务分发到Slave Node节点去执行。Spark主要由Driver Program,Master Node,Worker Node等部分构成。任务从Driver Program发送到Master Node,再由Master Node将任务分发到不同的Worker Node中去执行。每个worker Node节点内部又分为多个task线程。Flink主要由Flink Program,JobManager,TaskManager等部分组成。job从Flink Program发送到JobManager,由JobManager分发到TaskManager,每个TaskManager有若干Task Slot来具体执行Task。图一显示了这三个系统的联系和区别。
图一.三种系统的联系和区别
第二部分徐老师介绍了批处理流计算的编程模型。系统在处理过程中会遇到不同的数据格式,例如文件,RDD(弹性分布式数据集),DataSet,DataStream。以及数据的一些转换操作,例如Map,Reduce,Join。为此,Flink API设计图如下:
图二.Flink API层次
最下层为Stateful Stream Processing,主要记录处理的状态和时间。第三层为DataStream/DataSet API,主要包括DataSource,DataStreamTransformation,DataSink三部分,涉及对数据的一些具体操作,例如数据的读取,各种数据的转换和数据的存储等。再往上是Table API。Table API 与 DataSet和DataStream API 结合紧密,DataSet 和 DataStream都可以很容易地转换成 Table,同样转换回来也很方便。将Table API提升到一个新的层级,扩展Table API中流处理的能力以及支持SQL,于是就出现了SQL API。
第三部分是查询执行。Flink的执行可以分为以下层次:StreamGraph/DAG将用户程序简单的翻译成一张图,描述程序的拓扑结构,JobGraph将可以本地同时执行的task合并起来,ExecutionGraph将JobGraph根据并行度生成分布式的执行图。从数据库的角度去看批处理流计算系统的物理执行,Storm,Spark,Flink刚好对应数据库中的tuple-at-a-time,table-at-a-time,vector-at-a-time。
图三. 从数据库角度看物理执行
第四部分和第五部分主要包括流系统中查询优化和数据容错机制。MapReduce,Spark和Flink中对SQL做出了各自的优化,它们的迭代计算优化如图四所示。此外,流处理系统Flink在算子层面和迭代层面设计了批处理容错机制。
图四.Hadoop,Spark,Flink的迭代计算
最后,徐老师和大家一起就以下问题进行了积极探讨:
1. DataFlow System和DataFlow model该如何理解?
2. MapReduce任务调度以进程为单位,Spark和Flink以线程为单位,哪种方式比较好?
3. 在流计算和批处理融合中,是否只有Flink这一条路?
4. DataFlow和DataStream中文都可以翻译为数据流,那么这是同一个概念吗?
撰稿:张小磊
排版:王冬慧