2014-11-24 23 views
1

我想知道是否有可能級聯滑動窗口到另一個與火花流。你可以級聯滑動時間窗口火花流

因此,舉例來說,我每1秒就有一次計數。我想對那些5,15和30秒的窗口求和。我想知道是否有可能重複使用5秒窗口結果15秒1秒,15秒1秒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

批次間隔

窗口長度滑動間隔必須是間歇間隔的乘法。爲避免競爭條件(例如,在10秒鐘內發出三次5秒總和),批次間隔必須大於計算時間。我假設這裏的批處理間隔爲1000ms。

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降低了:窗口長度B的A的/ slideInterval =輸入的元組的數目對於B

  1. 每隔5秒A總結5個元組。
  2. 每5秒B基於(3 * 5 =)15個原始元組總結A​​的最後(15/5 =)3個結果。
  3. 每隔30秒C基於(6 * 3 * 5 =)原始元組總和B的最後(30/5 =)6結果!因爲B的窗口間隔大於其滑動間隔,所以元組將被多次相加。
  4. 映射程序糾正計算錯誤。

修正步驟

我假設你的實際應用並不像一個單詞計數一樣簡單。你需要一個反函數來修復之後的重複錯誤。你也可以嘗試在C之前解決這個問題(在字數統計的例子中可能會提前分割)。另一種解決方案是跟蹤已經處理的元組,並只聚合分離的元組。這取決於你的用例。

+0

根據你提到的限制,我不明白爲什麼不可能每5秒發出15s計數(而每15s發出30s計數)。你能澄清一下嗎? – Arthur 2014-11-26 08:15:13

+0

@jules:你的問題不清楚你想要發射多少次。下班後我會更新我的答案。 – 2014-11-26 08:19:54

+0

@jules:我更新了我的答案,我希望它有幫助。 – 2014-11-26 18:08:23