Flink 原始碼解析--Stream、Job、ExecutionGraph的生成示例
應用程式示例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<String, Integer>).
*/
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及其相關結構。
相關文章
- [原始碼解析] 當 Java Stream 遇見 Flink原始碼Java
- Flink kafka source & sink 原始碼解析Kafka原始碼
- spark核心(下)——job任務提交原始碼解析Spark原始碼
- LinkedList 基本示例及原始碼解析原始碼
- job提交的原始碼分析原始碼
- [原始碼解析] Flink UDAF 背後做了什麼原始碼
- [原始碼解析] Flink的Slot究竟是什麼?(1)原始碼
- [原始碼解析] 從TimeoutException看Flink的心跳機制原始碼Exception
- [原始碼解析] Flink的groupBy和reduce究竟做了什麼原始碼
- [原始碼解析] Flink的Slot究竟是什麼?(2)原始碼
- Python程式碼解析: job = next(job for job in jobs if job.job_id == job_id)Python
- 解析arrify 轉陣列實現示例原始碼陣列原始碼
- [原始碼解析] GroupReduce,GroupCombine 和 Flink SQL group by原始碼SQL
- 一個自動生成oracle job的指令碼Oracle指令碼
- flink CEP示例
- Spark job分配流程原始碼分析Spark原始碼
- 【長文剖析】Spring Cloud OAuth 生成Token 原始碼解析SpringCloudOAuth原始碼
- await 錯誤捕獲實現方式原始碼示例解析AI原始碼
- Eta中的Apache Flink示例Apache
- 《Flink SQL任務自動生成與提交》後續:修改flink原始碼實現kafka connector BatchModeSQL原始碼KafkaBAT
- Mapreduce Job提交流程原始碼和切片原始碼詳解原始碼
- flink stream轉table POJO物件遇到的坑POJO物件
- stream pipe的原理及簡化原始碼分析原始碼
- redux的原始碼解析Redux原始碼
- Flink提交Job的方式以及引數設定
- elastic-job 原始碼解讀之從原始碼看null值AST原始碼Null
- 使用DBMS_JOB和DBMS_SCHEDULER建立、管理job示例
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- [原始碼解析]深度學習利器之自動微分(3) --- 示例解讀原始碼深度學習
- 在Vue中使用marked.js解析Markdown,生成目錄,執行程式碼示例VueJS行程
- Graphx 原始碼剖析-圖的生成原始碼
- Flink的Job manager中包含了哪三個元件元件
- NodeJS stream 流 原理分析(附原始碼)NodeJS原始碼
- Android 原始碼分析之 EventBus 的原始碼解析Android原始碼
- 設計模式系列(圖文解析,附帶原始碼) - 生成器設計模式原始碼
- Spark原始碼-SparkContext原始碼解析Spark原始碼Context
- Maven生成原始碼包Maven原始碼
- CountDownLatch原始碼解析CountDownLatch原始碼