我想知道是否可以使用Sparks Streaming将滑动窗口级联到另一个。
所以例如我每1秒就有一次计数。我想把它们用于5,15和30秒的窗口。我想知道是否有可能重复5秒钟的窗口结果15秒钟,15秒钟30秒钟。
目的是避免为最长窗口的长度存储所有输入的1秒更新(因为粒度在这里无关紧要)。相反,我们重用Dstream的频率与我们需要的频率匹配。
以下是示例:
JavaPairDStream< String, Double > test = input;
JavaPairDStream< String, Double > test1 = input;
// 5s:
test = test.reduceByKeyAndWindow(new SumReducer(), new Duration(5000), new Duration(1000));
test1 = test1.reduceByKeyAndWindow(new SumReducer(), new Duration(5000), new Duration(5000));
// 15s
test = test1.reduceByKeyAndWindow(new SumReducer(), new Duration(15000), new Duration(5000));
test1 = test1.reduceByKeyAndWindow(new SumReducer(), new Duration(15000), new Duration(15000));
// 30s
test = test1.reduceByKeyAndWindow(new SumReducer(), new Duration(30000), new Duration(15000));
test.print();
我试过了,但没有打印出来。
答案 0 :(得分:1)
批处理间隔
窗口长度和滑动间隔必须是批处理间隔的倍数。为避免竞争条件(例如,在10秒窗口中发出三个5秒的总和),批处理间隔必须大于计算时间。我假设这里的批处理间隔为1000毫秒。
示例强>
JavaPairDStream<String, Double> stream = input;
// A: 5s sum every 5s
stream5sCount = stream.reduceByKeyAndWindow(
new SumReducer(), new Duration(5000), new Duration(5000));
// B: 15s sum every 5s
stream15sCount = stream5sCount.reduceByKeyAndWindow(
new SumReducer(), new Duration(15000), new Duration(5000));
// C: 30s sum every 15s
stream30sCount = stream15sCount
.reduceByKeyAndWindow(new SumReducer(), new Duration(30000), new Duration(15000))
.map(new DivideBy(3));
stream30sCount.print();
<强>解释强>
(对于两个动作A和B,其中B减少A: windowLength of B / slideInterval of A =输入元组的数量为B 。)
更正步骤
我认为您的真实应用程序并不像字数一样简单。您之后需要一个反函数来修复重复错误。您也可以尝试在C之前解决问题(在单词计数示例中,它可以提前划分)。另一个解决方案是跟踪已处理的元组并仅聚合析取元组。这取决于您的使用案例。