OpenMLDB 离线增加 WindowColumnPruning 优化开关

背景

OpenMLDB 离线目前支持多种性能优化,包括窗口并行优化、窗口倾斜优化、UnsafeRow 内存优化等等。其中窗口并行优化里面还有一种优化,我们称之 为WindowColumnPruning(窗口列剪枝)优化,其原理是一个窗口计算除了新增的列,输入行的所有列都需要参与 Window 函数计算并直接返回到结果行中,如果开启 WindowColumnPruning 则 Window 计算只需要输出新增的列,输入的原始列可以和输出的新增列进行拼接。这个优化具体实现代码已经在窗口并行优化逻辑中实现,本次任务只是需要在 Java/Scala 侧新增开关,可以把是否开启该优化的功能暴露出去。

编程语言

Scala / C++

实现方案

  1. 首先要在 OpenMLDB 的 C++ 代码侧,找到窗口并行优化相关的代码。代码在 https://github.com/4paradigm/OpenMLDB/blob/56203b9a25d7d94ff6fd76ed07a64445dc8d4659/hybridse/src/vm/transform.cc#L1351
  2. 然后在 openmldb-batch 离线模块中,在 OpenmldbBatchConfig 参考其他优化开关新增 WindowColumnPruning 相关的优化开关。代码在 https://github.com/4paradigm/OpenMLDB/blob/8f9cd296c3e6e0cec4de91bf0bc009fc3fd924c0/java/openmldb-batch/src/main/scala/com/_4paradigm/openmldb/batch/OpenmldbBatchConfig.scala#L123
  3. 最后 openmldb-batch 离线模块中,找到构造 SqlContext 的地方,把用户配置传入即可。代码在 https://github.com/4paradigm/OpenMLDB/blob/8f9cd296c3e6e0cec4de91bf0bc009fc3fd924c0/java/openmldb-batch/src/main/scala/com/_4paradigm/openmldb/batch/SparkPlanner.scala#L327
  4. 构造相应的测试用例,确保相应的优化代码路径被正确执行。

Github Issue

https://github.com/4paradigm/OpenMLDB/issues/939