你可以在火花流中级联滑动时间窗口吗?

时间:2014-11-24 18:05:36

标签: apache-spark sliding-window spark-streaming

我想知道是否可以使用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();

我试过了,但没有打印出来。

1 个答案:

答案 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 。)

  1. 每5秒A总计5个元组。
  2. 每5秒B根据(3 * 5 =)15个原始元组总结A​​的最后一次(15/5 =)3个结果。
  3. 每30秒C根据(6 * 3 * 5 =) 90 原始元组总结B的最后(30/5 =)6个结果!元组将被多次求和,因为B的窗口间隔大于其滑动间隔。
  4. 映射器更正计算错误。
  5. 更正步骤

    我认为您的真实应用程序并不像字数一样简单。您之后需要一个反函数来修复重复错误。您也可以尝试在C之前解决问题(在单词计数示例中,它可以提前划分)。另一个解决方案是跟踪已处理的元组并仅聚合析取元组。这取决于您的使用案例。