Flink基础(十):Flink常用的Source和Sink

通过前面我们可以知道 Flink Job 的大致结构就是 Source ——> Transformation ——> Sink
那么这个 Source 是什么意思呢?

Data Source 介绍

Data Source 是什么呢?就字面意思其实就可以知道:数据来源。
Flink 中你可以使用 StreamExecutionEnvironment.addSource(sourceFunction) 来为你的程序添加数据来源。
Flink 已经提供了若干实现好了的 source function,当然你也可以通过实现 SourceFunction 来自定义非并行的 source 或者实现 ParallelSourceFunction 接口或者扩展 RichParallelSourceFunction 来自定义并行的 source。
基于集合:

  • fromCollection(Collection) - 从 Java 的 Java.util.Collection 创建数据流。集合中的所有元素类型必须相同。
  • fromCollection(Iterator, Class) - 从一个迭代器中创建数据流。Class 指定了该迭代器返回元素的类型。
  • fromElements(T …) - 从给定的对象序列中创建数据流。所有对象类型必须相同。
  • fromParallelCollection(SplittableIterator, Class) - 从一个迭代器中创建并行数据流。Class 指定了该迭代器返回元素的类型。
  • generateSequence(from, to) - 创建一个生成指定区间范围内的数字序列的并行数据流。

基于文件:

  • readTextFile(path) - 读取文本文件,即符合 TextInputFormat 规范的文件,并将其作为字符串返回。
    final StreamExecutionEnvironment env = 	StreamExecutionEnvironment.getExecutionEnvironment();
    DataStream<String> text = env.readTextFile("file:///path/to/file");
    
  • readFile(fileInputFormat, path) - 根据指定的文件输入格式读取文件(一次)。

基于 Socket:

  • socketTextStream(String hostname, int port) - 从 socket 读取。元素可以用分隔符切分。
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    DataStream<Tuple2<String, Integer>> dataStream = env
            .socketTextStream("localhost", 9999) // 监听 localhost 的 9999 端口过来的数据
            .flatMap(new Splitter())
            .keyBy(0)
            .timeWindow(Time.seconds(5))
            .sum(1);
    

自定义:

  • addSource - 添加一个新的 source function。例如,你可以用 addSource(new FlinkKafkaConsumer011<>(…)) 从 Apache Kafka 读取数据。

说说上面几种的特点

  1. 基于集合:有界数据集,更偏向于本地测试用
  2. 基于文件:适合监听文件修改并读取其内容
  3. 基于 Socket:监听主机的 host port,从 Socket 中获取数据
  4. 自定义 addSource:大多数的场景数据都是无界的,会源源不断过来。比如去消费 Kafka 某个 topic 上的数据,这时候就需要用到这个 addSource,可能因为用的比较多的原因吧,Flink 直接提供了 FlinkKafkaConsumer010 等类可供你直接使用。你可以去看看 FlinkKafkaConsumerBase 这个基础类,它是 Flink Kafka 消费的最根本的类。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<KafkaEvent> input = env
        .addSource(
            new FlinkKafkaConsumer010<>(
                parameterTool.getRequired("input-topic"), //从参数中获取传进来的 topic 
                new KafkaEventSchema(),
                parameterTool.getProperties())
            .assignTimestampsAndWatermarks(new CustomWatermarkExtractor()));

Flink 目前支持如下面常见的 Source:
在这里插入图片描述

Data Sink 介绍

Data sink 有点把数据存储下来(落库)的意思。Flink 在拿到数据后做一系列的计算后,最后要将计算的结果往下游发送。比如将数据存储到 MySQL、ElasticSearch、Cassandra,或者继续发往 Kafka、 RabbitMQ 等消息队列,更或者直接调用其他的第三方应用服务(比如告警)。
常用的 Data Sink:
在这里插入图片描述
还有 Kafka、ElasticSearch、Socket、RabbitMQ、JDBC、Cassandra POJO、File、Print 等 Sink 的方式。

具体的Source和Sink会在后面详细讲…

发布了20 篇原创文章 · 获赞 9 · 访问量 551

猜你喜欢

转载自blog.csdn.net/weixin_42155491/article/details/105280877