Apache Flink - Conceptos de API

Flink tiene un amplio conjunto de API con las que los desarrolladores pueden realizar transformaciones tanto en datos por lotes como en tiempo real. Una variedad de transformaciones incluye mapeo, filtrado, clasificación, unión, agrupación y agregación. Estas transformaciones de Apache Flink se realizan en datos distribuidos. Analicemos las diferentes API que ofrece Apache Flink.

API de conjunto de datos

La API de conjunto de datos en Apache Flink se utiliza para realizar operaciones por lotes en los datos durante un período. Esta API se puede utilizar en Java, Scala y Python. Puede aplicar diferentes tipos de transformaciones en los conjuntos de datos como filtrar, mapear, agregar, unir y agrupar.

Los conjuntos de datos se crean a partir de fuentes como archivos locales o mediante la lectura de un archivo de una fuente en particular y los datos de resultado se pueden escribir en diferentes sumideros, como archivos distribuidos o terminales de línea de comandos. Esta API es compatible con los lenguajes de programación Java y Scala.

Aquí hay un programa Wordcount de Dataset API:

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

API de DataStream

Esta API se utiliza para manejar datos en flujo continuo. Puede realizar varias operaciones como filtrado, mapeo, creación de ventanas, agregación en los datos del flujo. Hay varias fuentes en este flujo de datos como colas de mensajes, archivos, flujos de sockets y los datos de resultado se pueden escribir en diferentes sumideros como el terminal de línea de comandos. Los lenguajes de programación Java y Scala admiten esta API.

Aquí hay un programa Wordcount de flujo continuo de la API DataStream, donde tiene un flujo continuo de recuentos de palabras y los datos se agrupan en la segunda ventana.

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