Kafka Stream 以及其他流处理框架对比
1. Kafka Stream Introduction
假设我们需要对kafka 消息做流数据分析,例如:
- 对部分消息做过滤
- 每分钟计算一次收到了多少消息
这种情况下,对于消息过滤以及定时统计,甚至是进行流的合并,是几个基本的流式处理。但是在这种情况下,仅使用Kafka Producer 与 Consumer 很难实现这些功能,因为它们属于非常底层的API,并且并不是developer friendly 的API。在这种情况下,我们可以考虑使用Kafka Stream。
什么是Kafka Stream?
它是一个Kafka提供,进行数据处理与转换的库,有如下特点:
- 由Java 标准实现
- 不需要创建另一个独立的kafka集群
- 较好的扩展、弹性以及容错能力
- 可实现Exactly Once传输语义
- 每次处理一个条目(no batching),不像spark streaming那样是微批处理
- 适用于任何规模的应用
常规的Kafka Stream处理架构如下,其中producer端使用了开源的kafka connector:
2. Differences among various Streams
当前主流的流处理有:Storm,Spark Streaming,Flink以及Kafka Stream。
Storm
Storm是最早的流处理框架,它的优点在于:
- 低延时、true streaming、高吞吐
- 非常适合复杂度不高的流场景
缺点为:
- 无状态管理(no state management)
- 缺少更高级的功能,例如事件-时间处理、聚合、窗口、sessions、watermark等等
- at-least-once 语义
Spark Streaming
Spark Streaming 非常流行,在Spark 2.0 之后的版本,称为结构化的流(structured streaming),性能提升了很多,并且增加了很多高级功能,例如定制的内存管理(tungsten),watermarks,事件事件处理等。
在2.3.0 版本之后,structured streaming除了可以(默认)使用micro-batching处理之外,还可以选择continuous streaming 模式。在micro-batching模式下,最低延时可达100ms,而在continuous streaming 模式下,最低延时可达几毫秒。在大部分real-time 应用场景下,micro-batching 的延时是可以接受的。不过如果有必要实现毫秒级别的延时(如信用卡交易欺诈之类的),则需要使用continuous streaming。
虽然spark streaming 的continuous streaming可以提供如Storm与Flink级别的低延时,不过它仅是一个预览版,尚未完全成熟。
Spark Streaming 的优点为:
- 支持Lambda架构,与Spark无缝连接
- 高吞吐,适用于大部分对延时要求不高的场景
- 默认实现的Fault tolerance(由原生的micro-batch提供)
- 简易使用的高级API
- 社区繁荣,更新频繁
- Exactly Once 语义
缺点有:
- 并不是真正的流处理,不适用于低延时的场景
- 需要调整太多参数,很难调整到合适的参数
- 默认是Stateless streaming
- 在一些高级特性上,落后于Flink
Flink
Flink 是一个真正的流处理框架,它的优点为:
- 第一个真正的流处理框架,具有所有高级功能,例如事件-时间处理,watermarks,等
- 低延时、高吞吐,可以根据需求做配置
- 自适应,没有太多的参数需要调优
- Excatly Once 语义
- 被大公司广泛使用
缺点有:
- 仅在Streaming中广泛使用,在Batch 场景中使用较少
Kafka Stream
Kafka Stream相较于其他所有流处理框架,是一个轻量级的库。常用于处理Kafka中的数据,做一些变换(transformation),然后发回Kafka。
由于它原生即为轻量级的,所以适用于一些微服务类型的架构中。kafka Stream的部署与使用非常简单,且并不需要额外建立一个集群去运行。它的内部使用的是Kafka Consumer group,与Kafka log 的机制共同实现流处理。
Kafka Stream一个最大的优点为:端到端的Exactly Once。启用时也仅需要启用一个flag即可。
它的优点有:
- 非常轻量级的库,适用于微服务,IOT应用
- 不需要一个dedicated cluster
- 继承了Kafka所有优点
- 支持Stream join,内部使用rocksDB管理state
- Exactly Once语义(Kafka 0.11 以后的版本)
缺点为:
- 与Kafka 紧密联系,无法在没有Kafka 的场景下使用
- 相较于Spark Streaming、Flink,不适用于大型业务场景
3. Stream Comparison
当前主流使用的流处理框架其实仅有两种:Spark Streaming与Flink。所以其实真正的竞争也仅在这两者之间。
一般来说,我们在比较两者的性能时,会对比一些压测数据。不过这里的问题在于:两者的压测数据对比并不能很有效的说明两者孰优孰劣,因为一个很小的因素或是配置就有可能造成两者性能的不同。
抛开数据来看,我们可以明显看到的是:Flink在流处理框架中,为一个引领者的状态。例如它的exactly once,吞吐,延时,state management,fault tolerance,以及其他高级的功能等,均是由Flink引导。Flink中的各种底层实现如light weighted snapshots、off-heap custom memory management 可能也帮助它成就了今天的地位。并且我们现在也可以看到Flink已经在各大公司被广泛地使用了。
这里有一点需要提及的是:各个原生的流处理框架,如Flink,Kafka Stream,Samza 等这些支持state management的处理框架,内部均使用的是RocksDb存储state。其中一个原因就是RocksDB在每个节点上,locally maintains 持久化的state数据,并且性能特别好。
4. 如何选择Streaming Framework
在选择Streaming Frameworks时,首先需要了解的一点是:没有万能的Streaming Framework,一切的选择都是基于需求。
如果业务场景较为简单,并不需要最新的框架(存在学习成本以及实现成本)。则可以根据可投入的成本选择一个框架。例如,如果仅是需要一个基于IOT的事件的警报系统,则Storm,Kafka Stream就已经足够了。
如果业务场景中需要一些高级的功能,如状态管理,stream join,聚合等,则要使用更先进的流处理框架如Spark Streaming或是Flink。
基于当前业务使用的技术栈,若是整个业务使用的是Kafka 端到端,则使用Kafka Stream 或是Samza会更简单。同样,如果基于的是Lambda架构,或者业务中已经使用了Spark Batch或是Flink Bath,则可以相应考虑使用Spark或是Flink。
Kafka Stream 以及其他流处理框架对比的更多相关文章
- Apache流处理框架对比
分布式流处理,类似于MapReduce这样的通用计算模型,但是却要求它能够在毫秒级别或者秒级别完成响应.这些系统可以用DAG表示流处理的拓扑. Points of Interest 在比较不同系统是, ...
- 流式处理的新贵 Kafka Stream - Kafka设计解析(七)
原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/kafka_stream/ Kafka Stream背景 Ka ...
- 流式计算新贵Kafka Stream设计详解--转
原文地址:https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653162822&idx=1&sn=8c4611436 ...
- 《Kafka Stream》调研:一种轻量级流计算模式
原文链接:https://yq.aliyun.com/articles/58382 摘要: 流计算,已经有Storm.Spark,Samza,包括最近新起的Flink,Kafka为什么再自己做一套流计 ...
- Kafka设计解析(七)- Kafka Stream
本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka Stream.接着介绍了Kafka Stream的整体架构,并行模型,状态存储,以 ...
- Kafka设计解析(七)Kafka Stream
转载自 技术世界,原文链接 Kafka设计解析(七)- Kafka Stream 本文介绍了Kafka Stream的背景,如Kafka Stream是什么,什么是流式计算,以及为什么要有Kafka ...
- 流式计算(二)-Kafka Stream
前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...
- Spark Streaming,Flink,Storm,Kafka Streams,Samza:如何选择流处理框架
根据最新的统计显示,仅在过去的两年中,当今世界上90%的数据都是在新产生的,每天创建2.5万亿字节的数据,并且随着新设备,传感器和技术的出现,数据增长速度可能会进一步加快. 从技术上讲,这意味着我们的 ...
- Apache Samza流处理框架介绍——kafka+LevelDB的Key/Value数据库来存储历史消息+?
转自:http://www.infoq.com/cn/news/2015/02/apache-samza-top-project Apache Samza是一个开源.分布式的流处理框架,它使用开源分布 ...
- 告别Kafka Stream,让轻量级流处理更加简单
一说到数据孤岛,所有技术人都不陌生.在 IT 发展过程中,企业不可避免地搭建了各种业务系统,这些系统独立运行且所产生的数据彼此独立封闭,使得企业难以实现数据共享和融合,并形成了"数据孤岛&q ...
随机推荐
- appium测试混合应用
最近用appium测试公司APP,APP是原生+H5的模式,测试过程中发现大部分H5的页面使用原生的方式可以进行操作,只有少部分H5页面的按钮虽然在uiautomatorviewer的界面能解析出来, ...
- 02. rails安装
rails安装 ruby 1.8.6 对应的rails是2.3.2 Ruby 1.8.7 或 1.9.2 对应的rails 2.3.x ruby1.9.3,对应的rails是3.2.12, ruby2 ...
- 03.redis 事务
课程学习地址: https://www.bilibili.com/video/BV1S54y1R7SB?p=23 中间手册地址: http://www.redis.cn/ Redis事务本质:一组命令 ...
- Premiere cc 2019之声音处理
目录 deepin录视频 调整声道 查看声音轨道 转化格式 提取二声道的台词音,或者背景音 降噪 1.无需AU!PR自带音频模块完美实现降噪.增强人声.模拟环境 2.Adobe audition中降噪 ...
- Python第三方库的安装和导入
目录 一.Python第三方库的安装 1. 使用pip命令行安装 2. 使用PyCharm进行安装 3. 下载第三方库文件到本地进行安装 4. 通过国内源进行安装 二.Python第三方库的导入 1. ...
- python教程6.5-excel处理模块
第三方开源模块安装 创建文件 打开已有文件 写数据 选择表 保存表 遍历表 按行遍历 按列遍历 遍历指定行列 遍历指定第几列数据 删除表 设置单元格样式 字体 对齐 设置行高列宽
- java中调用exe程序和问题处理
常规方法如下: public class RunExe { public static void main(String[] args) { try { // exe文件的完整路径 String fi ...
- vue中v-for说明
v-if vs v-show区别v-if:每次显示与否,都会执行销毁和重建,渲染开销较大v-show:始终会被渲染并保留在DOM中.只是简单地切换display属性.频繁切换的时候用v-if,较少切换 ...
- java学习之旅(day.22)
CSS 前端三要素:HTML.CSS.javaScript 结构 表现 交互 相当于骨头,表皮 ,血肉吧 如何学习CSS CSS是什么 CSS怎么用(快速入门) CSS选择器(重点+难点) 美化网 ...
- Docker 必知必会4----容器之间的通信
前面几篇文章,我们基本聊了docker的基本概念,以及基本的操作手段: https://www.cnblogs.com/jilodream/p/18177695 初识dockerhttps://w ...