Flink分別提供了面向流式處理的接口(DataStream API)和麪向批處理的接口(DataSet API,因此,Flink既可以完成流處理,也可以完成批處理。
每個Flink程序都包含以下的若干流程:
-
獲得一個執行環境;(Execution Environment)
-
加載/創建初始數據;(Source)
-
指定轉換這些數據;(Transformation)
-
指定放置計算結果的位置;(Sink)
-
觸發程序執行
下面從學習Flink DataSet Java API的單詞詞頻統計代碼實例開始Flink的學習之旅。
public class BatchWordCountDemo {
public static void main(String[] args) throws Exception {
//1.獲取一個執行環境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//2.讀取輸入數據
DataSet<String> ds = env.fromElements("hello flink","hello spark");
//3.單詞的詞頻統計
DataSet<Tuple2<String, Integer>> sum = ds.flatMap(new LineSplitter())
.groupBy(0)
.sum(1);
//4 打印結果
sum.print();
}
public static final class LineSplitter implements FlatMapFunction<String, Tuple2<String,Integer>>{
@Override
public void flatMap(String line, Collector<Tuple2<String, Integer>> out) throws Exception {
for(String word:line.split(" ")){
out.collect(new Tuple2<>(word,1));
}
}
}
}
上面代碼實例中註釋1表示創建一個執行環境,表示當前執行程序的上下文。 如果程序是獨立調用的,則此方法返回本地執行環境;如果從命令行客戶端調用程序以提交到集羣,則此方法返回此集羣的執行環境,也就是說,getExecutionEnvironment會根據查詢運行的方式決定返回什麼樣的運行環境,是最常用的一種創建執行環境的方式。
打印結果: