不同元素的火花流和批处理模式之间的代码重用

Posted

技术标签:

【中文标题】不同元素的火花流和批处理模式之间的代码重用【英文标题】:Code reuse between spark streaming and batch mode for distinct elements 【发布时间】:2014-12-03 15:04:32 【问题描述】:

我是 Spark 新手,我想使用 spark 流和 spark 批处理实现 lambda 架构。

在网上找了以下文章:

http://blog.cloudera.com/blog/2014/08/building-lambda-architecture-with-spark-streaming/

这对于我的某些分析来说很好,但我认为这种解决方案在必须找到不同元素的情况下是不可行的。

如果您想在 JavaRDD 上查找不同的元素,您可以使用 distinct 方法。 DStreams 是一组 RDD,所以如果你申请

transform((rdd) -> rdd.distinct()) 

在 Dstream 上的方法,您将在流的每个 rdd 上执行 distinct,因此您将在每个 RDD 中找到不同的元素,而不是在整个 DStream 上。

这样写可能有点混乱,所以让我用一个例子来澄清一下:

我有以下元素:

Apple
Pear
Banana
Peach
Apple
Pear

在批处理应用中:

JavaRDD<String> elemsRDD=sc.textFile(exFilePath).distinct() 

子 RDD 将包含:

Apple
Pear
Banana
Peach

如果我理解正确,这应该是流的行为:

假设我们有一个 1s 的批处理时间和一个 2s 的窗口:

第一个 RDD:

Apple  
Pear
Banana

第二个RDD:

Peach
Apple
Pear

JavaDStream<String> elemsStream=(getting from whathever source)
childStream = elemsStream.transform((rdd) -> rdd.distinct())
childStream.forEachRDD...

最终会得到 2 个 Rdd: 第一:

Apple  
Pear
Banana

第二:

Peach
Apple
Pear

这是对 RDD 的独特尊重,而不是对 DStream 的尊重。

我对 Streaming 部分的解决方案如下:

JavaDStream<HashSet<String>> distinctElems = elemsStream.map(
                (elem) -> 
                    HashSet<String> htSet = new HashSet<String>();
                    htSet.add(elem);
                    return htSet;
                ).reduce((sp1, sp2) -> 
                    sp1.addAll(sp2);
                    return sp1;
                );

这样的结果是:

Apple
Pear
Banana
Peach

作为批处理模式。 但是,此解决方案将需要维护开销,并且存在因重复代码库而导致错误的风险。

有没有更好的方法来尽可能多地重用批处理模式的代码来达到相同的结果?

提前致谢。

【问题讨论】:

你可以试试 UpdateStateByKey.. 【参考方案1】:

您的解决方案很优雅。

我有其他解决方案,它不如你的优雅,但我不知道它是否更有效。这是我基于 mapToPairFunction 的解决方案

JavaPairDStream<String, Integer> distinctElems = elemsStream
       .mapToPair(event -> new Tuple2<String, Integer>(event,1));
distinctElems = distinctElems.reduceByKey((t1, t2) -> t1);

我认为这更有效,但我无法测试它。

【讨论】:

以上是关于不同元素的火花流和批处理模式之间的代码重用的主要内容,如果未能解决你的问题,请参考以下文章

IO流--字符流写数据

JavaScript 中的事件流和事件处理程序(读书笔记思维导图)

每个微批次火花流中处理的总记录

Pipes-and-Filters模式

Pipes-and-Filters模式

Pipes-and-Filters模式