开源系统及编程模型
基于流计算的基本模型,当前已有各式各样的分布式流处理系统被开发出来。本节将对当前开源分布式流处理系统中三个最典型的代表性的系统:Apache Storm,Spark Streaming,Apache Flink以及它们的编程模型进行详细介绍。
Apache Storm
Apache Storm是由Twitter公司开源的一个实时分布式流处理系统[2],被广泛应用在实时分析、在线机器学习连续计算、分布式RPC、ETL等场景。Storm支持水平扩展、具有高容错性,保证数据能被处理,而且处理速度很快。Storm支持多种编程语言,易于部署和管理,是目前广泛使用的流处理系统之一。
一、Storm中的数据封装
Storm系统可以从分布式文件系统(如HDFS)或分布式消息队列(如Kafka)中获取源数据,并将每个流数据元组封装称为tuple。一条数据流即是一个无边界的tuple序列,而这些tuple序列可以以分布式的方式创建和处理。在Storm中,数据流中的每个tuple相互独立,彼此间的处理上不存在任何关联。Tuple也是Storm中消息传递的基本单元,其数据结构如图5-3-1所示。
如图5-3-1所 示, 一 个tuple可以包含多个字段(field),每个字段代表对应流数据的一个属性,在Storm的每个操作组件发送向下游发送tuple时,会声明对应tuple每个字段的顺序和代表的含义(如数据的键、值、时间戳等)。
二、Storm中的应用拓扑建立
在Storm中, 用 户 所 提 交 的 应 用 所 构 建 的DAG拓扑被称为Topology。Storm的Topology类似于MapReduce中的一个job,但区别在于这个拓扑会永远运行(或者直到手动结束)。每个Topology中有两个重要组件:spout和bolt。
spout是Topology中数据流的来源,也即对应DAG模型中的起始操作。spout可以从外部源读取数据并将其以封装成tuple的形式发送到图 5-3-1 tuple的数据结构Topology中。bolt是Topology中对tuple进行处理的主要单元。Storm并不区分中间和终止操作,而是将其统一为bolt来进行实现,也即对结果的输出需要由用户自己来实现。所有对流数据的处理都是在bolt中实现,bolt可以执行各种基础操作,如过滤、聚合、连接等。bolt每处理完一个tuple后,可以按照应用需求发送给0个或多个tuple给下游的bolt。
三、Storm中的并行度指定
Storm中的并行度有三层含义。首先是worker进程数。Storm可以建立在分布式集群上,每台物理节点可以发起一个或多个worker进程。
一个worker对应一个物理的JVM(Java虚拟机)。通常,整个Topology会由一个或者多个worker进程来负责执行。每个worker会在一个JVM中运行一个或多个executor,每个executor对应一个线程,执行某一个spout或者bolt的计算任务。在Storm中,每个spout/bolt都可以实例化生成多个task在集群中运行,一般默认情况下,executor数与task数一一对应,也即每个实例都由一个单独的线程来执行。用户也可以指定task数大于executor数,这时部分task会由同一个线程循环调用来执行。在Storm的Topology建立时,用户可以根据需要依次来设定整体的worker进程数以及每个spout/bolt对应的executor数和task数。
四、Storm中的数据分组和传输
用户可以通过定义分组策略(streaming grouping)来决定数据流如何在不同的spout/bolt的task中进行分发和传输。分组策略将所有的spout和bolt连接起来构成一个Topology,如图5-3-2所示。除了5.2.4节所介绍的几种基本分组策略外,Storm还支持其他的分组策略。例如local grouping,这是shuffle grouping的 一 种 变 种 分 组 策 略。由于Storm划分多个worker进程,如果你对大数据开发感兴趣,想系统学习大数据的话,可以加入大数据技术学习交流扣群:458数字345数字782获取学习资源,shuffle grouping可能导致大量的进程间通信,local grouping则是将元组优先发往与自己同进程的下游task中,若没有这种下游task,才继续沿用shuffle grouping的方式。
图 5-3-2 streaming grouping