From fa3e435a352920aa6601fd378d5b201374b38eee Mon Sep 17 00:00:00 2001 From: Niranjan Artal <50492963+nartal1@users.noreply.github.com> Date: Thu, 12 May 2022 13:30:52 -0700 Subject: [PATCH] Qualification tool: Add support for join, pandas, aggregate execs (#5468) * Qualification tool: Add support for join, pandas, aggregate execs Signed-off-by: Niranjan Artal * addressed review comments Signed-off-by: Niranjan Artal --- .../AggregateInPandasExecParser.scala | 41 +++++ .../ArrowEvalPythonExecParser.scala | 41 +++++ .../BroadcastHashJoinExecParser.scala | 41 +++++ .../BroadcastNestedLoopJoinExecParser.scala | 41 +++++ .../FlatMapGroupsInPandasExecParser.scala | 41 +++++ .../planparser/HashAggregateExecParser.scala | 48 ++++++ .../planparser/MapInPandasExecParser.scala | 41 +++++ .../ObjectHashAggregateExecParser.scala | 48 ++++++ .../tool/planparser/SQLPlanParser.scala | 26 +++ .../ShuffledHashJoinExecParser.scala | 47 ++++++ .../planparser/SortAggregateExecParser.scala | 41 +++++ .../planparser/SortMergeJoinExecParser.scala | 41 +++++ .../tool/planparser/WindowExecParser.scala | 41 +++++ .../planparser/WindowInPandasExecParser.scala | 41 +++++ .../pandas_execs_eventlog.zstd | Bin 0 -> 134728 bytes .../tool/planparser/SqlPlanParserSuite.scala | 155 +++++++++++++++++- 16 files changed, 730 insertions(+), 4 deletions(-) create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/AggregateInPandasExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ArrowEvalPythonExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastHashJoinExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastNestedLoopJoinExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/FlatMapGroupsInPandasExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/HashAggregateExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/MapInPandasExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ObjectHashAggregateExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ShuffledHashJoinExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortAggregateExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortMergeJoinExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowExecParser.scala create mode 100644 tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowInPandasExecParser.scala create mode 100644 tools/src/test/resources/spark-events-qualification/pandas_execs_eventlog.zstd diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/AggregateInPandasExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/AggregateInPandasExecParser.scala new file mode 100644 index 00000000000..d961dc51953 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/AggregateInPandasExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class AggregateInPandasExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // AggregateInPandasExec doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ArrowEvalPythonExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ArrowEvalPythonExecParser.scala new file mode 100644 index 00000000000..77611a1b667 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ArrowEvalPythonExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class ArrowEvalPythonExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // ArrowEvalPythonExec doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastHashJoinExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastHashJoinExecParser.scala new file mode 100644 index 00000000000..cd11459e1f7 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastHashJoinExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class BroadcastHashJoinExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // BroadcastHashJoin doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastNestedLoopJoinExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastNestedLoopJoinExecParser.scala new file mode 100644 index 00000000000..c6f00e51c13 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/BroadcastNestedLoopJoinExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class BroadcastNestedLoopJoinExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // BroadcastNestedLoopJoin doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/FlatMapGroupsInPandasExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/FlatMapGroupsInPandasExecParser.scala new file mode 100644 index 00000000000..74a2e481dd7 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/FlatMapGroupsInPandasExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class FlatMapGroupsInPandasExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // FlatMapCoGroupsInPandasExec doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/HashAggregateExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/HashAggregateExecParser.scala new file mode 100644 index 00000000000..d070e867d35 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/HashAggregateExecParser.scala @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.internal.Logging +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode +import org.apache.spark.sql.rapids.tool.AppBase + +case class HashAggregateExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long, + app: AppBase) extends ExecParser with Logging { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // TODO - Its partial duration only. We need a way to specify it as partial. + val accumId = node.metrics.find( + _.name == "time in aggregation build total").map(_.accumulatorId) + val maxDuration = SQLPlanParser.getTotalDuration(accumId, app) + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, + maxDuration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/MapInPandasExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/MapInPandasExecParser.scala new file mode 100644 index 00000000000..7e056968a39 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/MapInPandasExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class MapInPandasExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // MapInPandasExec doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ObjectHashAggregateExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ObjectHashAggregateExecParser.scala new file mode 100644 index 00000000000..0d25ea4d81f --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ObjectHashAggregateExecParser.scala @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.internal.Logging +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode +import org.apache.spark.sql.rapids.tool.AppBase + +case class ObjectHashAggregateExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long, + app: AppBase) extends ExecParser with Logging { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // TODO - Its partial duration only. We need a way to specify it as partial. + val accumId = node.metrics.find( + _.name == "time in aggregation build total").map(_.accumulatorId) + val maxDuration = SQLPlanParser.getTotalDuration(accumId, app) + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, + maxDuration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SQLPlanParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SQLPlanParser.scala index 4f4d0e686bd..f51b663ffb9 100644 --- a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SQLPlanParser.scala +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SQLPlanParser.scala @@ -97,10 +97,18 @@ object SQLPlanParser extends Logging { WholeStageExecParser(node.asInstanceOf[SparkPlanGraphCluster], checker, sqlID, app).parse } else { val execInfos = node.name match { + case "AggregateInPandas" => + AggregateInPandasExecParser(node, checker, sqlID).parse + case "ArrowEvalPython" => + ArrowEvalPythonExecParser(node, checker, sqlID).parse case "BatchScan" => BatchScanExecParser(node, checker, sqlID, app).parse case "BroadcastExchange" => BroadcastExchangeExecParser(node, checker, sqlID, app).parse + case "BroadcastHashJoin" => + BroadcastHashJoinExecParser(node, checker, sqlID).parse + case "BroadcastNestedLoopJoin" => + BroadcastNestedLoopJoinExecParser(node, checker, sqlID).parse case "CartesianProduct" => CartesianProductExecParser(node, checker, sqlID).parse case "Coalesce" => @@ -124,10 +132,14 @@ object SQLPlanParser extends Logging { ExpandExecParser(node, checker, sqlID).parse case "Filter" => FilterExecParser(node, checker, sqlID).parse + case "FlatMapGroupsInPandas" => + FlatMapGroupsInPandasExecParser(node, checker, sqlID).parse case "Generate" => GenerateExecParser(node, checker, sqlID).parse case "GlobalLimit" => GlobalLimitExecParser(node, checker, sqlID).parse + case "HashAggregate" => + HashAggregateExecParser(node, checker, sqlID, app).parse case "LocalLimit" => LocalLimitExecParser(node, checker, sqlID).parse case "InMemoryTableScan" => @@ -135,22 +147,36 @@ object SQLPlanParser extends Logging { case i if (i.contains("InsertIntoHadoopFsRelationCommand") || i == "DataWritingCommandExec") => DataWritingCommandExecParser(node, checker, sqlID).parse + case "MapInPandas" => + MapInPandasExecParser(node, checker, sqlID).parse + case "ObjectHashAggregate" => + ObjectHashAggregateExecParser(node, checker, sqlID, app).parse case "Project" => ProjectExecParser(node, checker, sqlID).parse case "Range" => RangeExecParser(node, checker, sqlID).parse case "Sample" => SampleExecParser(node, checker, sqlID).parse + case "ShuffledHashJoin" => + ShuffledHashJoinExecParser(node, checker, sqlID, app).parse case "Sort" => SortExecParser(node, checker, sqlID).parse case s if (s.startsWith("Scan")) => FileSourceScanExecParser(node, checker, sqlID, app).parse + case "SortAggregate" => + SortAggregateExecParser(node, checker, sqlID).parse + case "SortMergeJoin" => + SortMergeJoinExecParser(node, checker, sqlID).parse case "SubqueryBroadcast" => SubqueryBroadcastExecParser(node, checker, sqlID, app).parse case "TakeOrderedAndProject" => TakeOrderedAndProjectExecParser(node, checker, sqlID).parse case "Union" => UnionExecParser(node, checker, sqlID).parse + case "Window" => + WindowExecParser(node, checker, sqlID).parse + case "WindowInPandas" => + WindowInPandasExecParser(node, checker, sqlID).parse case _ => logDebug(s"other graph node ${node.name} desc: ${node.desc} id: ${node.id}") ExecInfo(sqlID, node.name, expr = "", 1, duration = None, node.id, diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ShuffledHashJoinExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ShuffledHashJoinExecParser.scala new file mode 100644 index 00000000000..e461bf1bc17 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/ShuffledHashJoinExecParser.scala @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.internal.Logging +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode +import org.apache.spark.sql.rapids.tool.AppBase + +case class ShuffledHashJoinExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long, + app: AppBase) extends ExecParser with Logging { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // TODO - Its partial duration only. We need a way to specify it as partial. + val accumId = node.metrics.find(_.name == "time to build hash map total").map(_.accumulatorId) + val maxDuration = SQLPlanParser.getTotalDuration(accumId, app) + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, + maxDuration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortAggregateExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortAggregateExecParser.scala new file mode 100644 index 00000000000..75a816e64b1 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortAggregateExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class SortAggregateExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // SortAggregate doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortMergeJoinExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortMergeJoinExecParser.scala new file mode 100644 index 00000000000..059e150d756 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/SortMergeJoinExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class SortMergeJoinExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // SortMergeJoin doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowExecParser.scala new file mode 100644 index 00000000000..139a106fc21 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class WindowExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // Window doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowInPandasExecParser.scala b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowInPandasExecParser.scala new file mode 100644 index 00000000000..99a873c9972 --- /dev/null +++ b/tools/src/main/scala/com/nvidia/spark/rapids/tool/planparser/WindowInPandasExecParser.scala @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.nvidia.spark.rapids.tool.planparser + +import com.nvidia.spark.rapids.tool.qualification.PluginTypeChecker + +import org.apache.spark.sql.execution.ui.SparkPlanGraphNode + +case class WindowInPandasExecParser( + node: SparkPlanGraphNode, + checker: PluginTypeChecker, + sqlID: Long) extends ExecParser { + + val fullExecName = node.name + "Exec" + + override def parse: ExecInfo = { + // WindowInPandasExec doesn't have duration + val duration = None + val (speedupFactor, isSupported) = if (checker.isExecSupported(fullExecName)) { + (checker.getSpeedupFactor(fullExecName), true) + } else { + (1, false) + } + // TODO - add in parsing expressions - average speedup across? + ExecInfo(sqlID, node.name, "", speedupFactor, duration, node.id, isSupported, None) + } +} diff --git a/tools/src/test/resources/spark-events-qualification/pandas_execs_eventlog.zstd b/tools/src/test/resources/spark-events-qualification/pandas_execs_eventlog.zstd new file mode 100644 index 0000000000000000000000000000000000000000..787101f2d006e7796676515061cf5cad5f593bae GIT binary patch literal 134728 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¸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 val (eventLog, _) = ToolTestUtils.generateEventLog(eventLogDir, "WholeStageFilterProject") { spark => @@ -110,9 +111,9 @@ class SQLPlanParserSuite extends FunSuite with BeforeAndAfterEach with Logging { assert(planInfo.execInfo.size == 11) val wholeStages = planInfo.execInfo.filter(_.exec.contains("WholeStageCodegen")) assert(wholeStages.size == 6) - // only 2 in the above example have projects and filters and other 3 have sort + // only 2 in the above example have projects and filters, 3 have sort and 1 has SMJ val numSupported = wholeStages.filter(_.isSupported).size - assert(numSupported == 5) + assert(numSupported == 6) assert(wholeStages.forall(_.duration.nonEmpty)) val allChildren = wholeStages.flatMap(_.children).flatten assert(allChildren.size == 10) @@ -122,6 +123,33 @@ class SQLPlanParserSuite extends FunSuite with BeforeAndAfterEach with Logging { assertSizeAndSupported(2, projects) val sorts = allChildren.filter(_.exec == "Sort") assertSizeAndSupported(3, sorts) + val smj = allChildren.filter(_.exec == "SortMergeJoin") + assertSizeAndSupported(1, smj) + } + } + } + + test("HashAggregate") { + TrampolineUtil.withTempDir { eventLogDir => + val (eventLog, _) = ToolTestUtils.generateEventLog(eventLogDir, + "sqlMetric") { spark => + import spark.implicits._ + spark.range(10). + groupBy('id % 3 as "group").agg(sum("id") as "sum") + } + val pluginTypeChecker = new PluginTypeChecker() + val app = createAppFromEventlog(eventLog) + assert(app.sqlPlans.size == 1) + app.sqlPlans.foreach { case (sqlID, plan) => + val planInfo = SQLPlanParser.parseSQLPlan(plan, sqlID, pluginTypeChecker, app) + val wholeStages = planInfo.execInfo.filter(_.exec.contains("WholeStageCodegen")) + assert(wholeStages.size == 2) + val numSupported = wholeStages.filter(_.isSupported).size + assert(numSupported == 2) + assert(wholeStages.forall(_.duration.nonEmpty)) + val allChildren = wholeStages.flatMap(_.children).flatten + val hashAggregate = allChildren.filter(_.exec == "HashAggregate") + assertSizeAndSupported(2, hashAggregate) } } } @@ -349,6 +377,125 @@ class SQLPlanParserSuite extends FunSuite with BeforeAndAfterEach with Logging { } } + test("Parse Execs - BroadcastHashJoin, BroadcastNestedLoopJoin and ShuffledHashJoin") { + TrampolineUtil.withTempDir { eventLogDir => + val (eventLog, _) = ToolTestUtils.generateEventLog(eventLogDir, "sqlmetric") { spark => + import spark.implicits._ + val df1 = spark.sparkContext.parallelize(List(1, 2, 3, 4)).toDF + val df2 = spark.sparkContext.parallelize(List(4, 5, 6, 2)).toDF + // BroadcastHashJoin + df1.join(broadcast(df2), "value").collect + // ShuffledHashJoin + df1.createOrReplaceTempView("t1") + df2.createOrReplaceTempView("t2") + spark.sql("SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON " + + "t1.value = t2.value").collect + // BroadcastNestedLoopJoin + val nums = spark.range(2) + val letters = ('a' to 'c').map(_.toString).toDF("letter") + nums.crossJoin(letters) + } + val pluginTypeChecker = new PluginTypeChecker() + val app = createAppFromEventlog(eventLog) + assert(app.sqlPlans.size == 5) + val supportedExecs = Array("BroadcastHashJoin", "BroadcastNestedLoopJoin", "ShuffledHashJoin") + val parsedPlans = app.sqlPlans.map { case (sqlID, plan) => + SQLPlanParser.parseSQLPlan(plan, sqlID, pluginTypeChecker, app) + } + val allExecInfo = getAllExecsFromPlan(parsedPlans.toSeq) + for (execName <- supportedExecs) { + val supportedExec = allExecInfo.filter(_.exec == execName) + assertSizeAndSupported(1, supportedExec) + } + } + } + + test("Parse Exec - SortAggregate") { + TrampolineUtil.withTempDir { eventLogDir => + val (eventLog, _) = ToolTestUtils.generateEventLog(eventLogDir, "sqlmetric") { spark => + import spark.implicits._ + spark.conf.set("spark.sql.execution.useObjectHashAggregateExec", "false") + val df1 = Seq((1, "a"), (1, "aa"), (1, "a"), (2, "b"), + (2, "b"), (3, "c"), (3, "c")).toDF("num", "letter") + df1.groupBy("num").agg(collect_list("letter").as("collected_letters")) + } + val pluginTypeChecker = new PluginTypeChecker() + val app = createAppFromEventlog(eventLog) + assert(app.sqlPlans.size == 1) + val parsedPlans = app.sqlPlans.map { case (sqlID, plan) => + SQLPlanParser.parseSQLPlan(plan, sqlID, pluginTypeChecker, app) + } + val execInfo = getAllExecsFromPlan(parsedPlans.toSeq) + val sortAggregate = execInfo.filter(_.exec == "SortAggregate") + assertSizeAndSupported(2, sortAggregate) + } + } + + test("Parse Exec - ObjectHashAggregate") { + TrampolineUtil.withTempDir { eventLogDir => + val (eventLog, _) = ToolTestUtils.generateEventLog(eventLogDir, "sqlmetric") { spark => + import spark.implicits._ + val df1 = Seq((1, "a"), (1, "aa"), (1, "a"), (2, "b"), + (2, "b"), (3, "c"), (3, "c")).toDF("num", "letter") + df1.groupBy("num").agg(collect_list("letter").as("collected_letters")) + } + val pluginTypeChecker = new PluginTypeChecker() + val app = createAppFromEventlog(eventLog) + assert(app.sqlPlans.size == 1) + val parsedPlans = app.sqlPlans.map { case (sqlID, plan) => + SQLPlanParser.parseSQLPlan(plan, sqlID, pluginTypeChecker, app) + } + val execInfo = getAllExecsFromPlan(parsedPlans.toSeq) + val objectHashAggregate = execInfo.filter(_.exec == "ObjectHashAggregate") + assertSizeAndSupported(2, objectHashAggregate) + } + } + + test("WindowExec") { + TrampolineUtil.withTempDir { eventLogDir => + val (eventLog, _) = ToolTestUtils.generateEventLog(eventLogDir, "sqlmetric") { spark => + import spark.implicits._ + val metrics = Seq( + (0, 0, 0), (1, 0, 1), (2, 5, 2), (3, 0, 3), (4, 0, 1), (5, 5, 3), (6, 5, 0) + ).toDF("id", "device", "level") + val rangeWithTwoDevicesById = Window.partitionBy('device).orderBy('id). + rangeBetween(start = -1, end = Window.currentRow) + metrics.withColumn("sum", sum('level) over rangeWithTwoDevicesById) + } + val pluginTypeChecker = new PluginTypeChecker() + val app = createAppFromEventlog(eventLog) + assert(app.sqlPlans.size == 1) + val parsedPlans = app.sqlPlans.map { case (sqlID, plan) => + SQLPlanParser.parseSQLPlan(plan, sqlID, pluginTypeChecker, app) + } + val execInfo = getAllExecsFromPlan(parsedPlans.toSeq) + val windowExecs = execInfo.filter(_.exec == "Window") + assertSizeAndSupported(1, windowExecs) + } + } + + test("Parse Pandas execs - AggregateInPandas, ArrowEvalPython, " + + "FlatMapGroupsInPandas, MapInPandas, WindowInPandas") { + val eventLog = s"$qualLogDir/pandas_execs_eventlog.zstd" + val pluginTypeChecker = new PluginTypeChecker() + val app = createAppFromEventlog(eventLog) + assert(app.sqlPlans.size > 0) + val parsedPlans = app.sqlPlans.map { case (sqlID, plan) => + SQLPlanParser.parseSQLPlan(plan, sqlID, pluginTypeChecker, app) + } + val allExecInfo = getAllExecsFromPlan(parsedPlans.toSeq) + val flatMapGroups = allExecInfo.filter(_.exec == "FlatMapGroupsInPandas") + assertSizeAndSupported(1, flatMapGroups) + val aggregateInPandas = allExecInfo.filter(_.exec == "AggregateInPandas") + assertSizeAndSupported(1, aggregateInPandas) + val arrowEvalPython = allExecInfo.filter(_.exec == "ArrowEvalPython") + assertSizeAndSupported(1, arrowEvalPython) + val mapInPandas = allExecInfo.filter(_.exec == "MapInPandas") + assertSizeAndSupported(1, mapInPandas) + val windowInPandas = allExecInfo.filter(_.exec == "WindowInPandas") + assertSizeAndNotSupported(1, windowInPandas) + } + // GlobalLimit and LocalLimit is not in physical plan when collect is called on the dataframe. // We are reading from static eventlogs to test these execs. test("Parse execs - LocalLimit and GlobalLimit") {