Apache Flink - API 概念



Flink 擁有豐富的 API,開發人員可以使用這些 API 對批處理和即時資料進行轉換。各種轉換包括對映、過濾、排序、連線、分組和聚合。Apache Flink 對分散式資料執行這些轉換。讓我們討論 Apache Flink 提供的不同 API。

Dataset API

Apache Flink 中的 Dataset API 用於對一段時間內的資料執行批處理操作。此 API 可用於 Java、Scala 和 Python。它可以對資料集應用各種轉換,例如過濾、對映、聚合、連線和分組。

資料集可以從本地檔案或從特定來源讀取檔案建立,結果資料可以寫入不同的接收器,例如分散式檔案或命令列終端。此 API 受 Java 和 Scala 程式語言的支援。

這是一個 Dataset API 的 Wordcount 程式:

public class WordCountProg {
   public static void main(String[] args) throws Exception {
      final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

      DataSet<String> text = env.fromElements(
      "Hello",
      "My Dataset API Flink Program");

      DataSet<Tuple2<String, Integer>> wordCounts = text
      .flatMap(new LineSplitter())
      .groupBy(0)
      .sum(1);

      wordCounts.print();
   }

   public static class LineSplitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
      @Override
      public void flatMap(String line, Collector<Tuple2<String, Integer>> out) {
         for (String word : line.split(" ")) {
            out.collect(new Tuple2<String, Integer>(word, 1));
         }
      }
   }
}

DataStream API

此 API 用於處理連續流資料。您可以對流資料執行各種操作,例如過濾、對映、視窗化、聚合。此資料流有各種來源,例如訊息佇列、檔案、套接字流,結果資料可以寫入不同的接收器,例如命令列終端。Java 和 Scala 程式語言都支援此 API。

這是一個 DataStream API 的流式 Wordcount 程式,其中您有連續的單詞計數流,資料在第二個視窗中分組。

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;
public class WindowWordCountProg {
   public static void main(String[] args) throws Exception {
      StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
      DataStream<Tuple2<String, Integer>> dataStream = env
      .socketTextStream("localhost", 9999)
      .flatMap(new Splitter())
      .keyBy(0)
      .timeWindow(Time.seconds(5))
      .sum(1);
      dataStream.print();
      env.execute("Streaming WordCount Example");
   }
   public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
      @Override
      public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
         for (String word: sentence.split(" ")) {
            out.collect(new Tuple2<String, Integer>(word, 1));
         }
      }
   }
}
廣告