一、概述

实现 CodegenSupport 接口的 Operator 可以将自己的逻辑拼成 Java 代码

二、设计

在 CodegenSupport 中比较重要的是 $consume/doConsume$ 和 $produce/doProduce$ 这两对方法。
$consume()$ 和 $doConsume()$ 用来消费,返回该 CodegenSupport 节点处理数据核心逻辑所对应生成的代码;而 $produce()$ 和 $doProduce()$ 则用来生产,返回的是该节点及其子节点所生成的代码。
$produce()$ 方法会调用 $doProduce()$ 方法,而 $consume()$ 方法则会调用其父节点的 $doConsume()$ 方法。
此外,CodegenSupport 中还保存了其父节点 parent 作为变量,以及其他一些辅助的方法,如判断是否支持代码生成($supportCodegen$)、获得产生输入数据的 $inputRDDs$ 等。

相邻 Operator 通过 Produce-Consume 模式生成代码

2.1. 属性

2.2. 方法

2.2.1. produce()

输出本节点产出 Row 的 Java 代码

2.2.2. consume()

输出本节点消费上游节点输入的 Row 的 Java 代码

2.2.3. inputRDDs()

用于获得产生输入数据的 inputRDDs 。

  • 在 WholeStageCodegenExec 中,此方法抛出异常,说明不能在 WholeStageCodegenExec 中调用此函数。

  • 在继承 CodegenSupport 的物理计划中,该方法返回子物理计划的 $inputRDDs()$ 函数结果。

  • 在继承 CodegenSupport 的数据源物理计划中,该方法返回数据源 RDD

  • 在 InputAdapter 中,其执行子物理计划的 $ executor()$ 方法,将结果 RDD 进行返回。

三、实现

3.1. WholeStageCodegenExec

CodegenSupport 的实现类之一,Stage 内部所有相邻的实现 CodegenSupport 接口的 Operator 的融合,产出的代码把所有被融合的 Operator 的执行逻辑封装到一个 Wrapper 类中,该 Wrapper 类作为 Janino 即时 compile 的入参。

3.2. InputAdapter

CodegenSupport 的实现类之一,胶水类,用来连接 WholeStageCodegenExec 节点和未实现 CodegenSupport 的上游节点。