DataStream与DataSet

Posted 浅然言而信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataStream与DataSet相关的知识,希望对你有一定的参考价值。

DataStream与DataSet

Flink具有特殊类DataStream与DataSet,这两者是flink中主要的数据源,根据数据源可分为有界源和无界源,而DataStream则是无界源,DataSet是有界源,也就是说DataStream常用于流处理,而DataSet用于批处理。


DataStream API

  • DataStream Sources(数据来源)
  • DataStream Transformations(数据转化)
  • DataStream Sinks(数据的目的地)

DataStream Sources(数据来源)

大多实际应用环境都以自定义数据源为主,常常从kafka中读取数据,flink官方也有专门的kafka连接器提供

  • 基于文件
  • 基于Socket
  • 基于集合
  • 自定义

DataStream Transformations(数据转化)

官方提供许多处理的方法

  • map:输入一个数据,返回一个数据,中间可做相关处理
DataStream<Integer> dataStream = //...
dataStream.map(new MapFunction<Integer, Integer>() 
    @Override
    public Integer map(Integer value) throws Exception 
        return 2 * value;
    
);
  • flatmap:输入一个数据,返回零个、一个、多个数据,中间可做相关处理
dataStream.flatMap(new FlatMapFunction<String, String>() 
    @Override
    public void flatMap(String value, Collector<String> out)
        throws Exception 
        for(String word: value.split(" "))
            out.collect(word);
        
    
);
  • filter:对数据进行过滤
dataStream.filter(new FilterFunction<Integer>() 
    @Override
    public boolean filter(Integer value) throws Exception 
        return value != 0;
    
);
  • keyBy:根据指定的key进行分区

注意:以下类型无法作为key

1、即使它是pojo类型,但不覆盖hashcode方法并依赖于Object.hashcode()方法

2、它是任何类型的数组

dataStream.keyBy("someKey") // Key by field "someKey"
dataStream.keyBy(0) // Key by the first element of a Tuple(指定tuple中的第一个元素作为分组key)

等等具体可查阅官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/stream/operators/index.html

DataStream Sinks(数据的目的地)

Sink将处理后的数据转发到文件、sockets、外部系统(如kafka、redis)、print()打印,flink有许多已经封装好的内置方法。在实际应用中经常使用addSink自定义将数据输出到外部系统

  • writeAsText():按字符串顺序写入,这些字符串通过调用每个元素的toString()方法来获取
  • writeAsCsv(…):将元组写为逗号分隔值文件。行和字段分隔符是可配置的
  • print()/printToErr(): 打印每个元素的toString()方法
  • writeUsingOutputFormat():自定义文件输出的方法和基类,支持自定义对象到字节的转换。
  • writeToSocket:根据SerializationSchema写入元素到socket
  • addSink:自定义输出,如kafka、redis

注意:write*()方法主要是用于调试的目的,它们并没有参与flink的checkpoint,这就意味着这些函数是at-least-once(至少一次)的语义,通过addSink()方法的自定义可以实现flink的exactly-once(精确一次)(可靠)的语义

以上是关于DataStream与DataSet的主要内容,如果未能解决你的问题,请参考以下文章

95-910-140-源码-FlinkSQL-FlinkSQL简介

4.Flink入门案例前置说明准备环境代码实现-DataSet-了解DataStream--匿名内部类--处理批DataStream-匿名内部类-处理流LambdaOn-Yarn-掌握

大数据开发-Flink-数据流DataStream和DataSet

大数据开发-Flink-数据流DataStream和DataSet

我可以在同一个 Flink 作业中使用 DataSet API 和 DataStream API 吗?

Flink:在DataStream API的批处理模式下左连接相当于Dataset API?