Apache Flink - API Kavramları

Flink, geliştiricilerin hem toplu hem de gerçek zamanlı veriler üzerinde dönüşüm gerçekleştirebilecekleri zengin bir API kümesine sahiptir. Çeşitli dönüşümler arasında eşleme, filtreleme, sıralama, birleştirme, gruplama ve toplama yer alır. Apache Flink tarafından yapılan bu dönüşümler, dağıtılmış veriler üzerinde gerçekleştirilir. Apache Flink'in sunduğu farklı API'leri tartışalım.

Veri Kümesi API'si

Apache Flink'teki Veri Kümesi API'si, bir dönem boyunca veriler üzerinde toplu işlemler gerçekleştirmek için kullanılır. Bu API Java, Scala ve Python'da kullanılabilir. Filtreleme, haritalama, toplama, birleştirme ve gruplama gibi veri setlerine farklı türlerde dönüşümler uygulayabilir.

Veri kümeleri yerel dosyalar gibi kaynaklardan veya belirli bir kaynaktan bir dosya okunarak oluşturulur ve sonuç verileri, dağıtılmış dosyalar veya komut satırı terminali gibi farklı havuzlara yazılabilir. Bu API hem Java hem de Scala programlama dilleri tarafından desteklenmektedir.

İşte Veri Kümesi API'sinin bir Wordcount programı -

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

Bu API, sürekli akıştaki verileri işlemek için kullanılır. Akış verileri üzerinde filtreleme, eşleme, pencereleme, toplama gibi çeşitli işlemleri gerçekleştirebilirsiniz. Bu veri akışında mesaj kuyrukları, dosyalar, soket akışları gibi çeşitli kaynaklar vardır ve sonuç verileri komut satırı terminali gibi farklı havuzlara yazılabilir. Hem Java hem de Scala programlama dilleri bu API'yi destekler.

Burada, sürekli kelime sayımı akışına sahip olduğunuz ve verilerin ikinci pencerede gruplandırıldığı DataStream API'nin akışlı bir Wordcount programı bulunmaktadır.

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));
         }
      }
   }
}