• 【翻译】了解Flink-对DataStream API的介绍 -- Learn Flink-Intro to the DataStream API



    翻译来源 Learn Flink:Intro to the DataStream API

    本手册的重点是充分地全面介绍DataStream API,使您能够开始编写流应用程序。

    流式可以传输什么?

    Flink的Java和Scala的DataStream API将让您用流传输可以序列化的任何内容。Flink自己的序列化器用于:

    • 基本类型,String, Long, Integer, Boolean, Array
    • 复合类型:Tuples, POJOs, and Scala case classes

    并且Flink回退到Kryo进行其他类型的序列化。也可以将其他序列化器与Flink一起使用。特别是Avro得到了很好的支持。

    Java元组和POJO

    元组原文tuples。
    Flink的本机序列化程序可以在元组和POJO上高效运行。

    元组

    对于Java,Flink定义了自己的Tuple0到Tuple25类型。

    Tuple2<String, Integer> person = Tuple2.of("Fred", 35);
    
    // zero based index!  
    String name = person.f0;
    Integer age = person.f1;
    

    POJO

    如果满足以下条件,则Flink将数据类型识别为POJO类型(并允许“按名称”字段引用):

    • 该类是公共的和单独的(没有非静态内部类)
    • 该类具有公共的无参数构造函数
    • 类(包括所有超类)中的所有非静态,非瞬态字段都是公共的(并且是non-final),或者具有公共的getter和setter方法,这些方法遵循针对getter和setter的Java bean命名约定。
      例子:
    public class Person {
        public String name;  
        public Integer age;  
        public Person() {};  
        public Person(String name, Integer age) {  
            . . .
        };  
    }  
    
    Person person = new Person("Fred Flintstone", 35);
    

    Flink的序列化器支持POJO类型的模式演变

    Scala元组和case classes

    这块不做介绍

    一个完整的例子

    本示例将有关人的记录流作为输入,并对其进行过滤以仅包括成年人。

    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    import org.apache.flink.streaming.api.datastream.DataStream;
    import org.apache.flink.api.common.functions.FilterFunction;
    
    public class Example {
    
        public static void main(String[] args) throws Exception {
            final StreamExecutionEnvironment env =
                    StreamExecutionEnvironment.getExecutionEnvironment();
    
            DataStream<Person> flintstones = env.fromElements(
                    new Person("Fred", 35),
                    new Person("Wilma", 35),
                    new Person("Pebbles", 2));
    
            DataStream<Person> adults = flintstones.filter(new FilterFunction<Person>() {
                @Override
                public boolean filter(Person person) throws Exception {
                    return person.age >= 18;
                }
            });
    
            adults.print();
    
            env.execute();
        }
    
        public static class Person {
            public String name;
            public Integer age;
            public Person() {};
    
            public Person(String name, Integer age) {
                this.name = name;
                this.age = age;
            };
    
            public String toString() {
                return this.name.toString() + ": age " + this.age.toString();
            };
        }
    }
    

    流执行环境

    每个Flink应用程序都需要一个执行环境,示例中的env。流应用程序需要使用StreamExecutionEnvironment。

    应用程序中进行的DataStream API调用会组成构建一个作业图,该作业图已附加到 StreamExecutionEnvironment。调用env.execute(),作业图被打包,然后发送到JobManager,JobManager并行作业并且分配图片段给Task Managers执行。作业的每个并行切片都会在一个task slot中执行。

    请注意,如果您不调用execute(),则您的应用程序将不会运行。

    此分布式运行时要求应用程序可以被序列化。它还要求对于群集中的每个节点所有依赖的东西均可用。

    基本的stream sources

    上面的示例用 env.fromElements(...)构造了一个DataStream。这是一种将简单的流放在一起以用于样例或测试的便捷方法。StreamExecutionEnvironment还有一种 fromCollection(Collection)方法。因此,您可以这样做:

    List<Person> people = new ArrayList<Person>();
    
    people.add(new Person("Fred", 35));
    people.add(new Person("Wilma", 35));
    people.add(new Person("Pebbles", 2));
    
    DataStream<Person> flintstones = env.fromCollection(people);
    

    在使用样例时,另一种便捷方法是从套接字将一些数据放入流中。

    DataStream<String> lines = env.socketTextStream("localhost", 9999)
    

    或一个文件

    DataStream<String> lines = env.readTextFile("file:///path");
    

    在实际应用程序中,最常用的数据源是那些支持低延迟、高吞吐量、并行读取以及回退和重放(高性能和容错能力的先决条件)的数据源,例如Apache Kafka,Kinesis和各种文件系统。REST API和数据库也经常用于流。

    基本的stream sinks

    上面的示例用adults.print()将其结果打印到任务管理器日志中(当在IDE中运行时,它将显示在IDE的控制台中)。这将对流的每个元素调用toString()。

    输出看起来像这样

    1> Fred: age 35
    2> Wilma: age 35

    其中1>和2>指示哪个子任务(即线程)产生了输出。

    在生产中,常用的接收器包括StreamingFileSink,各种数据库和几个发布-订阅系统。

    调试

    在生产中,您的应用程序将在远程集群或一组容器中运行。程序失败也是远程失败。JobManager和TaskManager日志对于调试此类故障非常有用,但是Flink支持的IDE内进行本地调试要容易得多。您可以设置断点,检查局部变量,并逐步执行代码。您也可以进入Flink的代码,如果您想了解Flink的工作原理,这可能是了解其内部的一种好方法。

    上手

    至此,您已经足够了解如何开始编码和运行一个简单的DataStream应用程序了。克隆flink-training仓库,然后按照README中的说明进行第一个练习: 过滤一个流(Ride Cleansing)

    进一步阅读

  • 相关阅读:
    MySQL数据库详解(二)执行SQL更新时,其底层经历了哪些操作?
    MySQL数据库详解(一)执行SQL查询语句时,其底层到底经历了什么?
    网页静态化解决方案Freemarker
    好久没来看看了~
    springmvc(五) 数据回显与自定义异常处理器
    springmvc(四) springmvc的数据校验的实现
    springmvc(三) 参数绑定、
    springmvc(二) ssm框架整合的各种配置
    springmvc(一) springmvc框架原理分析和简单入门程序
    cursor:pointer 什么意思?
  • 原文地址:https://www.cnblogs.com/qlxm/p/flink-docs-release-1_12_learn-flink_datastream_api.html
Copyright © 2020-2023  润新知