簡體   English   中英

flink SourceFunction <>在StreamExecutionEnvironment.addSource()中被替換了嗎?

[英]flink SourceFunction<> is being replaced in StreamExecutionEnvironment.addSource()?

當我嘗試創建事件的自定義源時遇到了這個問題。 其中包含一個隊列,該隊列允許我的其他進程向其中添加項目。 然后期望我的CEP模式在存在匹配項時打印一些調試消息。

但是無論我添加到隊列中都沒有匹配項。 然后我注意到mySource.run()中的隊列始終為空。 這意味着我用來創建mySource實例的隊列與StreamExecutionEnvironment中的隊列StreamExecutionEnvironment 如果我將隊列更改為靜態隊列,則強制所有實例共享同一隊列,那么一切都會按預期進行。

DummySource.java

    public class DummySource implements SourceFunction<String> {

    private static final long serialVersionUID = 3978123556403297086L;
//  private static Queue<String> queue = new LinkedBlockingQueue<String>();
    private Queue<String> queue;
    private boolean cancel = false;

    public void setQueue(Queue<String> q){
        queue = q;
    }   

    @Override
    public void run(org.apache.flink.streaming.api.functions.source.SourceFunction.SourceContext<String> ctx)
            throws Exception {
        System.out.println("run");
        synchronized (queue) {          
            while (!cancel) {
                if (queue.peek() != null) {
                    String e = queue.poll();
                    if (e.equals("exit")) {
                        cancel();
                    }
                    System.out.println("collect "+e);
                    ctx.collectWithTimestamp(e, System.currentTimeMillis());
                }
            }
        }
    }

    @Override
    public void cancel() {
        System.out.println("canceled");
        cancel = true;
    }
}

因此,我研究了StreamExecutionEnvironment的源代碼。 在addSource()方法內部。 有一個clean()方法看起來像它將實例替換為新實例。

返回給定函數的“關閉清除”版本。

這是為什么? 以及為什么需要序列化? 我也嘗試使用getConfig()關閉干凈的關閉。 結果仍然相同。 我的隊列實例與env正在使用的實例不同。

我該如何解決這個問題?

Flink中的函數上使用的clean()方法主要是為了確保Function (例如SourceFunction,MapFunction)可序列化。 Flink將序列化這些功能並將其分配到任務節點上以執行它們。

對於Flink主代碼中的簡單變量,例如int,您可以在函數中簡單地引用它們。 但是對於大型或不可序列化的服務器,最好使用廣播和豐富的源功能。 請參閱https://cwiki.apache.org/confluence/display/FLINK/Variables+Closures+vs.+Broadcast+Variables

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM