Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Apache Spark流媒体-reduceByKey、groupByKey、aggregateByKey还是combineByKey?_Apache Spark_Spark Streaming - Fatal编程技术网

Apache spark Apache Spark流媒体-reduceByKey、groupByKey、aggregateByKey还是combineByKey?

Apache spark Apache Spark流媒体-reduceByKey、groupByKey、aggregateByKey还是combineByKey?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我有一个应用程序,它在10分钟内生成多个会话,每个会话包含多个事件(以Avro格式),每个事件将包含一个会话id,该id可用于查找所有会话数据。收集完所有这些数据后,我想创建一个会话对象 我的计划是在Spark Streaming中使用一个窗口,以确保内存中有可用的数据进行处理,除非有任何其他建议非常适合解决我的问题 在阅读了ApacheSpark文档之后,我似乎可以使用各种不同的API实现这一点,但我正在努力找出哪种API最适合我的问题-到目前为止,我遇到了reduceByKey/groupB

我有一个应用程序,它在10分钟内生成多个会话,每个会话包含多个事件(以Avro格式),每个事件将包含一个会话id,该id可用于查找所有会话数据。收集完所有这些数据后,我想创建一个会话对象

我的计划是在Spark Streaming中使用一个窗口,以确保内存中有可用的数据进行处理,除非有任何其他建议非常适合解决我的问题

在阅读了ApacheSpark文档之后,我似乎可以使用各种不同的API实现这一点,但我正在努力找出哪种API最适合我的问题-到目前为止,我遇到了reduceByKey/groupByKey/aggregateByKey/combineByKey

为了让您更详细地了解会话/事件数据,我希望在100万个活动会话中的任何位置都会有,每个会话在10分钟内产生5/10个事件

最好能得到一些输入,这种方法非常适合收集所有会话事件并生成单个会话对象


提前谢谢。

@phillip谢谢你提供的详细信息。让我们进入每个关键点的详细信息:

(1) 。groupByKey—它可以帮助使用任何键进行排序、排序甚至聚合。从性能上看,它比较慢,因为它不使用组合器。 groupByKey()只是基于一个键对数据集进行分组

如果您正在进行任何聚合,如sum、count、min、max,则这不是首选

(2) 。reduceBykey-它只支持sum、mix、max等聚合。使用combiner比groupbykey更快。洗牌的数据很少。 reduceByKey()类似于分组+聚合。 当我们在大数据集上运行时,可以使用reduceByKey

(3) 。aggregateByKey-与reduceBykey类似,它只支持sum、mix、max等聚合。在逻辑上与reduceBykey()相同,但它允许您以不同的类型返回结果。换句话说,它允许您将输入作为类型x,并将结果聚合为类型y。例如,(1,2),(1,4)作为输入,(1,“6”)作为输出


我相信您只需要分组而不需要聚合,那么我相信您别无选择,只能使用groupBykey()

如何确保所有数据就绪?这意味着如何确保流媒体已停止?reduceByKey、groupBykey等是分组技术,还有一个问题,你想分组什么?每个会话将包含一个“完整”的事件类型,它将表示会话结束。此外,启动会话事件将包含一个时间戳,该时间戳将用作切断(例如,最大会话时间为10分钟),因此,如果尚未收到会话完成事件,我仍然可以处理所有可用数据。这有意义吗?就分组而言;每个会话将生成由同一会话id链接的多个客户端事件(Avro格式)。我正在尝试收集属于同一会话的所有客户端事件,以便创建一个可用于进一步处理/报告的会话对象。一旦我有了所有的会话数据,我计划将其存储在HDFS中,这意味着它可以从Spark Streaming中删除,因为不需要进一步的处理。希望能有所帮助。感谢您的详细回复-我同意使用groupByKey()可能最适合解决我的问题。出于兴趣,在处理创建最终会话对象之前,使用其他API允许我将所有会话事件合并到每个集群实例上的集合(例如列表)中有什么好处?或者,这种方法是否无法提供任何真正的性能优势,或者根本就不是一种选择?