[大家好,我是 Spark Rapids 的新手。我正在阅读 Spark Rapids 的基本介绍,其中我得到了一个图(附加),解释了 hashaggregate 示例中基于 CPU 和 GPU 的查询计划之间的区别。计划中的所有内容,除了转换为行格式的最后阶段之外,我不清楚。任何人都可以提出这背后的原因。]
1 回答
我没有看到引用的数字,但我怀疑您的特定查询中发生的事情归结为两种可能的情况之一。
如果您的查询正在执行某种类型的数据收集返回给驱动程序(例如:.show
或.collect
在 Scala 中或以其他方式直接显示查询结果),那么列式 GPU 数据需要在返回给驱动程序之前转换回行。最终,驾驶员正在与之合作,RDD[InternalRow]
这就是为什么RDD[ColumnarBatch]
在这些情况下需要进行转换的原因。
如果您的查询通过将输出写入文件(例如:Parquet 或 ORC)而结束,那么计划通常会显示最终GpuColumnarToRow
转换。Spark 的 Catalyst 优化器ColumnarToRow
在看到能够产生列输出(即:)的操作时自动插入转换RDD[ColumnarBatch]
,然后插件将这些转换更新到GpuColumnarToRow
前一个节点将在 GPU 上运行的时间。但是,在这种情况下,查询节点是一个数据写入命令,并且在查询计划意义上这些命令不会产生任何输出。执行节点时直接将输出写入文件,而不是将输出发送到下游节点进行进一步处理。因此,这实际上是一种退化转换,因为数据写入命令不向列到行转换发送数据。我对 RAPIDS Accelerator 提出了一个问题,以清理这种退化的转换,但它对查询性能没有影响。