Flink批处理优化器之Interesting Properties

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: Interesting Properties(以下简称IP)用来表述在对生成的计划进行分析时一些可能对优化产生重要影响的属性。网络上关于IP的资料并不多,但在Flink的论文里多次出现,Flink在它的一些论文中声明其借鉴自《Goetz Graefe.

Interesting Properties(以下简称IP)用来表述在对生成的计划进行分析时一些可能对优化产生重要影响的属性。网络上关于IP的资料并不多,但在Flink的论文里多次出现,Flink在它的一些论文中声明其借鉴自《Goetz Graefe. The Volcano Optimizer Generator- Extensibility and Efficient Search》(以下简称Volcano或Volcano的论文)和它的改进版《Goetz Graefe. The cascades framework for query optimization》(以下简称cascades或cascades的论文)中的优化技术。但是在另一些论文中声明其借鉴自《Pat Selinger, Access Path Selection in a Relational Database Management System》(以下简称System R的优化器论文)这一论文中的“Interesting Ordering”。其实,在这三篇论文中IP只在cascades的论文中出现过一次。

通过一些资料,本人揣测一下IP的由来。Pat Selinger在上面提到的那篇System R的优化器论文中提到的是“Interesting Ordering”(以下简称IO)。IO是为了弥补(或者说修正)“dynamic programming”(动态规划,以下简称DP)技术在寻找成本最低的方案上的一些不足。

IBM的System R是第一个成功的关系型数据库项目,该项目开创了很多经典技术,优化器便是其中之一。Pat Selinger在开发System R时提出了DP和IO这两个重要算法和思想,影响了所有后续的数据库优化器的设计和实现。

我们以一个例子来说明IO的作用,比如在多表join时,DP会首先搜索最底层问题的最优方案,比如访问某个表的最佳访问方案。不同访问方法本身的代价有高有低,DP仅考虑这些方法本身的代价,找到成本最低的那个。但是,不同方法产生的结果集存在一种特性,这种特性会影响后续执行的效率,它就是数据的ordering,即是否排序。如果用户的查询语句中有“order by”,那么比较两种扫描代价的时候就不能简单地比较各自的成本,比如,一个候选计划A,其扫描代价小并产出了乱序的结果集;另一个候选计划B,其扫描代价高并产出了排序的结果,那么这两种方案谁更高效,在当前阶段尚未可知。比如,数据被取出后送到Join操作符,一般有三种可能的join方案:nest loop join(以下简称NLJ)、sort merge join(以下简称SMJ)和 hash join(以下简称HJ)。其中SMJ的代价往往是最小的,但是它却要求输入的数据必须排序,因此如果底层返回的数据是乱序的,优化器便不能选择SMJ,而必须从HJ和NLJ中选择一个。因此上面的A、B两种候选计划,虽然A本身的代价小些,但是B却可以产出排序的数据时,仅仅基于DP显然错过了最佳方案SMJ。

所以引入了IO,每一个方案都保留一项属性(即“ordering”)。如果数据是排序的,就将该属性设置为true;否则设置为false。而DP在比较两个方案时,如果拥有不同属性,则不能简单地认为A比B好,而是两个都作为最优解保留下来。这样,上层的优化过程就不会错过更优的方案了。

后来随着优化器的发展,人们发现不仅ordering很重要,还有其他一些特性也很重要,比如partition信息在分布式执行过程中也是很重要的参考指标。因此后来IO思想被衍生为”Physical Property“(以下简称PP,来自Vlocano的论文),并在其他的优化器技术中得到了更加广泛的应用。而这个词也广泛出现在上面提到的Goetz的两篇论文里,当然与之对应的还有“Logical Property”。

虽然没有考证,但IP可看作是Flink对IO和PP的一个中和。而且从优化器模块的代码实现来看,除了有InterestingProperties这一定义还有LocalProperties、GlobalProperties以及PartitioningProperty等类型定义。这里的property(或properties)表示对优化产生影响的属性,而前面的修饰词则阐述了它们是什么类型的属性。无论如何,IP是一种思想,理解其作用即可。


原文发布时间为:2017-02-13

本文作者:vinoYang

本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
SQL 分布式计算 大数据
统一批处理流处理——Flink批流一体实现原理
统一批处理流处理——Flink批流一体实现原理
1485 0
统一批处理流处理——Flink批流一体实现原理
|
3月前
|
关系型数据库 数据处理 流计算
【Flink】Flink 流处理和批处理
【1月更文挑战第26天】【Flink】Flink 流处理和批处理
|
3月前
|
消息中间件 存储 Kafka
在Flink中,可以通过配置`KafkaConsumer`的`properties`参数来设置两个不同的SASL机制
【1月更文挑战第19天】【1月更文挑战第91篇】在Flink中,可以通过配置`KafkaConsumer`的`properties`参数来设置两个不同的SASL机制
78 3
|
流计算
《朱翥、贺小令|更快更稳更易用:Flink 自适应批处理能力演》电子版地址
朱翥、贺小令|更快更稳更易用:Flink 自适应批处理能力演
78 0
《朱翥、贺小令|更快更稳更易用:Flink 自适应批处理能力演》电子版地址
|
SQL 缓存 运维
更快更稳更易用: Flink 自适应批处理能力演进
朱翥、贺小令在 9.24 Apache Flink Meetup 的演讲内容整理。
更快更稳更易用: Flink 自适应批处理能力演进
|
Apache 流计算 Python
Flink第一课!使用批处理,流处理,Socket的方式实现经典词频统计
Flink第一课!使用批处理,流处理,Socket的方式实现经典词频统计
308 0
Flink第一课!使用批处理,流处理,Socket的方式实现经典词频统计
|
SQL 机器学习/深度学习 存储
从 Spark 做批处理到 Flink 做流批一体
Flink 做流批一体在 linkedIn 的一些探索经验
从 Spark 做批处理到 Flink 做流批一体
|
Scala
flink1.7.2 tableapi批处理示例
- 主要操作包括: print table,DataSet 转换成table,Scan,select,as,where / filter,groupBy,distinct,join,leftOuterJoin,rightOuterJoin union,unionAll,...
1467 0
|
SQL Scala 流计算
Flink1.7.2 sql 批处理示例
- 本文为Flink sql Dataset 示例 - 主要操作包括:Scan / Select,as (table),as (column),limit,Where / Filter,between and (where),Sum,min,max,avg, sum (group by ),g...
1333 0
|
JSON 缓存 API
Flink运行时之批处理程序生成计划
批处理程序生成计划 DataSet API所编写的批处理程序跟DataStream API所编写的流处理程序在生成作业图(JobGraph)之前的实现差别很大。流处理程序是生成流图(StreamGraph),而批处理程序是生成计划(Plan)并由优化器对其进行优化并生成优化后的计划(OptimizedPlan)。
1980 0