flink血缘解析原理分析

flink血缘解析原理分析
最新回答
玖梦

2022-09-25 13:55:19

1. 在解析阶段,通过SqlToOperationConverter.convert(planner, this.catalogManager, parsed)方法,SQL语句被校验并转换为Operation。此方法首先对SQL语法树进行校验,确保表名、字段名和函数名的正确性,并验证特定操作的合法性,例如聚合函数的嵌套调用或AS重命名是否符合规则。
2. 在rel阶段,SqlNode构建的抽象语法树被转换为关系代数树,由RelNode和RexNode组成。此阶段处理DML和DQL,而DDL由于其操作性质,不涉及复杂关系查询,因此无需转换。SqlNode中保存的信息直接用于执行。DML语句通过converter.convertSqlQuery(validated)转换为PlannerQueryOperation,其中包含了从Calcite转换成的关系树。
3. 在Translate阶段,Blink Planner通过translateToRel、optimize、StreamGraph和ObjectNode四个步骤将Operation转换为ObjectNode。首先,ModifyOperation通过translateToRel方法转换为Calcite RelNode逻辑计划树。然后,在Explainer#translateObjectNode()方法中,modifyOperations数组被组装,并通过PlannerBase#translate(modifyOperations)获取Transformation数组。这些Transformation数组作为参数传递给ExecutorUtils#generateStreamGraph()以生成StreamGraph。使用JSONGenerator和ObjectMapper在Executor#getStreamGraph()方法中封装并返回ObjectNode。最后,通过TransGenerator(plan).translateTrans()获取ObjectNode中的节点信息,并组装成Trans数组,以便后续生成最终的实体对象LineageColumnGenerator。