揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?

本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识、实践、调优、内部实现等各个方面,带你由浅入深地全面了解 Flink SQL。

1. 发展历程

今年的8月22日 Apache Flink 发布了1.9.0 版本(下文简称1.9),在 Flink 1.9 中,Table 模块迎来了核心架构的升级,引入了阿里巴巴Blink团队贡献的诸多功能,本文对Table 模块的架构进行梳理并介绍如何使用 Blink Planner。

Flink 的 Table 模块 包括 Table API 和 SQL,Table API 是一种类SQL的API,通过Table API,用户可以像操作表一样操作数据,非常直观和方便;SQL作为一种声明式语言,有着标准的语法和规范,用户可以不用关心底层实现即可进行数据的处理,非常易于上手,Flink Table API 和 SQL 的实现上有80%左右的代码是公用的。作为一个流批统一的计算引擎,Flink 的 Runtime 层是统一的,但在 Flink 1.9 之前,Flink API 层 一直分为DataStream API 和 DataSet API, Table API & SQL 位于 DataStream API 和 DataSet API 之上。

Flink 1.8 Table 架构

在 Flink 1.8 架构里,如果用户需要同时流计算、批处理的场景下,用户需要维护两套业务代码,开发人员也要维护两套技术栈,非常不方便。 Flink 社区很早就设想过将批数据看作一个有界流数据,将批处理看作流计算的一个特例,从而实现流批统一,阿里巴巴的 Blink 团队在这方面做了大量的工作,已经实现了 Table API & SQL 层的流批统一。 幸运的是,阿里巴巴已经将 Blink 开源回馈给 Flink 社区。为了实现 Flink 整个体系的流批统一,在结合 Blink 团队的一些先行经验的基础上,Flink 社区的开发人员在多轮讨论后,基本敲定了Flink 未来的技术架构。

Flink 未来架构

在Flink 的未来架构中,DataSet API将被废除,面向用户的API只有 DataStream API 和 Table API & SQL,在实现层,这两个API共享相同的技术栈,使用统一的 DAG 数据结构来描述作业,使用统一的 StreamOperator 来编写算子逻辑,以及使用统一的流式分布式执行引擎,实现彻底的流批统一。 这两个API都提供流计算和批处理的功能,DataStream API 提供了更底层和更灵活的编程接口,用户可以自行描述和编排算子,引擎不会做过多的干涉和优化;Table API & SQL 则提供了直观的Table API、标准的SQL支持,引擎会根据用户的意图来进行优化,并选择最优的执行计划。

2.Flink 1.9 Table 架构

Blink 的 Table 模块的架构在开源时就已经实现了流批统一,向着 Flink 的未来架构迈进了第一步,走在了 Flink 社区前面。 因此在 Flink 1.9 合入 Blink Table 代码时,为了保证 Flink Table 已有架构和 Blink Table的架构能够并存并朝着 Flink 未来架构演进,社区的开发人员围绕FLIP-32(FLIP 即 Flink Improvement Proposals,专门记录一些对Flink 做较大修改的提议。FLIP-32是:Restructure flink-table for future contributions) 进行了重构和优化,从而使得 Flink Table 的新架构具备了流批统一的能力,可以说 Flink 1.9 是 Flink 向着流批彻底统一这个未来架构迈出的第一步。

Flink 1.9 Table 架构

在 Flink Table 的新架构中,有两个查询处理器:Flink Query Processor 和 Blink Query Processor,分别对应两个Planner,我们称之为 Old Planner 和 Blink Planner。查询处理器是 Planner 的具体实现, 通过parser(解析器)、optimizer(优化器)、codegen(代码生成技术)等流程将 Table API & SQL作业转换成 Flink Runtime 可识别的 Transformation DAG (由Transformation组成的有向无环图,表示作业的转换逻辑),最终由 Flink Runtime 进行作业的调度和执行。

Flink 的查询处理器针对流计算和批处理作业有不同的分支处理,流计算作业底层的 API 是 DataStream API, 批处理作业底层的 API 是 DataSet API;而 Blink 的查询处理器则实现流批作业接口的统一,底层的 API 都是Transformation。

3.Flink Planner 与 Blink Planner

Flink Table 的新架构实现了查询处理器的插件化,社区完整保留原有 Flink Planner (Old Planner),同时又引入了新的 Blink Planner,用户可以自行选择使用 Old Planner 还是 Blink Planner。

在模型上,Old Planner 没有考虑流计算作业和批处理作业的统一,针对流计算作业和批处理作业的实现不尽相同,在底层会分别翻译到 DataStream API 和 DataSet API 上。而 Blink Planner 将批数据集看作 bounded DataStream (有界流式数据) ,流计算作业和批处理作业最终都会翻译到 Transformation API 上。 在架构上,Blink Planner 针对批处理和流计算,分别实现了BatchPlanner 和 StreamPlanner ,两者共用了大部分代码,共享了很多优化逻辑。 Old Planner 针对批处理和流计算的代码实现的是完全独立的两套体系,基本没有实现代码和优化逻辑复用。

除了模型和架构上的优点外,Blink Planner 在阿里巴巴集团内部的海量业务场景下沉淀了许多实用功能,集中在三个方面:

  • Blink Planner 对代码生成机制做了改进、对部分算子进行了优化,提供了丰富实用的新功能,如维表 join、Top N、MiniBatch、流式去重、聚合场景的数据倾斜优化等新功能。
  • Blink Planner 的优化策略是基于公共子图的优化算法,包含了基于成本的优化(CBO)和基于规则的优化(CRO)两种策略,优化更为全面。同时,Blink Planner 支持从 catalog 中获取数据源的统计信息,这对CBO优化非常重要。
  • Blink Planner 提供了更多的内置函数,更标准的 SQL 支持,在 Flink 1.9 版本中已经完整支持 TPC-H ,对高阶的 TPC-DS 支持也计划在下一个版本实现。

整体看来,Blink 查询处理器在架构上更为先进,功能上也更为完善。出于稳定性的考虑,Flink 1.9 默认依然使用 Flink Planner,用户如果需要使用 Blink Planner,可以作业中显式指定。

4.如何启用 Blink Planner

在IDE环境里,只需要引入两个 Blink Planner 的相关依赖,就可以启用 Blink Planner。

<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-scala-bridge_2.11</artifactId>
<version>1.9.0</version>
</dependency><dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_2.11</artifactId>
<version>1.9.0</version>
</dependency>

对于流计算作业和批处理作业的配置非常类似,只需要在 EnvironmentSettings 中设置 StreamingMode 或 BatchMode 即可,流计算作业的设置如下:

// **********************
// BLINK STREAMING QUERY
// **********************
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.java.StreamTableEnvironment;StreamExecutionEnvironment bsEnv = StreamExecutionEnvironment.getExecutionEnvironment();
EnvironmentSettings bsSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build();
StreamTableEnvironment bsTableEnv = StreamTableEnvironment.create(bsEnv, bsSettings);
// or TableEnvironment bsTableEnv = TableEnvironment.create(bsSettings);bsTableEnv.sqlUpdate(…);
bsTableEnv.execute();

批处理作业的设置如下 :

// ******************
// BLINK BATCH QUERY
// ******************
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.TableEnvironment;EnvironmentSettings bbSettings = EnvironmentSettings.newInstance().useBlinkPlanner().inBatchMode().build();
TableEnvironment bbTableEnv = TableEnvironment.create(bbSettings);
bbTableEnv.sqlUpdate(…)
bbTableEnv.execute()

如果作业需要运行在集群环境,打包时将 Blink Planner 相关依赖的 scope 设置为 provided,表示这些依赖由集群环境提供。这是因为 Flink 在编译打包时, 已经将 Blink Planner 相关的依赖打包,不需要再次引入,避免冲突。

5. 社区长远计划

目前,TableAPI & SQL 已经成为 Flink API 的一等公民,社区也将投入更大的精力在这个模块。在不远的将来,待 Blink Planner 稳定之后,将会作为默认的 Planner ,而 Old Planner 也将会在合适的时候退出历史的舞台。目前社区也在努力赋予 DataStream 批处理的能力,从而统一流批技术栈,届时 DataSet API 也将退出历史的舞台。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7 修改yum源为阿里源

# 1.先检查是否有wget命令&#xff0c;如果没有wget&#xff0c;先下载&#xff1a; yum install -y wget# 2.安装base reop源cd /etc/yum.repos.d# 3.接着备份旧的配置文件 mv CentOS-Base.repo CentOS-Base.repo.bak# 4.下载阿里源的文件 wget -O /etc/yum.repos.d/epel.re…

阿里面试官整理的JVM面试要点,99%的你都不知道!

最近网上出现一个面试题&#xff1a;“一个线程OOM后&#xff0c;其他线程还能运行吗&#xff1f;”网上出现了很多答案。这道题其实很有难度&#xff0c;涉及的知识点有jvm内存分配、作用域、gc等&#xff0c;不是简单的是与否的问题。在面试时被问到这个问题你是会哑口无言还…

开发函数计算的正确姿势——借助 Ghostscript 将 PDF 转换成 JPG

前言 首先介绍下在本文出现的几个比较重要的概念&#xff1a; 函数计算&#xff08;Function Compute&#xff09;&#xff1a;函数计算是一个事件驱动的服务&#xff0c;通过函数计算&#xff0c;用户无需管理服务器等运行情况&#xff0c;只需编写代码并上传。函数计算准备计…

面向对象编程(OOP)

面向对象编程&#xff08;OOP&#xff09; 面向过程&面向对象 面向过程思想&#xff08;线性&#xff09; ​ 1.步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么…… ​ 2.面对过程适合处理一些较为简单的问题 面向对象思想&#xff08;分类&#xff0…

6 个 K8s 日志系统建设中的典型问题,你遇到过几个?

作者 | 元乙 阿里云日志服务数据采集客户端负责人&#xff0c;目前采集客户端 logtail 在集团百万规模部署&#xff0c;每天采集上万应用数 PB 数据&#xff0c;经历多次双 11、双 12 考验。 导读&#xff1a;随着 K8s 不断更新迭代&#xff0c;使用 K8s 日志系统建设的开发者…

腾讯视频云支持超300万场次直播带货 助力企业一天搭建直播间

5月21日&#xff0c;腾讯产业互联网沙龙通过腾讯会议线上举办&#xff0c;围绕“科技助力中小微企业破局”话题&#xff0c;腾讯视频云业务总经理李郁韬 、腾讯云生态建设总经理王莹、腾讯云云开发产品负责人王倩与数百家企业代表探讨了在疫情之下&#xff0c;中小微企业如何借…

CentOS 7.8使用devtoolset-9使用高版本gcc version 9.3.1

问题原因 CentOS 7的gcc版本为4.8.5&#xff0c;Redis 6.0.5最低需要gcc4.9&#xff0c;因此需要升级gcc版本 from redis 6.0.5, building redis from source code needs C11 support.The version of gcc in CentOS 7 is 4.8.5, but C11 was introduced in 4.9. 解决办法 1、手…

如何加快 Node.js 应用的启动速度

我们平时在开发部署 Node.js 应用的过程中&#xff0c;对于应用进程启动的耗时很少有人会关注&#xff0c;大多数的应用 5 分钟左右就可以启动完成&#xff0c;这个过程中会涉及到和集团很多系统的交互&#xff0c;这个耗时看起来也没有什么问题。 目前&#xff0c;集团 Serve…

技术人看《长安十二时辰》的正确姿势是?

阿里妹导读&#xff1a;从“叉手礼”、“水盆羊汤”、“酒晕妆”这些唐朝人的生活细节&#xff0c;到精美的坊间造型、充满意境的诗词歌赋&#xff0c;《长安十二时辰》不仅以缜密剧情赢得赞誉&#xff0c;更还原了一个真实的大唐长安。在精良制作之上&#xff0c;技术人如何让…

(进阶篇)Redis6.2.0 集群 主从复制_搭建_01

文章目录1. 部署划分2. 单机安装Redis3. 创建配置/数据/日志目录4. 修改配置文件5. redis启动6. 登录查看信息7. 读写分离1. 部署划分 ip角色192.168.92.100Master192.168.92.101Slave192.168.92.102Slave 2. 单机安装Redis 首先在在3台服务器上分别安装Redis单机环境 (单机)…

我们已经不用AOP做操作日志了! | 原力计划

来源 | JAVA葵花宝典责编 | 王晓曼、Carol 头图 | CSDN下载自东方IC前言用户在操作我们系统的过程中&#xff0c;针对一些重要的业务数据进行增删改查的时候&#xff0c;我们希望记录一下用户的操作行为&#xff0c;以便发生问题时能及时的找到依据&#xff0c;这种日志就是业务…

会向业务“砍需求”的技术同学,该具备哪6点能力?

阿里妹导读&#xff1a;“会”砍需求&#xff0c;并不是件容易的事情&#xff0c;这涉及到工程师的商业头脑&#xff0c;要会判断技术和业务的关系。技术与业务好比“两条腿”&#xff0c;相互配合才能走得更远。如何具备business sense就是我们今天的课题。 论工程师的商业头…

(进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02

文章目录一、主从复制流程1. 主从复制流程图2. 主从复制日志二、主从复制信息剖析2.1. 主节点信息剖析2.2. 从节点信息剖析三、关键术语3.1. 复制功能开启3.2. 全量复制场景3.3. 主从复制异步性3.4. 过期key的处理3.5. 加速复制一、主从复制流程 1. 主从复制流程图 第一条线&a…

如何抢占云栖大会C位?史上最强强强攻略来了

如何抢占云栖大会C位&#xff1f;史上最强强强攻略来了 原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

寻找榜样的力量!CSDN【百万人学 AI】评选活动重磅启动

AI 业界历经算法更迭、技术方案升级&#xff0c;有企业攻城略池&#xff0c;占据更多行业山头&#xff0c;有企业中途折戟沉沙。AI 发展浮浮沉沉&#xff0c;但每一年我们都希望审视当下&#xff0c;一窥未来。2020 无疑是特殊的一年&#xff0c;而 AI 在开年的这场”战疫“中表…

构造器详解(重要)

构造器详解&#xff08;重要&#xff09; 构造器快捷键 altinsert 构造器&#xff1a; 1. 和类名相同 2. 没有返回值 作用&#xff1a; 1.new 本质在调用构造方法 2.初始化对象的值 注意点&#xff1a; 1.定义有参构造之后&#xff0c;如果想使用无参构造&#xff0c;必须显示…

重构:改善饿了么交易系统的设计思路

我在2017年5月加入饿了么的交易部门&#xff0c;先后负责搜索、订单、超时、赔付、条约、交付、金额计算以及评价等系统&#xff0c;后期开始做些整体系统升级的工作。 这篇文章成型于交易系统重构一期之后&#xff0c;主要是反思其过程中做决策的思路&#xff0c;我没有使用「…

(进阶篇)Redis6.2.0 集群 主从复制_故障解决_03

文章目录一、 主从数据一致性1. 主多从少2. 主少从多3. 知识点补充二、 数据延迟2.1. 数据延迟因素2.2. 解决方案三、 脏数据3.1. 脏数据产生的场景3.2. 解决方案四、 数据安全性4.1. 场景4.2. 解决方案五、 规避全量复制5.1. 低峰时段5.2. 主节点变更5.3. 增大复制缓冲区六、 …

以“基”取胜:青立方超融合易捷版,助力企业“极简”上云

2020年春天&#xff0c;以云计算、5G、人工智能为代表的“新基建”蔚然成风&#xff0c;不仅助力中国产业智能化、信息化进入加速推进的快车道&#xff0c;促使全产业链迈开高质量发展的新步伐。更是面向长远&#xff0c;构筑数字经济创新发展之基。可以说&#xff0c;没有任何…

从零开始入门 K8s| K8s 的应用编排与管理

一、资源元信息 1. Kubernetes 资源对象 我们知道&#xff0c;Kubernetes 的资源对象组成&#xff1a;主要包括了 Spec、Status 两部分。其中 Spec 部分用来描述期望的状态&#xff0c;Status 部分用来描述观测到的状态。 今天我们将为大家介绍 K8s 的另外一个部分&#xff0c…