Flink 中提供了 4 种不同层次的 API:
- 低级 API:提供了对时间和状态的细粒度控制,简洁性和易用性较差,主要应用在对一些复杂事件的处理逻辑上。
- 核心 API:主要提供了针对流数据和离线数据的处理,对低级 API 进行了一些封装,提供了 filter、sum、max、min 等高级函数,简单且易用,所以在工作中应用比较广泛。
- Table API:一般与 DataSet 或者 DataStream 紧密关联,首先通过一个 DataSet 或 DataStream 创建出一个 Table;然后用类似于 filter、join 或者 select 关系型转化操作来转化为一个新的 Table 对象;最后将一个 Table 对象转回一个 DataSet 或 DataStream。与 SQL 不同的是,Table API 的查询不是一个指定的 SQL 字符串,而是调用指定的 API 方法。
- SQL API:Flink 的 SQL 集成是基于 Apache Calcite 的,Apache Calcite 实现了标准的 SQL,使用起来比其他 API 更加灵活,因为可以直接使用 SQL 语句。Table API 和 SQL 可以很容易地结合在一块使用,它们都返回 Table 对象。
概念
DataSet API 主要分为3块:DataSource、Transformation、Sink。
DataSource
DataSource 是程序的数据源输入。
Transformation
Transformation 是具体的操作,它对一个或多个输入数据源进行计算处理。
Flink 针对 DataSet 实现了以下算子:
算子 | 功能 |
---|---|
Map | 做一对一映射,可变更类型 |
FlatMap | 做一对多映射,可变更类型 |
MapPartition | Map 和 FlatMap 转换的对象是元素,而 MapPartition 转换的是 DataSet 的分区 |
Filter | 过滤出条件为 true 的元素 |
SortPartition | 指定分区排序次序 |
Reduce | 根据多个元素生成一个元素。算子内部会保存上一次 Reduce 的中间结果,然后将当前元素值和上一次 Reduce 的中间结果相加,并用相加结果更新中间结果 |
GroupReduce | 与Reduce不同的是,GroupReduce可以获取整个分组,通过迭代器访问分组的所有元素 |
Aggregations | 聚合 |
Union | 将多个数据集合合并成一个数据集合 |
Distinct | 根据转换结果去重 |
Join | 内连接 |
OuterJoin | |
Cross | |
Union | |
First-n |
连接
连接分为内连接和外连接,外链接又分为左外连接、右外连接和全外连接。
内连接
- join 函数
- JoinFunction
- FlatJoinFunction
笛卡尔积
- cross 函数:两个集合 X 和 Y 的笛卡儿积,又称直积,表示为 X×Y。
拼接
- union 函数:将多个相同类型的数据集拼接在一起
分区
另外,Flink 针对 DataSet 提供了一些数据分区规则,具体如下。
分区规则 | 规则名称 | 调用方式 |
---|---|---|
Rebalance | 对数据集进行再平衡、重分区和消除数据倾斜 | DataSet.rebalance() |
Hash-Partition | 根据指定Key的散列值对数据集进行分区 | DataSet.partitionByHash() |
Range-Partition | 根据指定的 Key 对数据集进行范围分区 | DataSet.partitionByRange() |
Custom partitioning | 自定义分区 | DataSet.partitionCustom() |
Sink
Sink 是程序的输出,它可以把 Transformation 处理之后的数据输出到指定的存储介质中。