一. 概述
大数据生态圈大多数技术都是master-slave架构,Spark、Storm、Flink无一例外都是这种架构,Spark是目前批计算的主流,Flink目前逐渐取代Storm成为了流式计算的主流,Storm逐渐被市场淘汰,但是不得不说Storm也是一个非常优秀的流式计算框架,其实时性非常好。
在分布式计算框架中,角色即进程,任务通常是以线程的形式跑在计算层的JVM进程中,但是每个框架中是有差异的,以下针对Spark/Storm/Flink三大主流计算框架进行对比。

二.横向对比
在生产中,Spark、Flink一般是跑在yarn上,但是两者官方都提供了standalone模式的集群;而Storm一般是跑在Storm集群上。他们的角色在名称上存在相同的情况,但是含义往往有差异,如果我们不能正确理解它们的差异,在作业调优时可能会影响我们的决策。

1.资源层

框架

master角色

slave角色

Spark

Master

Worker

Storm

Nimbus

Supervisor

Flink

JobManager

TaskManager

2.计算层

框架

资源管理任务调度

干活的进程

最小的计算单元

数据流图

算子链优化

阶段

并行度

Spark

Driver

Executor 启动几个Executor在spark-submit中通过参数指定,它们最终会比较均匀的分散在集群的Worker中

task线程 task是以线程的形式跑在executor中线程池中

DAG

pipline

stage 根据shuffle切分,stage的边界一定是shuffle

每个stage最后一个RDD的分区数,stage的并行度=该stage划分出task的个数

Storm

Nimbus

slot(worker) 每个Supervisor上几个slot进程在storm.yaml中配置

executor线程 task是任务的形式跑在executor线程中,默认一个executor线程中一个task,可以配置,示例如下:builder.setBolt(“store-data”, new storeMysql(), 4).setNumTasks(8) 该并行度为4,表示4个executor线程,8个task,每个线程中跑2个task,注意:计算executor数量要把ack的线程数算进去,默认一个woker一个ack

Topology


Spout/Bolt 没有stage的概念,可以把Spout/Bolt理解为独立的计算阶段

Spout/Bolt组件上设置,并行度表示executor线程的数量

Flink

JobManager

task slot每个TaskManager上几个task slot,人为指定

subtask->subtask是以线程的形式跑在slot进程中

Dataflow

operater chain

Task

4种设置方式:算子级别>执行环境级别>客户端级别>配置文件级别。各个算子的并行度会影响算子链的划分,以及task中subtask的个数

Flink on yarn:Jobmanager、TaskManagers其实都是container进程;

Spark on yarn:Diver、Executors其实都是container进程。

3.shuffle

shuffle的语意,对于spark批计算来说,数据的加工逻辑是相同的key为一组进行操作。意味着上游一个分区中的每个key必须按照分区器计算出一个分区号,相同的key必定去到下游同一个分区,最终是相同的key为一组做某种操作,如reduceByKey、groupByKey;在spark中,shufflemanager是一个非常复杂的系统,有shuffle read和shuffle write,对于批计算,shuffle会产生数据倾斜,但对于flink、storm流式计算是有区别的。在流式计算中,确切的说,不应该叫shuffle,应该叫数据的分发策略(上游task中的数如何分发给下游task的)

storm中数据的分发策略:
①shuffle grouping 随机分发;
②fields grouping 按字段分发,类似于spark中的按 hashPartitioner的shuffle,类似于flink中的keyBy;
③all grouping 广播发送,类似于flink中的broadcast,上游一个分区中的数据会去到下游每一个分区中。spark中的broadcast与此有区别!
④global grouping 全局分组,类似于flink中的global;
除此之外还有其他几种,但是不常用,此处省略。

flink中数据的分发策略:
shuffle 、rebalance、rescale、global、forward、keyBy、broadcast