DataSteam

270 阅读3分钟

定义

DataSteam是一个集合,包含了相同类型的可重复元素。一旦创建就不能再添加删除元素。

image.png

方法介绍

成员变量

protected final StreamExecutionEnvironment environment;
protected final Transformation<T> transformation;

DataSteam所有操作都围绕成员变量展开。

StreamExecutionEnvirment是一个任务的启动入口。Flink 程序可以在本地环境运行,也可以在集群环境下运行,不同的运算环境,提交的运行过程也不太一样,这就需要运行程序的时候需要获取上下文环境,从而建立起与flink框架的联系,只有获取到上下文环境信息才能将任务分配到不同的taskmanager上运行。

Transformation转换操作,本质上就是一种datastream变成另外一种datastream。每一次操作(map、flatmap等)都是在新建一个Transformation并将当前Transformation与下一个建立链接的关系。

Transformation中重要的变量

  • id
  • name
  • parallelism
  • outputType

source

DataStream通过StreamExecutionEnvironment.addResource(SourceFunction) 来添加数据源。

该方法传入一个对象参数,需要实现SourceFunction 接口,返回DataStreamSource

为了方便使用,Flink预提几类预定义的数据源,比如读取文件的Source、通过Sockt读取的Source、从内存中获取的Source等。

Transformation基本转换操作

map

可以理解为“一一映射”,消费一个元素产出一个元素。返回的其实是一个 SingleOutputStreamOperator,作用于一条数据流上,转化结果是一个确定的输出类型。(FlatMap一对多)

在实现 MapFunction接口的时候,需要指定两个泛型,分别是输入事件和输出事件的类型,还需要重写一个map()方法,定义从一个输入事件转换为另一个输出事件的具体逻辑。

DataStream<Integer> dataStream = //...
dataStream.map(new MapFunction<Integer, Integer>() {
    @Override
    public Integer map(Integer value) throws Exception {
        return 2 * value;
    }
});

keyby

DataStream → KeyedStream

keyby算子根据指定的key将输入的DataStream转换为KeyedStream(根据指定key进行分组的数据流,继承自DataStream)。在keyedStream上进行transformation后,该keyedStream都将转变回DataStream。

使用时需传递一个参数用于表明按照哪个字段进行归类。

注意 如果出现以下情况,则类型不能成为关键

  1. 它是POJO类型但不覆盖hashCode() 方法并依赖于Object.hashCode() 实现。
  2. 它是任何类型的数组。
dataStream.keyBy(value -> value.getSomeKey());
dataStream.keyBy(value -> value.f0);

reduce

KeyedStream → DataStream

将数据合并成一个新的数据,返回单个的结果值, reduce 操作每处理一个元素总是创建一个新值。

reduce方法不能直接应用于SingleOutputStreamOperator对象,因为这个对象是个无限的流,对无限的数据做合并,没有任何意义。

所以reduce需要针对分组或者一个window(窗口)来执行,也就是分别对应于keyBy、window/timeWindow 处理后的数据,根据ReduceFunction将元素与上一个reduce后的结果合并,产出合并之后的结果。

keyedStream.reduce(new ReduceFunction<Integer>() {
    @Override
    public Integer reduce(Integer value1, Integer value2)
    throws Exception {
        return value1 + value2;
    }
});

Window

KeyedStream → WindowedStream

dataStream
  .keyBy(value -> value.f0)
  .window(TumblingEventTimeWindows.of(Time.seconds(5)));

sink

  1. 负责实时计算结果的处理(如输出或持久化);
  2. 主要实现方式是调用DataStream.addSink方法;
  3. 各种sink能力的实现,主要途径是实现addSink方法的入参定义的接口;

execute

流处理中以上只是定义流程,并未执行,还需environment.execute();启动任务