Spark용 RAPIDS 액셀러레이터는 사용자의 API 변경이 필요하지 않으며 지원하는 SQL 작업을 GPU 작업으로 대체합니다. GPU 작업으로 대체된 작업을 보려면 설명 방법을 호출하여 DataFrame에 대한 실제 계획을 인쇄할 수 있으며 GPU 접두사가 있는 모든 작업은 GPU에서 수행됩니다.
이제 DataFrame의 실제 계획을 챕터 1에서 살펴본 것과 동일한 쿼리에 대해 GPU 처리와 비교합니다. 아래 물리적 계획에서 DAG는 GpuBatchScan, hour에 대한 GpuFilter, 그리고 hour, fare_amount 및 day_of_week에 대한 GpuProject(열 선택)로 구성됩니다. CPU 처리를 통해 FileScan, 필터 및 프로젝트로 구성되었습니다.
// 선택 및 필터는 좁은 변환입니다.
df.select($"hour", $"fare_amount").filter($"hour" === "0.0" ).show(2)
결과:
+----+-----------+
|hour|fare_amount|
+----+-----------+
| 0.0| 10.5|
| 0.0| 12.5|
+----+-----------+
df.select($"hour", $"fare_amount").filter($"hour" === "0.0" ).explain
결과:
== 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 버전으로 대체되었는지 확인합니다. RAPID 액셀러레이터는 GpuColumnarToRow 및 GpuRowToColumnar와 같은 데이터 형식 변환 노드를 삽입하여 GPU에서 실행되는 노드의 기둥 처리와 CPU에서 실행되는 노드에 대한 행 처리 간에 변환합니다. 쿼리의 일부가 GPU에서 실행되지 않은 이유를 보려면 config spark.rapids.sql.explain를 true로 설정합니다. 출력은 드라이버의 로그 또는 대화형 모드의 화면에 기록됩니다.