0%

Flink 批处理API

Flink 中提供了 4 种不同层次的 API:

  1. 低级 API:提供了对时间和状态的细粒度控制,简洁性和易用性较差,主要应用在对一些复杂事件的处理逻辑上。
  2. 核心 API:主要提供了针对流数据和离线数据的处理,对低级 API 进行了一些封装,提供了 filter、sum、max、min 等高级函数,简单且易用,所以在工作中应用比较广泛。
  3. Table API:一般与 DataSet 或者 DataStream 紧密关联,首先通过一个 DataSet 或 DataStream 创建出一个 Table;然后用类似于 filter、join 或者 select 关系型转化操作来转化为一个新的 Table 对象;最后将一个 Table 对象转回一个 DataSet 或 DataStream。与 SQL 不同的是,Table API 的查询不是一个指定的 SQL 字符串,而是调用指定的 API 方法。
  4. 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

连接

连接分为内连接和外连接,外链接又分为左外连接、右外连接和全外连接。

内连接

  1. join 函数
  2. JoinFunction
  3. FlatJoinFunction

笛卡尔积

  1. cross 函数:两个集合 X 和 Y 的笛卡儿积,又称直积,表示为 X×Y。

拼接

  1. union 函数:将多个相同类型的数据集拼接在一起

分区

另外,Flink 针对 DataSet 提供了一些数据分区规则,具体如下。

分区规则 规则名称 调用方式
Rebalance 对数据集进行再平衡、重分区和消除数据倾斜 DataSet.rebalance()
Hash-Partition 根据指定Key的散列值对数据集进行分区 DataSet.partitionByHash()
Range-Partition 根据指定的 Key 对数据集进行范围分区 DataSet.partitionByRange()
Custom partitioning 自定义分区 DataSet.partitionCustom()

Sink

Sink 是程序的输出,它可以把 Transformation 处理之后的数据输出到指定的存储介质中。

原理