Spark 適用的 RAPIDS 加速器無需使用者變更 API,且會用 GPU 作業取代其所支援的 SQL 操作。如要查看哪些作業受到 GPU 作業所取代,可呼叫 explain 方法印出 DataFrame 的實體計畫,該計畫詳載 GPU 上所有以 GPU 為前綴的作業。
現在請針對我們在第 1 章探討過的部分查詢項目,比較 DataFrame 實體計畫與 GPU 處理的結果。在下方的實體計畫中,DAG 包括一個 GpuBatchScan、一個以小時為單位的 GpuFilter、一個以小時為單位的 GpuProject (選擇欄)、fare_amount (車資) 以及 day_of_week (星期)。用 CPU 處理時,這份計畫包括 FileScan、Filter 及 Project。
// 選擇與篩選為縮窄轉換 (narrow transformation)
df.select($"hour", $"fare_amount").filter($"hour" === "0.0" ).show(2)
result:
+----+-----------+
|hour|fare_amount|
+----+-----------+
| 0.0| 10.5|
| 0.0| 12.5|
+----+-----------+
df.select($"hour", $"fare_amount").filter($"hour" === "0.0" ).explain
result:
== Physical Plan ==
*(1) GpuColumnarToRow false<
+- !GpuProject [hour#10, fare_amount#9]
+- GpuCoalesceBatches TargetSize(1000000,2147483647)
+- !GpuFilter (gpuisnotnull(hour#10) AND (hour#10 =0.0))
+- GpuBatchScan[fare_amount#9, hour#10] GpuCSVScan Location:
InMemoryFileIndex[s3a://spark-taxi-dataset/raw-small/train], ReadSchema: struct<fare_amount:double,hour:double>
請注意,原始計畫中的多數節點皆已由 GPU 版本所取代。RAPIDS 加速器插入資料格式轉換節點,例如 GpuColumnarToRow 及 GpuRowToColumnar,以便針對會在 GPU 上執行之節點的欄式處理及會在 CPU 上執行之節點的列處理之間轉換。 如要瞭解部分查詢無法於 GPU 上執行的原因,請將設定 spark.rapids.sql.explain 改為 true。輸出會記錄於驅動程式的記錄檔或以互動模式顯示於螢幕。