Flink 原始碼解析--Stream、Job、ExecutionGraph的生成示例

午後的紅茶meton發表於2020-09-27

應用程式示例2:

public class SocketTextStreamWordCount {
    
    public static void main(String[] args) throws Exception {
        if (args.length != 2){
            System.err.println("USAGE:\nSocketTextStreamWordCount <hostname> <port>");
            return;
        }
        String hostName = args[0];
        Integer port = Integer.parseInt(args[1]);
        // set up the execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // get input data
        DataStream<String> text = env.socketTextStream(hostName, port).setParallelism(1);
        
        text.flatMap(new LineSplitter()).setParallelism(2)     // group by the tuple field "0" and sum up tuple field "1"
                .keyBy(0)
                .sum(1).setParallelism(2)
                .print();
                
        env.execute("Java WordCount from SocketTextStream Example");
    }
    
    /**
     * Implements the string tokenizer that splits sentences into words as a user-defined
     * FlatMapFunction. The function takes a line (String) and splits it into
     * multiple pairs in the form of "(word,1)" (Tuple2&lt;String, Integer&gt;).
     */
    public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
            // normalize and split the line
            String[] tokens = value.toLowerCase().split("\\W+");
            // emit the pairs
            for (String token : tokens) {
                if (token.length() > 0) {
                    out.collect(new Tuple2<String, Integer>(token, 1));
                }
            }
        }
    }
}

其轉化分析如下:

       上面這張圖清晰的給出了flink各個圖的工作原理和轉換過程。其中最後一個物理執行圖並非flink的資料結構,而是程式開始執行後,各個task分佈在不同的節點上,所形成的物理上的關係表示。

  • 從JobGraph的圖裡可以看到,資料從上一個operator流到下一個operator的過程中,上游作為生產者提供了IntermediateDataSet,而下游作為消費者需要JobEdge。事實上,JobEdge是一個通訊管道,連線了上游生產的dataset和下游的JobVertex節點。
  • 在JobGraph轉換到ExecutionGraph的過程中,主要發生了以下轉變:
    • 加入了並行度的概念,成為真正可排程的圖結構
    • 生成了與JobVertex對應的ExecutionJobVertex,ExecutionVertex,與IntermediateDataSet對應的IntermediateResult和IntermediateResultPartition等,並行將通過這些類實現
  • ExecutionGraph已經可以用於排程任務。可以看到flink根據該圖生成了一一對應的Task,每個task對應一個ExecutionGraph的一個Execution。Task用InputGate、InputChannel和ResultPartition對應了上面圖中的IntermediateResult和ExecutionEdge。

        其中StreamGraph是對使用者邏輯的對映。JobGraph在此基礎上進行了一些優化,比如把一部分操作串成chain以提高效率。ExecutionGraph是為了排程存在的,加入了並行處理的概念。而在此基礎上真正執行的是Task及其相關結構。

 

相關文章