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？统计经过某红绿灯的汽车数量之和？ 假设在一个红绿灯处，统...

推荐阅读
Flink 中的三种Window Flink 概述 Flink 编程模型 Flink Flink 时间语义 Flink实时处理Socket数据

留言区

Notes
Flink
本文目录
Are You A Robot?