2015-12-08 19 views
9

मैं घटना समय खिड़की के आसपास अर्थशास्त्र को समझने में कुछ परेशानियों में भाग रहा हूं। निम्न कार्यक्रम टाइमस्टैम्प के साथ कुछ tuples उत्पन्न करता है जो घटना समय के रूप में उपयोग किया जाता है और एक साधारण खिड़की एकत्रीकरण करता है। मैं उम्मीद करता हूं कि इनपुट इनपुट के समान क्रम में हो, लेकिन उत्पादन को अलग-अलग आदेश दिया गया है। ईवेंट के समय के संबंध में आउटपुट आउटपुट क्यों है?फ्लिंक स्ट्रीमिंग ईवेंट टाइम विंडो ऑर्डरिंग

import java.util.concurrent.TimeUnit 
import org.apache.flink.streaming.api.TimeCharacteristic 
import org.apache.flink.streaming.api.windowing.time.Time 
import org.apache.flink.streaming.api.scala._ 

object WindowExample extends App { 
    val env = StreamExecutionEnvironment.getExecutionEnvironment 
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) 
    env.getConfig.enableTimestamps() 
    env.setParallelism(1) 

    val start = 1449597577379L 
    val tuples = (1 to 10).map(t => (start + t * 1000, t)) 

    env.fromCollection(tuples) 
     .assignAscendingTimestamps(_._1) 
     .timeWindowAll(Time.of(1, TimeUnit.SECONDS)) 
     .sum(1) 
     .print() 

    env.execute() 
} 

इनपुट:

(1449597578379,1) 
(1449597579379,2) 
(1449597580379,3) 
(1449597581379,4) 
(1449597582379,5) 
(1449597583379,6) 
(1449597584379,7) 
(1449597585379,8) 
(1449597586379,9) 
(1449597587379,10) 

परिणाम:

[info] (1449597579379,2) 
[info] (1449597581379,4) 
[info] (1449597583379,6) 
[info] (1449597585379,8) 
[info] (1449597587379,10) 
[info] (1449597578379,1) 
[info] (1449597580379,3) 
[info] (1449597582379,5) 
[info] (1449597584379,7) 
[info] (1449597586379,9) 

उत्तर

10

इस व्यवहार के लिए कारण यह है कि Flink में तत्वों (टाइमस्टैम्प के संबंध में) के आदेश पर ध्यान नहीं दिया जाता है लेखा। केवल वॉटरमार्क की शुद्धता और तत्वों के टाइमस्टैम्प से उनके संबंध उन परिचालनों के लिए महत्वपूर्ण हैं जो समय पर विचार करते हैं क्योंकि वॉटरमार्क आम तौर पर समय-आधारित संचालन में गणना को ट्रिगर करते हैं।

आपके उदाहरण में, विंडो ऑपरेटर आंतरिक विंडो बफर में स्रोत से सभी तत्वों को संग्रहीत करता है। फिर, स्रोत एक वॉटरमार्क उत्सर्जित करता है जो कहता है कि भविष्य में एक छोटे टाइमस्टैम्प वाला कोई तत्व नहीं पहुंच जाएगा। यह बदले में, विंडो ऑपरेटर को वॉटरमार्क के नीचे वाले एंड-टाइमस्टैम्प वाले सभी विंडोज़ को संसाधित करने के लिए कहता है (जो सभी विंडोज़ के लिए सच है)। इस प्रकार, यह सभी खिड़कियों (मनमाने ढंग से आदेश के साथ) उत्सर्जित करता है और इसके बाद यह वॉटरमार्क को उत्सर्जित करता है। इससे नीचे की ओर से संचालन तत्वों को प्राप्त करेंगे और वे वॉटरमार्क प्राप्त करने के बाद प्रसंस्करण कर सकते हैं।

डिफ़ॉल्ट रूप से, अंतराल पर स्रोतों से वॉटरमार्क उत्सर्जित होते हैं 200 मीटर। आपके स्रोत को उत्सर्जित करने वाले तत्वों की छोटी मात्रा के साथ पहले वॉटरमार्क उत्सर्जित होने से पहले उत्सर्जित होते हैं। वास्तविक दुनिया के उपयोग के मामले में, जहां वॉटरमार्क उत्सर्जन अंतराल तब खिड़की के आकार की तुलना में बहुत छोटा होता है, आपको अपने टाइमस्टैम्प के क्रम में खिड़कियों के उत्सर्जित होने का अपेक्षित व्यवहार मिल जाएगा। उदाहरण के लिए, यदि आपके पास हर 500 एमएस में 1 घंटे की खिड़कियां और वॉटरमार्क हैं।

+1

क्या आप डाउनस्ट्रीम ऑपरेशन का उदाहरण दे सकते हैं या इंगित कर सकते हैं जो वॉटरमार्क प्राप्त करने के बाद ईवेंट के समय के आधार पर तत्वों को पुन: व्यवस्थित कर सकता है? धन्यवाद! –

+1

@ मैक्सिमकोल्चिन इस तरह की पुनरावृत्ति होती है उदा। सीईपी पुस्तकालय में। आप यहां एक नज़र डाल सकते हैं: https://github.com/apache/flink/blob/master/flink-libraries/flink-cep/src/main/java/org/apache/flink/cep/operator/AbstractKeyedCEPPatternOperator.java –

संबंधित मुद्दे