美文网首页
Flink 结合 Calcite

Flink 结合 Calcite

作者: 丹之 | 来源:发表于2018-11-17 22:43 被阅读40次

    Flink Table API&SQL 为流式数据和静态数据的关系查询保留统一的接口,而且利用了Calcite的查询优化框架和SQL parser。该设计是基于Flink已构建好的API构建的,DataStream API 提供低延时高吞吐的流处理能力而且就有exactly-once语义而且可以基于event-time进行处理。而且DataSet拥有稳定高效的内存算子和流水线式的数据交换。Flink的core API和引擎的所有改进都会自动应用到Table API和SQL上。
    一条stream sql从提交到calcite解析、优化最后到flink引擎执行,一般分为以下几个阶段:

    1. Sql Parser: 将sql语句通过java cc解析成AST(语法树),在calcite中用SqlNode表示AST;
    2. Sql Validator: 结合数字字典(catalog)去验证sql语法;
    3. 生成Logical Plan: 将sqlNode表示的AST转换成LogicalPlan, 用relNode表示;
    4. 生成 optimized LogicalPlan: 先基于calcite rules 去优化logical Plan,
    再基于flink定制的一些优化rules去优化logical Plan;
    5. 生成Flink PhysicalPlan: 这里也是基于flink里头的rules将,将optimized LogicalPlan转成成Flink的物理执行计划;
    6. 将物理执行计划转成Flink ExecutionPlan: 就是调用相应的tanslateToPlan方法转换和利用CodeGen元编程成Flink的各种算子。
    

    而如果是通过table api来提交任务的话,也会经过calcite优化等阶段,基本流程和直接运行sql类似:

    1. table api parser: flink会把table api表达的计算逻辑也表示成一颗树,用treeNode去表式;
    在这棵树上的每个节点的计算逻辑用Expression来表示。
    2. Validate: 会结合数字字典(catalog)将树的每个节点的Unresolved Expression进行绑定,生成Resolved Expression;
    3. 生成Logical Plan: 依次遍历数的每个节点,调用construct方法将原先用treeNode表达的节点转成成用calcite 内部的数据结构relNode 来表达。即生成了LogicalPlan, 用relNode表示;
    4. 生成 optimized LogicalPlan: 先基于calcite rules 去优化logical Plan,
    再基于flink定制的一些优化rules去优化logical Plan;
    5. 生成Flink PhysicalPlan: 这里也是基于flink里头的rules将,将optimized LogicalPlan转成成Flink的物理执行计划;
    6. 将物理执行计划转成Flink ExecutionPlan: 就是调用相应的tanslateToPlan方法转换和利用CodeGen元编程成Flink的各种算子。
    

    参考:
    http://blog.chinaunix.net/uid-29038263-id-5765791.html?utm_source=tuicool&utm_medium=referral
    https://www.jianshu.com/p/2dfbd71b7f0f
    https://www.infoq.cn/article/new-big-data-hadoop-query-engine-apache-calcite

    相关文章

      网友评论

          本文标题:Flink 结合 Calcite

          本文链接:https://www.haomeiwen.com/subject/jffwfqtx.html