首页 >> 电商 >> 分布式面向对象工具Akka Streams、Kafka Streams和Spark Streaming大PK

分布式面向对象工具Akka Streams、Kafka Streams和Spark Streaming大PK

2025-01-05 电商

p>

Scala

import Serdes._

Kafka针对开放耐用性开展了十进制式的详细描述驱动器,也就是我们常说的表单和鼓动表单。通过上述语句,我们可以在Scala从前面借助于表单和鼓动表单(并行转化机)的备用新增。

脱氧核糖核酸

Scala

val props: Properties = {

val p = new Properties()

p.put(StreamsConfig.APPLICATION_ID_CONFIG, "myFabulousWordCount")

p.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "my-kafka-broker-url:9092")

p

}

上述技术的发展示例的第一均需装配待连结的Kafka集群的细节。示意图是我用Scala写出有的API。

脱氧核糖核酸

Scala

val builder: StreamsBuilder = new StreamsBuilder

val textLines: KStream[String, String] =

builder.stream[String, String]("TextLinesTopic")

在此之后,我但会采用一个框架机Mode(builder pattern),从需的题材从前面读取详细描述的节点对。

脱氧核糖核酸

Scala

val wordCounts: KTable[String, Long] = textLines

.flatMapValues(textLine => textLine.toLowerCase.split("\W+"))

.groupBy((_, word)=> word)

.count()(Materialized.as("word-counts-table"))

然后,我们将操纵引从前面一些功能开放性操纵符集从前面到一张表从前。基于Kafka的stream-table二元开放性,我们可以对Kafka Steams开展图表表级别的聚合和管控互转。

脱氧核糖核酸

Scala

1

wordCounts.toStream.to("WordsWithCountsTopic")

在转化操作过程从前面,我们需将该图表表转化为时序,以向其他技术的发展程序缺少或许熟悉的题材。

脱氧核糖核酸

Scala

val streams: KafkaStreams = new KafkaStreams(builder.build(), props)

streams.start()

sys.ShutdownHookThread {

streams.close(10, TimeUnit.SECONDS)

}

仍要,我们需所设时序的起停,否则线性引是不但会适时花钱任何事的。

Kafka Steams的特性和缺陷

Kafka Steams的主要特性是:Kafka集群但会给您缺少低速、低容错开放性和低可扩展开放性。同时,Kafka也缺少exactly-once的死讯送达语义。这对于分布式该系统来说意义重大,毕竟许多前提无法缺少此类保证,进而但会出有现图表的减法或遗留下。同时,Kafka借此采用完全一致死讯图表传输借助于薄免费的通信,以以后用户有权管控并通过Kafka建起自己的薄免费内(inter-microservice)通信协议。

当然,Kafka并非没有缺陷。

首先,Kafka强制采用Ja建筑风格的API,但会给Scala程序员带来患病。 其次,如果您想在自己的体系骨架从前面采用Kafka,那么就需所设一个单独的Kafka集群来用于管理(即使您不见得需分配备有的PS)。 同时,鉴于Kafka的相对可装配开放性,您需提早知晓如何装配。 仍要,Kafka只支持者producer-consumer的该系统多种类型。 二、Akka Streams

Akka Streams是一种由Scala写出有的,为JVM框架的低开放耐用性示例纳。它推行了Reactive Streams规范(Reactive Manifesto)--作出有反应开放性、弹开放性、容错和死讯驱动的语义。通过它,您显然可以以无限的图表量和100%管控引的仿射装配,来管控个人身份详细描述。Akka Streams缺少Actor数学方法的并发开放性,其引式模组框架在异步实质上模组之上。

Akka Streams的主要优势在于相对可扩展开放性和容错开放性。它缺少了一个多功能和简洁的引API,即Scala-based DSL。您可以恰当地通过“插入”模组来启动它们。同时,Akka Streams还缺少了一个下级别的GraphStage API,以以后您可以管控个人身份特定模组的演算。

如上文所述,在Kafka从前面,您的技术的发展程序通过采用死讯图表传输,视作了Kafka集群的IPAPI。而Akka Streams是技术的发展程序在演算上亦非的一均。您可以将Akka Streams想象为技术的发展程序的循环该系统,而Kafka只是本体秘密组织“造血纳”罢了。

Akka Streams的相结合

脱氧核糖核酸

Scala

val source1 = Source(List("Akka", "is", "awesome"))

val source2 = Source(List("learning", "Akka", "Streams"))

val sink = Sink.foreach[(String, Int)](println)

val graph = GraphDSL.create(){ implicit builder =>

import GraphDSL.Implicits._

val wordCounter = Flow[String]

.fold[Map[String, Int]](Map()){(map, record)=>

map +(record ->(map.getOrElse(record, 0)+ 1))

}

.flatMapConcat(m => Source(m.toList))

val merge = builder.add(Merge[String](2))

val counter = builder.add(wordCounter)

source1 ~> merge ~> counter ~> sink

source2 ~> merge

ClosedShape

}

RunnableGraph.fromGraph(graph).run()

上述示例是词根枚举技术的发展程序的Akka Streams相结合。该Scala看起来相比较简洁,让我们来分解其示例的主要均:

脱氧核糖核酸

Scala

val source1 = Source(List("Akka", "is", "awesome"))

val source2 = Source(List("learning", "Akka", "Streams"))

val sink = Sink.foreach[(String, Int)](println)

前3行示例框架了最初的图表相关联,并送达异步元素(在意味著从前面为字符串)。

脱氧核糖核酸

Scala

val wordCounter = Flow[String]

.fold[Map[String, Int]](Map()){(map, record)=>

map +(record ->(map.getOrElse(record, 0)+ 1))

}

.flatMapConcat(m => Source(m.toList))

上述示例是计算出有来字数的主要均,它旨在消除在一个恰当的字符串本表。

脱氧核糖核酸

Scala

val merge = builder.add(Merge[String](2))

val counter = builder.add(wordCounter)

source1 ~> merge ~> counter ~> sink

source2 ~> merge

上述示例借助于的是Akka Streams将自己的演算,运用到不同的引组。示意图展示了它的引式演算图。

Stream临时工引

示意图,我们来核对这段示例:

脱氧核糖核酸

Scala

source1 ~> merge ~> counter ~> sink

source2 ~> merge

注意,上述示例从前面有个十分多种不同的暗示引仿射的骨架。我们只用2行示例以后得心应手地构造出有了任意引式整体设计,而且它们是显然异步、低速且容错的。

Akka Streams的特性和缺陷

由于Akka Streams是一个Reactive Streams的借助于,因此其API缺少了极快的速率和相对可扩展开放性。同时,Akka Streams缺少了下级别的GraphStage API,使您必须管控自定义引的演算,例如:批管控图表、手动从前面断、以及重定向时序等,真神算是一切大抵有或许。此外,Akka Streams也可以无缝地连结到带有Alpakka Kafka连结机的Kafka上。 Akka Streams是作为技术的发展程序的开发纳被框架的,因此您不必像Kafka那样去撰写出有IPAPI,而无需像任何其他纳那样,用它去框架分布式技术的发展程序即可。

Akka Streams的缺陷在于它多种不同引式C++,学习曲线相比较斜坡。同时,如果您采用集群的整个NT的话,但会发现Akka Streams的扩展十分容易。事实上,正是因为Akka Streams视作了技术的发展程序亦非的一均,因此您需像任何“框架”纳那样,去采取特定的思维多种形式。

三、Spark Streaming

作为大规模Spark分布式计算出有来发动机的自然引扩展,Spark Streaming的用以是管控持续开放性大规模的图表。以外,您有两个API级别可供选择:一个是带有离散引(Discretized Streams,DStreams)的下级别低可控API,另一个是常见于的DataFrame API。它也被称为骨架化引,针对常规“线性”大图表,缺少了一个多种不同的API。Spark通过原生的可扩展开放性和容错开放性,缺少了两种读写Mode和功能:

micro-batchMode,Spark必须间距、批量地收集所有图表。 continuousMode,以外还东南侧于物理前期的高于延迟多种形式。

Spark的主要优势体现在大图表的管控能力上。由它缺少的DataFrame、SQL API、以及丰富的Spark UI,都必须方以后您侦查和损耗的实时开放耐用性。

相比较的是,由于Spark需一个专为的计算出有来集群,因此它在生产环境从前面相比较费时水资源。当然,Spark具可装配开放性,如果您知道如何正确地调整它的话,可以在其开放耐用性上简化不少。

Spark Streaming的相结合

脱氧核糖核酸

Scala

val spark = SparkSession.builder()

.appName("Word count")

.master("local[*]")

.getOrCreate()

•val streamingDF = spark.readStream

.format("kafka")

.option("kafka.bootstrap.servers", "your-kafka-broker:9092")

.option("subscribe", "myTopic")

.load()

•val wordCount = streamingDF

.selectExpr("cast(value as string)as word")

.groupBy("word")

.count()

•wordCount.writeStream

.format("console")

.outputMode("append")

.start()

.awaitTermination()

上述示例以后是词根枚举技术的发展的Spark Streaming相结合。在此,我们采用了下级别的骨架化引式(Structured Streaming)API,使得示例既杂乱又分离。示意图,我们来进一步研究:

脱氧核糖核酸

Scala

val spark = SparkSession.builder()

.appName("Word count")

.master("local[*]")

.getOrCreate()

上述示例无需您启用一个样板—Spark Session。

脱氧核糖核酸

Scala

val streamingDF = spark.readStream

.format("kafka")

.option("kafka.bootstrap.servers", "your-kafka-broker:9092")

.option("subscribe", "myTopic")

.load()

由上述示例可知,您可以通过均须图表源来读取图表。同时,Spark Streaming也必须雨林以APP即用的多种形式支持者Kafka。

脱氧核糖核酸

Scala

val wordCount = streamingDF

.selectExpr("cast(value as string)as word")

.groupBy("word")

.count()

上述示例的演算也相比较恰当,在SQL从前面我们无需运用“group by”来枚举。而由于Kafka是以十进制来驱动器图表的,因此我们必须添加如下躯干。

脱氧核糖核酸

Scala

wordCount.writeStream

.format("console")

.outputMode("append")

.start()

.awaitTermination()

仍要,您无需将时序指向读写sink(在此我们又用到了Kafka),以后可以开始查询时序了。

Spark Streaming的特性和缺陷

Spark具基于政治事件时间和水印的图表后期管控能力。这在真神实场景下十分新颖。同时,相对可装配的Spark,可以通过其内置的连结机,作为图表的读写或读写,连结到Kafka东南侧,来借助于开放耐用性调优。当然,Spark也拥有卓越的文档和广泛的社区支持者。此外,Spark还必须针对较小的图表管控,在本地开展加速。

与其他前提一样,Spark也十分完美。除了通用的DataFrame和SQL API之外,它在编译时,但会丧失一均多种类型的安全开放性。而在您将Dataset新增lambdas后,其开放耐用性也但会相当程度下降。如前所示,Spark Streaming在大图表和micro-batch管控方面表现不错,但是其continuousMode有待简化。仍要,由于Spark需运行一个专为的集群,因此它也但会分放一均的算力。

四、该如何选用

可见,上述讨论的每一种前提都是针对某些特定的市场需求而框架的。那么,我们该如何开展选用呢?

Akka Streams最简单低开放耐用性的该系统。它缺少了一个十分有力的API,不过您需兰花时间去掌握它。 由于Kafka最简单作为本体低开放耐用性技术的发展的死讯图表传输,因此如果您想让薄免费可以从公共政治事件东南侧开展读写出有的话,同样采用Kafka。当然,其Ja建筑风格的API或许过于繁琐,不利于示例的杂乱。 Spark Streaming不可否认是为大图表计算出有来而生。不过,有详细描述表明,它对于实际的技术的发展演算和低延迟市场需求十分友好。您可以仅有把Spark Streaming作为图表聚合机(data aggregator),来获取图表的洞见。

书名简述

陈峻 (Julian Chen),51CTO社区编者,具十多年的IT建设项目推行潜能,善于对内本体水资源与风险推行管控,热衷于传播网络与计算机网络科学与潜能;持续开放性以博文、为题和译文等多种形式,分享前沿技术与新知;经常以线上、方以等多种形式,开展计算机网络类培训与授课。

原文标题:Comparing Akka Streams, Kafka Streams and Spark Streaming,译者:Daniel Ciocirlan

拉肚子为什么肚子会疼
视力模糊是什么原因
绝经费用大概是多少
雅培全安素
术后恢复喝江中初元
怎么治疗干眼症
胸闷气短
婴幼儿腹泻的治疗方法
吃什么药可以祛湿听听医生怎么说
中暑吃什么药见效快
友情链接