Apache Spark 是一個平行處理架構,可支援記憶體內部處理,以大幅提升巨量資料分析應用程式的效能。 Azure Synapse Analytics 中的 Apache Spark 是 Microsoft 在雲端中的其中一種 Apache Spark 實作。
Azure Synapse 現在可讓您建立支援 Azure Synapse GPU 的集區,以使用可利用 GPU 大量平行處理功能來加速處理的基礎 RAPIDS 程式庫,執行 Spark 工作負載。 RAPIDS Accelerator for Apache Spark 可讓您執行現有的 Spark 應用程式,而無須變更任何程式碼,只要啟用為支援 GPU 的集區預先設定的組態設定即可。 您可以藉由設定此設定,選擇為您的工作負載或部分工作負載開啟/關閉 RAPIDS 型 GPU 加速:
spark.conf.set('spark.rapids.sql.enabled','true/false')
注意
Azure Synapse 啟用 GPU 預覽功能集區現已取代。
Apache Spark 的 RAPIDS 加速器
Spark RAPIDS 加速器是一種外掛程式,其運作方式是透過支援的 GPU 作業覆寫 Spark 作業的實體方案,並在 GPU 上執行這些作業,進而加快處理的過程。 此程式庫目前為預覽狀態,不支援所有 Spark 作業 (這裡列出目前支援的運算子,並透過新發行累加方式新增更多支援)。
叢集組態選項
RAPIDS 加速器外掛程式僅支援 GPU 與執行程式之間的一對一對應。 這表示 Spark 作業必須要求可由集區資源支應的執行程式和驅動程式資源 (根據可用的 GPU 和 CPU 核心數目)。 為了符合這種情況,並確保所有集區資源都能有最佳使用率,我們需要針對在已啟用 GPU 的集區上執行的 Spark 應用程式進行下列驅動程式和執行程式設定:
| 集區大小 | 驅動程式大小選項 | 驅動程式核心 | 驅動程式記憶體 (GB) | 執行程式核心 | 執行程式記憶體 (GB) | 執行程式數目 |
|---|---|---|---|---|---|---|
| GPU-Large | 小型驅動程式 | 4 | 30 | 12 | 六十 | 集區中的節點數目 |
| GPU-Large | 中型驅動程式 | 7 | 30 | 9 | 六十 | 集區中的節點數目 |
| GPU-XLarge | 中型驅動程式 | 8 | 40 | 14 | 80 | 4 * 集區中的節點數目 |
| GPU-XLarge | 大型驅動程式 | 12 | 40 | 13 | 80 | 4 * 集區中的節點數目 |
任何不符合上述設定的工作負載,均不接受。 這麼做的目的是為了確保 Spark 作業會使用集區上的所有可用資源,以最有效率且高效能的設定來執行。
使用者可透過其工作負載設定上述設定。 在筆記本中,使用者可使用 %%configure Magic 命令來設定上述其中一個設定,如下所示。
例如,使用具有三個節點的大型集區:
%%configure -f
{
"driverMemory": "30g",
"driverCores": 4,
"executorMemory": "60g",
"executorCores": 12,
"numExecutors": 3
}
透過筆記本在 Azure Synapse GPU 加速集區上執行範例 Spark 作業
在繼續本節之前,最好先熟悉如何在 Azure Synapse Analytics 中使用筆記本的基本概念。 我們將逐步討論使用 GPU 加速執行 Spark 應用程式的步驟。 您可以用 Synapse、PySpark (Python)、Spark (Scala)、SparkSQL 及 .NET for Spark (C#) 中支援的四種語言,來撰寫 Spark 應用程式。
建立已啟用 GPU 的集區。
建立筆記本,並將其附加至您在第一個步驟中建立、已啟用 GPU 功能的集區。
依照上一節的說明進行設定。
在筆記本的第一個儲存格中複製下列程式碼,以建立範例資料框架:
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.Row
import scala.collection.JavaConversions._
val schema = StructType( Array(
StructField("emp_id", IntegerType),
StructField("name", StringType),
StructField("emp_dept_id", IntegerType),
StructField("salary", IntegerType)
))
val emp = Seq(Row(1, "Smith", 10, 100000),
Row(2, "Rose", 20, 97600),
Row(3, "Williams", 20, 110000),
Row(4, "Jones", 10, 80000),
Row(5, "Brown", 40, 60000),
Row(6, "Brown", 30, 78000)
)
val empDF = spark.createDataFrame(emp, schema)
- 現在讓我們來進行彙總,方法是取得每個部門識別碼的最高薪資,並顯示結果:
val resultDF = empDF.groupBy("emp_dept_id").max("salary")
resultDF.show()
- 您可以透過 Spark 記錄伺服器查看 SQL 方案,以檢視您在 GPU 上執行之查詢中的作業:

如何針對 GPU 微調您的應用程式
大部分的 Spark 作業都可藉由微調預設值的設定來查看改進的效能,而運用 Apache Spark 的 RAPIDS 加速器外掛程式執行的作業也是如此。
已啟用 Azure Synapse GPU 功能的集區中的配額和資源限制
工作區層級
每個 Azure Synapse 工作區都附有 50 個 GPU 虛擬核心的預設配額。 為了增加 GPU 核心的配額,請透過 Azure 入口網站提交支援要求。