MHuiG

「看庭前花开花落,望天上云卷云舒」

Operator

# Flink 常用的算子

## Flink 数据处理模型

在 Flink 应用程序中，无论你的应用程序是批程序，还是流程序，都是下图这种模型，有数据源（`source`），有数据下游（`sink`）

### Source: 数据源

- 基于本地集合、基于文件、基于网络套接字
- 自定义的 `source`
- `Apache kafka`、`RabbitMQ`

### Transformation: 数据转换

- `Map` / `FlatMap` / `Filter` / `KeyBy` / `Reduce` / `Fold` / `Aggregations` / `Window` / `WindowAll` / `Union` / `Window join` / `Split` / `Select` / `Project`

### Sink: 接收器

- 写入文件、打印出来、写入 `Socket` 、自定义的 `Sink`
- 自定义的 `Sink`
- `Apache kafka`、`RabbitMQ`、`MySQL`、`ElasticSearch`、`Apache Cassandra`、`HDFS`

## Flink 算子 Operator

### Map

获取一个元素并生成一个元素

### FlatMap

获取一个元素并生成零个、一个或多个元素

### filter

### KeyBy

`KeyBy` 在逻辑上是基于 `key` 对流进行分区，相同的 `Key` 会被分到一个分区

### Aggregations

`DataStream API` 支持各种聚合， 这些函数可以应用于 `KeyedStream` 以获得 `Aggregations` 聚合

常用的方法有

- `min`、`minBy`、`max`、`minBy`、`sum`
- `max` 和 `maxBy` 之间的区别在于 `max` 返回流中的最大值，但 `maxBy` 返回具有最大值的键， `min` 和 `minBy` 同理

### Window

`Window` 函数允许按时间或其他条件对现有 `KeyedStream` 进行分组

`10` 秒的时间窗口的和（聚合）

    socketStream.keyBy(0).window(Time.seconds(10)).sum(1)

### Union

`Union` 函数将两个或多个数据流结合在一起，这样后面在使用的时候就只需使用一个数据流就行了

    inputStream.union(inputStream1, inputStream2, ...)

    val socketStream = env.socketTextStream("localhost", 9000, '\n')
    val textStream = env.readTextFile("/word.txt")
    socketStream.union(textStream)

### Window Join

通过一些 `key` 将同一个 `window` 的两个数据流 `join` 起来

    stream.join(otherStream)
        .where(<KeySelector>)
        .equalTo(<KeySelector>)
        .window(<WindowAssigner>)
        .apply(<JoinFunction>)

    inputStream.join(inputStream1)
               .where(0).equalTo(1)
               .window(Time.seconds(5))
               .apply (new JoinFunction () {...});

### Split

根据条件将流拆分为两个或多个流

### Select

从拆分流中选择特定流，那么就得搭配使用 `Select` 算子

通常搭配 `Split` 算子一起使用

Flink 中的三种Window

Window Flink 中的三种 Window Flink Window Demo 源码 GitHub 什么是 Window？统计经过某红绿灯的汽车数量之和？ 假设在一个红绿灯处，统...

留言区

Notes
Flink
本文目录
Are You A Robot?