简介: 在 Flink 1.12 中,针对目前 operator chaining 无法覆盖的场景,推出了 multiple input operator 与 source chaining 优化。该优化将消除 Flink 作业中大多数冗余 shuffle,进一步提高作业的执行效率。本文将以一个 SQL 作业为例介绍上述优化,并展示 Flink 1.12 在 TPC-DS 测试集上取得的成果。
执行效率的优化一直是 Flink 追寻的目标。在大多数作业,特别是批作业中,数据通过网络在 task 之间传递(称为数据 shuffle)的代价较大。正常情况下一条数据经过网络需要经过序列化、磁盘读写、socket 读写与反序列化等艰难险阻,才能从上游 task 传输到下游;而相同数据在内存中的传输,仅需要耗费几个 CPU 周期传输一个八字节指针即可。
Flink 在早期版本中已经通过 operator chaining 机制,将并发相同的相邻单输入算子整合进同一个 task 中,消除了单输入算子之间不必要的网络传输。然而,join 等多输入算子之间同样存在额外的数据 shuffle 问题,shuffle 数据量最大的 source 节点与多输入算子之间的数据传输也无法利用 operator chaining 机制进行优化。
在 Flink 1.12 中,我们针对目前 operator chaining 无法覆盖的场景,推出了 multiple input operator 与 source chaining 优化。该优化将消除 Flink 作业中大多数冗余 shuffle,进一步提高作业的执行效率。本文将以一个 SQL 作业为例介绍上述优化,并展示 Flink 1.12 在 TPC-DS 测试集上取得的成果。
优化案例解析:订单量统计
我们将以 TPC-DS q96 为例子详细介绍如何消除冗余 shuffle,该 SQL 意在通过多路 join 筛选并统计符合特定条件的订单量。
select count(*)
from store_sales
,household_demographics
,time_dim, store
where ss_sold_time_sk = time_dim.t_time_sk
and ss_hdemo_sk = household_demographics.hd_demo_sk
and ss_store_sk = s_store_sk
and time_dim.t_hour = 8
and time_dim.t_minute >= 30
and household_demographics.hd_dep_count = 5
and store.s_store_name = 'ese'