Spark Streaming,Flink,Storm,Kafka和Samza:选择流处理框架
根据IBM Marketing cloud的最新报告,\"仅过去两年就创建了当今世界90%的数据,每天创建2.5亿亿字节的数据,并且随着新设备,传感器和技术的出现, 数据增长率可能会进一步加快\"。9 d E m 9 ) U 从技术上讲,这意味着我们的大数据处理世界将变得更加复杂且更具挑战性。 而且,许多用例(例如,移动应用广告,欺诈检测,出租车预订,病人监护等)都需要在T _ * Z b . ~数据到达时进行实时数据0 Z F R处理,以便做出快速可行的决策。 这就是为什么分布式流处理在大数据世界中变得非常流行的z 1 ` s 9原因。
如今,有许多可用的开源流框架。 有趣的是,几乎所有它们都是相当新的,仅在最近几年才开发出来。 因此,对于新手来说,很容易混淆流框架之间的理解和区分。 在本文中,我将首先大致讨论流处B 6 V ) * # y b C理的类型和方面,然后比较最受欢迎的开源流框架:Flink,Spark流,Storm,Kafka流。 我将尝试(简要地)解释它们的工作原理,它p c ] 至少处理一次),Tomost-once(如果发生故障则可能不会被处理)或I J 7 9 R ) TExactly-once(一次处理,并且即使是一次也仅处3 E Z理一次) 失败)。 显然,只希望一次,但是 d =很难在分布式系统中实现,并且需要权衡性能。
容错:如果发生诸如节点故障,网络故障等故障,框架应该能够恢复并应该从其离开的位置重新开始处理。 这是通过不时检查流向某些持久性存储的状态来实现的。 例如 从卡夫卡获取记录并对其进行处理后,将检查点卡夫卡抵消给动物园管理员。
状态管理:在有状态处理要求的情况下,我们需要保持某种状态(例如,记录中看到的每个不同单词的计数),框架应该能够提供某种机制来保存和更新状态l 1 p N [ X ,信息。
性能:这包括延迟(可以多久处理一条记录),吞吐量(每秒处理的9 Z X & v D记录数)和可伸缩性。 延迟应尽可也称为快速批处理。 这意味着每隔几秒钟将传入的记录分批处理,然后以单个小批处理的方式处理,延迟几秒钟。 示例:Spa{ T R e , / Irk,Storm。
这两种方法都有其优点和缺点。原生流很$ [ +自然,因为每条记录在到达时都会被处理,从而使框架实现了尽可能小的延迟。 但这也意味着在不影响吞吐量的情况下很难实现容错,因为对于每条记录,一旦A G c * i 6 e处理,我们就需要跟踪和检查点。 而且,状态管理很容易,因为有长时间运行{ ; h的进程可以轻松维护所需的状态。
另一方面,微批处理则完全相反。 容错是免费提供的,因{ * j p % ~ o ? 5为它本质上是一个批处理,吞吐量也N X t 8 B很高,因为处理和检查点v * 5 X l | #将在一组记录中一次性完成。 但这会花费一定的等待时间,并且不会感觉I b关Storm的详细信息:part1和part2。N & E
优点:
极低的延迟,真正的流,成熟和高A } N : h吞n # | E C H吐量
非常适合简单v L E的流媒体用例
缺点
没有状态管理
没有高级功能,例如事件时间处理,聚合,开窗,会话,水印等
一 M - W M Z ? #次保= o { ` [证
Spark Stream:
Spark已成为批处理中hadoop的真正继任者,并且是第一个完全支持Lamy n 5 ` 2 Abda体系结构的框架(在该框架中,实现了批处理和流传输;实现了正确性的批处理;为速度而流化)。 它非常受欢迎,成熟并被广泛采用。 Spark Streaming是随Spark免费提供的,它使用微批处理进行流媒体处理。 在2.k 7 / V o , &0版本之前,Spark Streaming有一些严重的性能限制,但是在新版本2.0+中,它被称为结构化流,并具有许多良好的功能,例如称为钨的自定义内存管理(如flink),水印,事件时间处理支持等。 另外,结构化流更为抽$ s T象,在2.3.0版本中,可以选择在微批量和连续流模式之间进行切换。 连续流模式有望带来像St/ I & v , ( aorm和Flink这样的子延迟,但是它仍处于起步阶段,操作上有很多限制。
优点:
支持Lambda架构,Spark免费提供
高吞吐量,适用g ! a m ? o [ :于不需要亚延迟的许多使用情况
由于微批量性质,默认情况下具有容错能力
简单易用的高级API
庞大的社区和积极的改进
恰好一次
缺点T 4 R S ;
不是真正的流媒体,不适合L Z g 2 O低延迟要求
要调整的参数太多。 很难做到正确。 在调整Spark Str j任何相似之处。 在Flink中,诸如map,filter,reduce等的每个函数都实现为长时间运行的运算符(类似于Storm中的Bolt)
Flink看起来像是Storm的真正继承者,就像Spark批量继承了hadoop一样。
优点:
开源流媒体领域的创新领导者
具有所有高级功能(例如事件时间处理,水印等)的第一个True流框9 # 6 4 D . -架
低延迟,高吞吐量,可根据要求进行配置
自动调整,无需调整太多参数
恰好一次
被Uber,阿里巴巴等大型公司广泛接受。
缺点
比赛进行得很晚,最初b H J 5服务线程池的库,但具有对Kafka的内置支持。 它可以与任何应用程序很好地集成在一起w l H / | 4 ] =,并且可以立即使用。
由于其重量轻的特性,可用于微服务类型的体系结构。 与Flink在性能方面没有匹配,但不需要运行单独的集群,非常方便且易于部署和开始工作。 内部使用Kafka Consumer组并研究Kafkh n A e Y * N g Ba日志哲学。这篇文章彻底解释了Kafka Streams与Flink Streaming的用例。
Kafka Streams的一个主要优点是它的处理是完全精确的端到端。 可能是因为来源K K 6 l H 7 K c (和目的地都是Kafka以及从2017年6月左右发布的KafkJ l * a T ia 0.11版本开始,仅支持一次。 要启用此功能,我c 0 j - l t们只需要启用一个标志即可使用。 有关此处和此处共享的更多详细信息。
优点:
重量很轻的库,适合微服务,X ` . H ?IOT应用
不需要专用集群
继承卡夫卡的所有优良特性
支持流连接,内部使用rockN } Y y o / l G 3sDb维护状态。
恰好一次(从Kafka 0.11开始)。
缺点
与卡夫卡紧密结合,在没有卡夫卡的f p @ _ J v o # S情况下无法使用
婴儿期还很新,尚待大公司测试
不适用于繁重的工作,例如Spark Streaming,Flink。
Samza:
简短介绍一下Samza。 从100英尺高的萨姆扎(Samza)看上去与卡夫卡Stream(Kafka Streams)相似。 有很多相似之处。 这两个框架都是由同一位开发人员开发的,这些开发人员在LinkedIn实施W z 0 e D L了Samza,然后在他们创建K6 o 8 b n ? f ; ~afka Streams的地方成立了Confluent。 这两种技术都与Kafka紧密结合,从Kafka获取原始数据,然后将处理后i z : # # p h t的数据放回Kafka。 使用相同的Kafka Log哲学。 Samza是Kafka Stream, Q m g G + Ys的缩放版本。 Kafk` s m U ) T 5 *a Strp 4 r b z h Geams是用于微服务的库,而Samza是运行在Yarn.AdvantaC , Y z - w ges上的完整框架集群处理。
在使用rocksDb和kafka日志维护大型信息状态(适用于连接流的用例)方面非常好。
使用Kafka属性的容错和高性能
如果已在处理管道中使用Yarn和Kafka,则要考虑的选项之一。
好纱民
低延迟,高吞吐量,成熟并经过大规模测试
缺点:
与Kafka和Yarn紧密相连。 如果这些都不在您的处理管道中,则不容易使用。
至少一次加工保证。 我不确定它是否像Kas O Zfka 0.11之后的Kafka Streams现在完全支持一次
缺乏高级流功能,J ] :例如水印,会话,触发器等
流框架比较:
我们只能将技术与类似产品进行比较。 尽管Storm,Kafka Streams和! b t { 6 lSamza现在对于更简! W H q O c 单的用例很有用,但具有最新功能的重量级产品之间的真正竞争显而易见:Spark vs Flink
当我们谈论比较时,我们通常会问:给我看Z R Y l O D K数字:)
基准测试是仅当第三方进行比较时比X m : Y 0 $ Q ? v较的好方法。
例如,一个古老的基准标记就是这个。 但这是在Spark Streaming 2.0之前的时候,它受到RDD的限制并且项目钨没有到位。现在在Structured Streaming 2.0版本发布之后,Spark Streaming试图追赶很多东西,而且似乎很难 奋斗。
最近,基准测试已成为Spark和Flink之间的一场Z % 7激烈争吵。
Spark最近与Flink进行了基准测试比较,F^ / Y ^ 4link开发人员对Flid + X `nk开发人员进行了另一项基准测试,之后由Spark成员编辑了该帖子。
最好不要相信这些天的基准测试,因为即使很小的调整也可以完_ L Y P h全改变数字。 没有C c什么比决定之前尝试和测试自己更好。 到目前为止,很明显,Flink在流分析领域处于领先地位,它具有大多数期望X Q = r的方面,例如精确一次,吞吐量,延迟,状态管理,容错,高级功能等。
之所以能够实现这些功能,是因为Flink的一些真正创新,例如轻量级快照和堆外自1 w , o d定义内存管理.Flink的一个重要问题是成熟度和采用水平,直到一段时间之前,但现在Uber,阿里巴巴,CapitalOne等公司正在使用Flink流 大规模证明Flink Streamint b z Mg的潜力。
最近,Uber开源了他们最新的称为AthenaX的流分析框架* d $ = L ^,该框架基于Flink引擎构建。 在本文中,4 _ v x c /他们讨论e , H + n E L了如何将流分析从STorm迁移到Apache Samza,再到现在的Flink。
如果您已经注意到,需要注意的重( S t z S ( Z要一点是,所有支持状态管理的本机流框架(例如Flink,Kafka Streamu B ^ qs,Samzk s H g ( i b [a)在内部都使用RocksDb。 RocksDb从某种意S & % } 6 d ; I |义上说是独一无二的,它在每个节点上本地保持持久状态,并且性能很高。 它已成为新流媒体系统的关键部分。 我在先前的一篇文章中分享了有关RocksDb的j ( R } R ( o详细信息。
如何选择最佳M Q j Y ;的流媒体框架:
这是最重要的部分。 诚实的* B & % (答案是:这取决于:)重要的是要记住,对于每/ ; u x :个用例U ( N ` O h [,没有一个处理框架可以成为万灵丹。 每个框0 b y j #架都有其优点和局限性。 尽管如此,凭借一些经验,他仍然会分享一些有助于制定决策的` S m建议:
取决于; s *用例:如果用例很简单,那么如果学习和实现起来很复杂,则无需寻求最新,最好的框架。 在很大程度上取决于我们愿意为想要的回报投入多少。 例如,如果它! @ , h g是基于事件的简单IOT事件警报系统,那么Storm或Kafka Streams可以很好地使用。
现有技术堆栈:更重要的一点是考虑现有技术堆栈。 如果? ! $ y S现, E U ~ X有堆栈的首尾相连是Kafka,则Kafka Streams或Samza可能更容易安装。 同样,如果处理管道基于Lambda架构,并且Spark Batch或Flink Batch已经到位,则考虑使用Spark StreamiK P 5ng或Flink Streaming是有意义的。 例如,在我以前的项目之一中,我已经在管道中添加J / I q了Spark Batch,因此,当流媒体需求到来时,选择需要几乎相同的技能和代码库的Spark Streaming相当容易。
简而言之,如果z 0 n o h我们很好地了解框架的优点和局限性以及用例,那么选择或至少过滤掉可用的选项Q ; d S就: * | : z l更W - 能在几年后已经过F n ( 3 b k时。 目前,Spark和Flink在开发方面是领先的重量级人物,但仍有一些新手可以加入比赛。 Apache Apex是其中之一。 还有一些我没有介绍的专有流解决方案,例如Google Dataflow。 我的这篇文章的目的是帮助流媒体新手以最少的术语理解流媒体的一些核h N y W w ~ i ~心概念,以及流行的开源流媒体框架的优点,局限性和用例。 希望该帖子对您有所帮助。
快乐流!
您可以在Linkedin和Quora上关注我
(本文翻译自chandan prakash的文章《Spark StreaQ P - H c h R Iming vs Flink vs Storm vs Kafkq @ sa Streams vs Samza : Choose Your Stream Processing Framework》,参考:https://medium.com/@chandanbaranwal/spark-stream2 ? | o T J o 0ing-vs-flink-vs-storm-vs-kafka-streams-vs-samza-choose-your-streS U t z N _ ?am-procesh g L $ E Ysing-91ea3f04675b)