Flink Forward Asia 2020:Flink SQL的功能扩展与深度优化

作者介绍: 杜立,腾讯高级工程师
整理: DJG
校对: MWT
摘要: 本文由腾讯高级工程师杜立分享,主要介绍了FlinkSQL现有的一些语法和逻辑及其存在的问题,以及腾讯Oceanus实时计算平台针对Flink SQL所做的优化,主要包括:

  1. FlinkSQL现状
  2. 窗口功能的扩展
  3. 回撤流的优化
  4. 未来的规划

1. 背景及现状

1.1 三种模式的分析

在这里插入图片描述

Flink作业目前有三种创建方式:JAR模式、画布模式和SQL模式。不同的提交作业的方式针对的人群也是不一样的。

  1. Jar模式:Jar模式基于DataStream/DataSet API开发,主要针对的是底层的开发人员。

优点:

  • 功能灵活多变,因为它底层的DataStream/DataSet API是Flink的原生API,你可以用它们开发任何你想要的算子功能或者DAG图;
  • 性能优化方便,可以非常有针对性的去优化每一个算子的性能。

缺点:

  • 依赖更新繁琐,无论扩展作业逻辑或是Flink版本的升级,都要去更新作业的代码以及依赖版本;
  • 学习门槛较高

  1. 画布模式: 所谓的画布模式,一般来讲会提供一个可视化的拖拉拽界面,让用户通过界面化的方式去进行拖拉拽操作,以完成Flink作业的编辑。它面向一些小白用户。

优点:

  • 操作便捷,画布上可以很方便地定义Flink的作业所包含的各种算子;
  • 功能较全,它基于Table API开发,功能覆盖比较完整;
  • 易于理解,DAG图比较直观,用户能够非常容易的去理解整个作业的运行流程。

缺点:

  • 配置复杂:每一个算子都需要去逐个的去配置,如果整个DAG图非常复杂,相应的配置工作也会非常大;
  • 逻辑重用困难:如果作业非常的多,不同的作业之间想去共享DAG逻辑的话非常困难。

  1. SQL模式: SQL语言已经存在了很长时间了,它有有自己的一套标准,主要面向数据分析人员。只要遵循既有的SQL标准,数据分析人员就可以在不同的平台和计算引擎之间进行切换。

优点:

  • 清晰简洁,易于理解和阅读;
  • 与计算引擎解耦,SQL与计算引擎及其版本是解耦的,在不同的计算引擎之间迁移业务逻辑不需要或极少需要去更改整段SQL。同时,如果想升级Flink版本,也是不需要去更改SQL;
  • 逻辑重用方便,可以通过 create view 的方式去重用我们的SQL逻辑,

缺点:

  • 语法不统一,比如说流与维表Join,Flink1.9之前使用 Lateral Table Join 语法,但是在1.9之后,更改成了PERIOD FOR SYSTEM_TIME语法,这种语法遵循了SQL ANSI 2011标准。语法的变动使得用户有一定的学习成本;
  • 功能覆盖不全:Flink SQL这个模块存在的时间不是很长,导致它的功能的一个覆盖不是很全。
  • 性能调优困难:一段SQL的执行效率主要由几个部分来决定,一个就是SQL本身所表达的业务逻辑;另一部分是翻译SQL所产生的执行计划的一个优化;第三部分的话,在产生最优的逻辑执行计划之后,翻译成本地的native code的时候方案也决定了SQL的执行效率;对于用户来讲的,他们所能优化的内容可能只局限于SQL所表达的业务逻辑。
  • 问题定位困难:SQL是一个完整的执行流程,如果我们发现某些数据不对,想针对性地去排查到底是哪个算子出了问题,是比较的困难的。一般来讲,我们想定位Flink SQL的问题,只能先不断的精简我们的整个SQL逻辑,然后不断地去尝试输出,这个成本是非常高的。腾讯Oceanus平台后期会针对这个问题,增加trace日志和metrics信息,输出到产品侧以帮助用户定位Flink SQL使用上的问题。

1.2 腾讯目前的工作

  1. 扩展语法: 定义了window table-valued function语法,以帮助用户实现基于窗口的流流Join和流流之间的交并差操作。另外,实现了自己的流与维表Join的语法。
  2. 新增功能: 新增的一些功能,包括两个新的window的类型,Incremental Window(增量窗口)和Ehanced Tumble Window(增强窗口)。实现了Eventtime Field与Table Source的解偶,很多时候Eventtime Field并不能通过Table Source字段定义出来,比如Table Source是一个子查询或者某个时间字段是由函数转换得出,想要用这些中间生成的时间字段作为Eventtime Field目前是做不到的,腾讯Oceanus团队目前的方案是,让用户可以选择物理表中任意的时间字段来定义Window的时间属性,并输出WaterMark。
  3. 性能调优:
    • 回撤流优化;
    • 内联UDF,如果相同的UDF即出现在LogicalProject中,又出现在Where条件中,那么UDF会进行多次调用。将逻辑执行计划中重复调用的UDF提取出来,将该UDF的执行结果进行缓存,避免多次调用;
  4. Bucket Join: 流表维表Join中存在数据冷启动问题,如果Flink任务在启动时大量加载外部数据,很容易造成反压。可以在启动时利用State Processor API等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值