目录
3.
2.
摘要 .................................................................................................................................................... 3
1. Kafka ...........................................................................................................................................3
1.1 背景介绍 ............................................................................................................................. 3
1.1.1 创建背景................................................................................................................... 3
1.1.2 设计目标................................................................................................................... 3
1.2 kafka 架构 ............................................................................................................................ 4
1.2.1 拓扑结构 .................................................................................................................. 4
1.2.2 消息分发模式 ..........................................................................................................4
1.2.3 consumer 的 pull 模式 .............................................................................................. 5
1.2.4 kafka 提供的三种 delivery guarantee...................................................................... 5
1.3 kafka 性能测试 ................................................................................................................... 5
1.3.1 kafka 性能测试脚本 .................................................................................................5
1.3.2 Metrics 报告工具 ......................................................................................................6
1.4 benchmark 报告 .................................................................................................................. 6
1.4.1 Producer Only............................................................................................................7
1.4.2 Producer & Consumer .............................................................................................10
Flink..........................................................................................................................................10
2.1 基本架构 ........................................................................................................................... 10
2.2 基于 Yarn 层面的架构 ......................................................................................................12
2.3 组件栈............................................................................................................................... 12
2.4 基本概念 ........................................................................................................................... 13
2.5 基本特性 ........................................................................................................................... 18
Storm .........................................................................................................................................18
3.1 概述 .................................................................................................................................... 18
3.1.1 核心概念 ................................................................................................................18
3.1.2 核心技术和组件....................................................................................................19
3.2 storm 集群架构 ..................................................................................................................20
3.2.1 集群架构 ................................................................................................................20
3.2.2 工作流程 ................................................................................................................21
3.2.3 容错机制 ................................................................................................................22
3.3 storm 特性分析 .................................................................................................................23
4. Apex..........................................................................................................................................23
4.1 概述 ................................................................................................................................... 23
4.1.1 概念介绍 ................................................................................................................24
4.1.2 架构 ...................................................................................................................... 24
4.1.3 工作流程 ..............................................................................................................26
4.1.4 流计算模型 ..........................................................................................................27
4.1.5 流应用程序管理(STRAM)....................................................................................27
4.2 Apex 特性 ...........................................................................................................................28
4.2.1 简单专业 ................................................................................................................28
4.2.2 代码重用 ................................................................................................................28
1
5.
4.2.3 可运行性 ................................................................................................................28
4.2.4 集成与易用性 ........................................................................................................29
4.2.5 原生支持 hadoop................................................................................................... 29
4.2.6 算字库 Malhar....................................................................................................... 29
4.3 Apex 的测试结果 ...............................................................................................................29
Spark Streaming....................................................................................................................... 31
5.1 基本架构 ........................................................................................................................... 31
5.2 基于 Yarn 层面的架构分析............................................................................................. 33
5.3 计算流程 ........................................................................................................................... 33
5.4 组件栈............................................................................................................................... 34
5.5 基本特性 ........................................................................................................................... 34
5.6 性能调优 ........................................................................................................................... 36
5.6.1 优化运行时间 ........................................................................................................36
5.6.2 优化内存使用 ........................................................................................................36
6.流式大数据系统对比分析 ...........................................................................................................36
6.1 HiBench 介绍 .....................................................................................................................36
6.2 性能指标 ........................................................................................................................... 37
6.3 测试环境 ........................................................................................................................... 37
6.4 测试方法 ........................................................................................................................... 37
6.4.1 测试流程 ..............................................................................................................37
6.4.2 测试用例 ..............................................................................................................38
6.5 测试结果 ........................................................................................................................... 39
6.5.1 Identity 吞吐量.................................................................................................39
6.5.2 Identity 作业延迟 .............................................................................................40
6.5.3 不同 kafka 数据生成速率下 flink 平均延迟 ................................................. 42
6.5.4 wordcount 吞吐量...............................................................................................43
6.5.5 wordcount 作业延迟 ...........................................................................................44
2
摘要
本文主要调研了 Apache Kafka、Apache Flink、Apache Storm、Apache Apex 和 Apache
Spark Streaming 五种流式大数据系统。主要的工作有:1)通过文献阅读和试用比较了它们
的实现原理;2)利用了 kafka 自带的测试脚本进行了 kafka 性能测试;3)通过 Hibench 进
行了 Flink、Storm 和 Spark Streaming 的比较测试;4)进行了 Apex 的简单测试;5)对以上
流式大数据系统进行了总结分析。
1. Kafka
1.1 背景介绍
1.1.1 创建背景
Kafka 是一个消息系统,原本用作 LinkedIn 的活动流(Activity Stream)和运营数据处
理管道(Pipeline)的基础。现在它已被多家不同类型的公司 作为多种类型的数据管道和消
息系统使用。
kafka 是有缓冲能力、具有订阅分发能力、实时性好且吞吐量高的消息系统,利用 kafka
能在 PC Server 上搭建起大规模的消息系统。
1.1.2 设计目标
1)以时间复杂度为 O(1)的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数
时间复杂度的访问性能
2)高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传
输
3)支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序
传输
4)同时支持离线数据处理和实时数据处理
5)Scale out:支持在线水平扩展
3
1.2 kafka 架构
1.2.1 拓扑结构
Broker:Kafka 集群包含一个或多个服务器,这种服务器被称为 broker
Topic:每条发布到 Kafka 集群的消息都有一个类别,这个类别被称为 Topic。(物理上不同
Topic 的消息分开存储,逻辑上一个 Topic 的消息虽然保存于一个或多个 broker 上但用户只
需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处)
Partition:Parition 是物理上的概念,每个 Topic 包含一个或多个 Partition
Producer:负责发布消息到 Kafka broker
Consumer:消息消费者,向 Kafka broker 读取消息的客户端。
Consumer Group:每个 Consumer 属于一个特定的 Consumer Group。Kafka 保证每条消息在
同一个 Consumer Group 里只会被某一个 Consumer 消费
Produce1
Produce2
Produce3
(push)
(pull)
brokers
zookeeper
Consumer group1
Consumer group2
Consumer group3
Kafka 通过 Zookeeper 管理集群配置,选举 leader,以及在 Consumer Group 发生变化时进行
rebalance。Producer 使用 push 模式将消息发布到 broker,Consumer 使用 pull 模式从 broker
订阅并消费消息。
1.2.2 消息分发模式
这是 Kafka 用来实现一个 Topic 消息的广播(发给所有的 Consumer)和单播(发给某
一个 Consumer)的手段。一个 Topic 可以对应多个 Consumer Group。如果需要实现广播,
只要每个 Consumer 有一个独立的 Group 就可以了。要实现单播只要所有的 Consumer 在同
一个 Group 里。用 Consumer Group 还可以将 Consumer 进行自由的分组而不需要多次发送
消息到不同的 Topic。
4
1.2.3 consumer 的 pull 模式
作为一个消息系统,Kafka 遵循了传统的方式,选择由 Producer 向 broker push 消息并由
Consumer 从 broker pull 消息。push 模式很难适应消费速率不同的消费者,因为消息发送速
率是由 broker 决定的。push 模式的目标是尽可能以最快速度传递消息,但是这样很容易造
成 Consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以
根据 Consumer 的消费能力以适当的速率消费消息。
对于 Kafka 而言,pull 模式更合适。pull 模式可简化 broker 的设计,Consumer 可自主控
制消费消息的速率,同时 Consumer 可以自己控制消费方式——即可批量消费也可逐条消费,
同时还能选择不同的提交方式从而实现不同的传输语义。
1.2.4 kafka 提供的三种 delivery guarantee
At most once :消息可能会丢,但绝不会重复传输
At least one :消息绝不会丢,但可能会重复传输
Exactly once :每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的。
读完消息先 commit 再处理消息。这种模式下,如果 Consumer 在 commit 后还没来得及
处理消息就 crash 了,下次重新开始工作后就无法读到刚刚已提交而未处理的消息,这就对
应于 At most once
读完消息先处理再 commit。这种模式下,如果在处理完消息之后 commit 之前 Consumer
crash 了,下次重新开始工作时还会处理刚刚未 commit 的消息,实际上该消息已经被处理过
了。这就对应于 At least once。在很多使用场景下,消息都有一个主键,所以消息的处理往
往具有幂等性,即多次处理这一条消息跟只处理一次是等效的,那就可以认为是 Exactly
once。
如果一定要做到 Exactly once,就需要协调 offset 和实际操作的输出。经典的做法是引
入两阶段提交。如果能让 offset 和操作输入存在同一个地方,会更简洁和通用。这种方式可
能更好,因为许多输出系统可能不支持两阶段提交。比如,Consumer 拿到数据后可能把数
据放到 HDFS,如果把最新的 offset 和数据本身一起写到 HDFS,那就可以保证数据的输出
和 offset 的更新要么都完成,要么都不完成,间接实现 Exactly once。(目前就 high level API
而言,offset 是存于 Zookeeper 中的,无法存于 HDFS,而 low level API 的 offset 是由自己去
维护的,可以将之存于 HDFS 中)
Kafka 默认保证 At least once,并且允许通过设置 Producer 异步提交来实现 At most once。
而 Exactly once 要求与外部存储系统协作,幸运的是 Kafka 提供的 offset 可以非常直接非常
容易得使用这种方式。
1.3 kafka 性能测试
1.3.1 kafka 性能测试脚本
5
$KAFKA_HOME/bin/kafka-producer-perf-test.sh 该脚本被设计用于测试 Kafka Producer 的
性能,主要输出 4 项指标,总共发送消息量(以 MB 为单位),每秒发送消息量(MB/second),
发送消息总数,每秒发送消息数(records/second)。除了将测试结果输出到标准输出外,该
脚本还提供 CSV Reporter,即将结果以 CSV 文件的形式存储,便于在其它分析工具中使用
该测试结果
$KAFKA_HOME/bin/kafka-consumer-perf-test.sh 该 脚 本 用 于 测 试 Kafka Consumer 的 性
能,测试指标与 Producer 性能测试脚本一样
1.3.2 Metrics 报告工具
Kafka 使用 Yammer Metrics 来报告服务端和客户端的 Metric 信息。Yammer Metrics 3.1.0
提供 6 种形式的 Metrics 收集——Meters,Gauges,Counters,Histograms,Timers,Health
Checks。与此同时,Yammer Metrics 将 Metric 的收集与报告(或者说发布)分离,可以根
据需要自由组合。目前它支持的 Reporter 有 Console Reporter,JMX Reporter,HTTP Reporter,
CSV Reporter,SLF4J Reporter,Ganglia Reporter,Graphite Reporter。因此,Kafka 也支持通
过以上几种 Reporter 输出其 Metrics 信息。
使用 JConsole 查看单服务器 Metrics,使用 JConsole 通过 JMX,是在不安装其它工具(既
然已经安装了 Kafka,就肯定安装了 Java,而 JConsole 是 Java 自带的工具的情况下查看 Kafka
服务器 Metrics 的最简单最方便的方法之一。
首先必须通过为环境变量 JMX_PORT 设置有效值来启用 Kafka 的 JMX Reporter。如
export JMX_PORT=19797。然后即可使用 JConsole 通过上面设置的端口来访问某一台 Kafka
服务器来查看其 Metrics 信息。
1.4 benchmark 报告
Kafka 的一个核心特性是高吞吐率,因此本文的测试重点是 Kafka 的吞吐率。
本文的测试硬件环境:
软件版本:kafka_2.9.1-0.8.2.2
6
zookeeper-3.4.6
jdk1.8.0_144
本文主要测试以下两种场景,测试的指标主要是每秒多少兆字节数据,每秒多少消息量。
1.4.1 Producer Only
这组测试不使用任何 Consumer,只启动 Broker 和 Producer。
1.4.1.1 线程数
实验条件:设置 3 个 partition,每个分区需分配 3 个 replication,message.size 为 100,batch.size,
为 200 ,messages 为 50000000。
测试项目:设置不同的线程数生产相同量的数据,分别设置线程数为 1,3,6,查看性能变化,
测试结果:
操作
1
2
3
结论:增加线程数,kafak 吞吐量增加。
partition
3
3
3
线程
1
3
6
replication
3
3
3
Records/second
19825.6768
45936.7965
65529.1652
MB/second
1.8907
4.3809
6.2493
1.4.1.2 分区数
实验条件:每个分区副本 1,message.size 为 100, batch.size,为 200 ,messages 为 50000000,
线程数为 3。
测试项目:设置不同的分区数生产等量的数据,分别设置分区数为
1,2,4,6,8,10,12,14,16,18,20,查看性能变化。
测试结果
操作
1
2
3
4
6
8
10
11
线程
3
3
3
3
3
3
3
3
partition
1
2
4
6
10
12
14
16
Records/second
89989.5576
91385.2877
118079.3635
134663.8064
122217.4101
130725.4426
121327.7086
123861.0923
MB/second
8.5821
8.7152
11.2609
12.8425
11.6556
12.4669
11.5707
11.8123
7
1.4.1.3 同步异步
实验条件:分区数为 6,副本数为 1,message.size 为 100, batch.size,为 200 ,messages 为
50000000,线程数为 3。
测试项目:分别以同步异步方式,生产等量数据,查看性能变化。
测试结果:
操作 线程 partition
1
2
Records/second
11173.7607
134938.5571
MB/second
1.0656
12.8687
replication
1 同步
1 异步
3
3
6
6
结论:异步传递消息的吞吐量远远大于同步。
1.4.1.4 批处理大小
实验条件:分区数为 6,副本数为 1,message.size 为 100,messages 为 50000000,线程数为
3。
测试项目:改变 batch.size 大小生产等量的数据,查看性能变化。
测试结果:
操作 线程 partition
1
2
3
4
5
6
Records/second
134687.3852
136609.7769
136346.7735
136972.0358
136362.3913
136410.3825
MB/second
12.8448
13.0281
13.0030
13.0627
13.0045
13.0091
replication
1
1
1
1
1
1
Batch.size
200
1000
2000
3000
4000
6000
3
3
3
3
3
3
6
6
6
6
6
6
8