本文转载自微信公众号《KK架构师》,作者wangkai。转载请联系KKarchitects公众号。1、FlinkApi的层次抽象如上图所示。最底层是ProcessFunction,可以做一些有状态的计算,注册Timer定时器,可以进行更复杂的操作,灵活性更高,操作非常复杂。定制开发;第二层是DataStreamApi,它基于ProcessFunction,封装了很多操作。比如做一个KeyBy操作+Window聚合就方便了;顶层是一个关系API,它是在DataStreamAPI之上的更高级的抽象。我们可以使用SQL这种非常经典稳定的语言来构建一个实时流程序。2、为什么要提供TableApi和SQL?1、开发繁琐。DataStreamApi/ProcessFunction更面向开发者。如果你想开发一个合理的Flink程序,你至少需要具备以下技能:Java和Scala开发经验;对Time、State、Window等流式概念有非常深刻的理解;具有分布式处理的经验和知识;有工作调优经验;在这种情况下,对数据分析师和业务人员是非常不友好的,学习成本很高,遥不可及。而且开发起来非常麻烦。要开发应用程序,您需要使用Function接口。即使是一个简单的过滤器也需要实现一个FilterFunction匿名类,但是使用TableApi就简单多了。2.代码不通用。TableApi和SQL是流和批通用的,代码可以完全复用。流式程序不需要使用DataStreamApi,批处理需要DataSetApi(注:社区以后可能会丢弃DatasetApi,统一使用DataStreamApi来开发批流式程序)。3.框架难以优化。在使用DataStreamApi和DataSetApi开发应用时,Flink框架只能进行非常有限的优化,需要开发者非常小心地编写出高效的应用。如果你使用TableApi或者SQL,你可以使用Calcite的SQL优化器,这样更容易编写执行效率高的应用程序。2、TableApi/SQL是如何转化为程序运行的?如下图所示,SQL执行分为两大阶段,从SQL语句到Operation,从Operation到Transformation,然后进入分布式执行阶段。1、前置知识:ApacheCalciteApacheCalcite是一个动态数据管理框架,具有数据库管理系统的很多功能,如SQL分析、SQL验证、SQL查询优化、SQL生成和数据连接查询等,但不存储元数据和基本数据,不包括处理数据的算法。由于放弃了这些功能,Calcite可以很好地充当应用程序、数据存储和数据处理引擎之间的中介。不受上层编程语言的限制。前端可以使用SQL、Pig、Cascading等语言,只要通过Calcite提供的SQLAPI将其转化为关系代数的抽象语法树,并按照一定的规则和代价修改抽象语法树即可.对树进行优化,最后推送到各个数据处理引擎去执行。因此,Calcite不涉及物理规划层。它通过扩展适配器连接各种后端数据源和数据处理引擎,如Hive、Drill、Flink、Phoenix。2.SQL语句到Operation的过程中,首先使用Calcite对SQL语句进行解析,得到SQLNode,然后根据不同的SQL类型进行转换,验证语法的有效性,再根据语句进行转换类型(DQL、DML、DDL)。对应的运算符树。对于SQL查询语句,它会被转换成一个QueryOperation树。3.从Operation到Transformation的过程中,Operation先转化为Calcite的逻辑计划树,再对应转化为Flink的逻辑计划树,再进行优化。优化后的逻辑树转化为Flink的物理规划,再通过代码生成算子、UDF、表达式等代码将物理规划打包成Transformation,形成Transformationpipeline,再转化为StreamGraph,最终可以提交给Flink集群真正启动运行。(后面我会写一篇源码分析的文章,重点关注这两部分,持续关注我)4.MetadataMetadata是FlinkSQL处理数据的一个非常重要的部分。元数据描述了Flink处理的读取没有元数据,Flink无法验证和优化SQL。Metadata包括以下信息:LibraryTableViewUDFtablefields如上图所示,在Flink中,Catalog是元数据的核心抽象。目前,Flink实现了两种Catalog,GenericMemoryCatalog和HiveCatalog小内存。5.优化器SQL查询优化是一个来自数据库系统的概念。查询优化器是关系数据库管理系统的核心之一。它决定了一个特定的查询使用哪些索引和哪些关联算法,从而使SQL能够高效运行。SQL优化器在很大程度上决定了系统的执行性能。查询优化器分为两类,基于规则的优化器(Rule-BasedOptimizer,RBO)和基于成本的优化器(Cost-BasedOptimizer,CBO)。RBO规则优化主要是等效地改变查询语句的形式,生成更好的逻辑执行计划,比如重写用户的查询(谓词推进、物化视图重写、视图合并等),然后逻辑执行计划需要进入物理执行计划。CBO成本优化,除了上述的RBO规则优化之外,还会使用复杂的算法统计统计每一个执行计划的执行成本,从不同的执行计划中选择一个执行成本最小的计划,转化为Flink的执行计划。3.总结FlinkTableApi/SQL提供了友好的用户界面,可以更高效地完成实时流式程序的开发。Flink依托ApacheCalcite提供的SQL分析优化框架,分析构建逻辑计划树,通过Planner层层优化Flink可以运行的内部结构,最终提交给Flink集群运行。
