一. 概述
大数据生态圈大多数技术都是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