此頁面說明 Spark Connect 架構、Spark Connect 的優點,以及如何升級到 Spark Connect。

讓我們從探索 Spark Connect 的高階架構開始。

高階 Spark Connect 架構

Spark Connect 是一種通訊協定,指定客戶端應用程式如何與遠端 Spark Server 進行通訊。實作 Spark Connect 通訊協定的客戶端可以連線並對遠端 Spark Server 提出要求,這與客戶端應用程式使用 JDBC 驅動程式連線至資料庫的方式非常類似,查詢 spark.table("some_table").limit(5) 應該只會傳回結果。此架構為最終使用者提供絕佳的開發人員體驗。

以下是 Spark Connect 在高階運作的方式

  1. 在客戶端和 Spark Server 之間建立連線
  2. 客戶端將資料框架查詢轉換為未解析的邏輯計畫,描述作業的意圖,而不是說明應該如何執行作業
  3. 未解析的邏輯計畫會編碼並傳送到 Spark Server
  4. Spark Server 最佳化並執行查詢
  5. Spark Server 將結果傳送回客戶端

讓我們更詳細地了解這些步驟,以更深入瞭解 Spark Connect 的內部運作方式。

在客戶端和 Spark Server 之間建立連線

Spark Connect 的網路通訊使用 gRPC 架構

gRPC 效能良好且與語言無關,這讓 Spark Connect 具備可攜性。

將 DataFrame 查詢轉換為未解析的邏輯計畫

用戶端會剖析 DataFrame 查詢並將其轉換為未解析的邏輯計畫。

假設您有以下 DataFrame 查詢:spark.table("some_table").limit(5)

以下是該查詢的未解析邏輯計畫

== Parsed Logical Plan ==
GlobalLimit 5
+- LocalLimit 5
   +- SubqueryAlias spark_catalog.default.some_table
      +- UnresolvedRelation spark_catalog.default.some_table

用戶端負責建立未解析的邏輯計畫並將其傳遞給 Spark Server 執行。

將未解析的邏輯計畫傳送至 Spark Server

必須序列化未解析的邏輯計畫,才能透過網路傳送。Spark Connect 使用 Protocol Buffers,它是「與語言無關、與平台無關的可擴充機制,用於序列化結構化資料」。

用戶端和 Spark Server 必須能夠使用 Protocol Buffers 等與語言無關的格式進行通訊,因為它們可能使用不同的程式語言或不同的軟體版本。

現在讓我們來看看 Spark Server 如何執行查詢。

在 Spark Server 上執行查詢

Spark Server 收到未解析的邏輯計畫(一旦 Protocol Buffer 被反序列化)並分析、最佳化和執行它,就像任何其他查詢一樣。

Spark 在執行查詢之前,會對未解析的邏輯計畫執行許多最佳化。所有這些最佳化都在 Spark Server 上進行,並且與用戶端應用程式無關。

Spark Connect 讓您能利用 Spark 強大的查詢最佳化功能,即使是與 Spark 或 JVM 無關的用戶端也可以。

將結果傳送回用戶端

Spark Server 在執行查詢後將結果傳送回用戶端。

結果以 Apache Arrow 記錄批次傳送至用戶端。單一記錄批次包含許多資料列。

完整結果會以記錄批次的局部區塊串流傳輸至用戶端,而不是一次全部傳輸。將結果從 Spark Server 串流傳輸至用戶端可以防止因過大的要求而導致的記憶體問題。

以下是 Spark Connect 運作方式的圖片摘要

Spark Connect 的好處

現在讓我們來關注 Spark Connect 架構的好處。

Spark Connect 工作負載更容易維護

當您不使用 Spark Connect 時,用戶端和 Spark Driver 必須執行相同的軟體版本。它們需要相同的 Java、Scala 和其他依賴項版本。假設您在本地電腦上開發一個 Spark 專案,將其封裝為 JAR 檔案,並將其部署到雲端以在生產資料集上執行。您需要在本地電腦上使用雲端中使用的相同依賴項來建置 JAR 檔案。如果您使用 Scala 2.13 編譯 JAR 檔案,您也必須使用 Scala 2.13 編譯的 Spark JAR 來配置叢集。

假設您使用 Scala 2.12 建置 JAR,而您的雲端供應商發布了使用 Scala 2.13 建置的新執行時期。當您不使用 Spark Connect 時,您需要在本地更新專案,這可能會很有挑戰性。例如,當您將專案更新為 Scala 2.13 時,您還必須將所有專案相依性 (和遞移相依性) 升級到 Scala 2.13。如果其中一些 JAR 檔案不存在,您就無法升級。

相反地,Spark Connect 將用戶端和 Spark Driver 分離,因此您可以更新 Spark Driver,包括伺服器端相依性,而無需更新用戶端。這使得 Spark 專案更容易維護。特別是對於純 Python 工作負載,將 Python 與用戶端上的 Java 相依性分離可改善 Apache Spark 的整體使用者體驗。

Spark Connect 讓您可以在非 JVM 語言中建置 Spark Connect 用戶端

Spark Connect 將用戶端和 Spark Driver 分離,讓您可以使用任何語言撰寫 Spark Connect 用戶端。以下是一些不依賴 Java/Scala 的 Spark Connect 用戶端

例如,Apache Spark Connect 用戶端 for Golang,spark-connect-go,實作 Spark Connect 協定,且不依賴 Java。您可以使用這個 Spark Connect 用戶端來開發 Spark 應用程式,而無需安裝 Java 或 Spark。

以下是如何使用 spark-connect-go 使用 Go 程式語言執行查詢

spark, _ := sql.SparkSession.Builder.Remote(remote).Build()
df, _ := spark.Sql("select * from my_cool_table where age > 42")
df.Show(100, false)

當呼叫 df.Show() 時,spark-connect-go 會將查詢處理成未解析的邏輯計畫,然後傳送給 Spark Driver 執行。

spark-connect-go 是 Spark Connect 分離性質如何允許更好的最終使用者體驗的一個絕佳範例。

Go 並不是唯一會從這個架構中受益的語言。

Spark Connect 允許更好的遠端開發和測試

Spark Connect 也讓您可以在遠端叢集上的文字編輯器中嵌入 Spark,而無需 SSH(「遠端開發」)。

當您不使用 Spark Connect 時,將 Spark 嵌入文字編輯器中需要在本地執行 Spark Session 或透過 SSH 連線到遠端 Spark Driver。

Spark Connect 讓您能透過完全嵌入在文字編輯器中的連線,連線到遠端 Spark Driver,而不需要 SSH。這讓使用者在遠端 Spark 集群上使用文字編輯器(例如 VS Code)開發程式碼時,能有更好的體驗。

使用 Spark Connect,可以輕鬆地從本機 Spark Session 切換到遠端 Spark Session,只要變更連線字串即可。

Spark Connect 讓除錯變得更容易

Spark Connect 讓您可以將文字編輯器(例如 IntelliJ)連線到遠端 Spark 集群,並使用除錯器逐步執行您的程式碼。您可以除錯在生產資料集上執行的應用程式,就像在您的本機上針對測試資料集除錯一樣。這能提供極佳的開發人員體驗,特別是當您想要利用 IDE 中內建的高品質除錯工具時。

Spark JVM 不允許這種除錯體驗,因為它無法完全與文字編輯器整合。Spark Connect 讓您能在文字編輯器中建立緊密的整合,並為遠端 Spark 工作流程提供絕佳的除錯體驗。只要切換 Spark Connect 會話的連線字串,就能輕鬆設定用戶端在不同的執行環境中執行測試,而不需要部署複雜的 Spark 應用程式。

Spark Connect 更穩定

由於利用 Spark Connect 的用戶端應用程式具有分離的特性,因此用戶端的故障現在與 Spark Driver 分離。這表示當用戶端應用程式發生故障時,其故障模式與其他應用程式完全無關,也不會影響可能持續為其他用戶端應用程式提供服務的 Spark Driver。

升級到 Spark Connect

Spark Connect 並不支援所有 Spark JVM API。例如,Spark JVM 有私有方法,有些使用者會利用這些方法在 Spark 集群上執行任意 Java 程式碼。Spark Connect 顯然無法支援這些方法,因為 Spark Connect 用戶端不一定會執行 Java!

查看從 Spark JVM 遷移至 Spark Connect 的指南,以進一步瞭解如何撰寫與 Spark Connect 搭配使用的程式碼。此外,查看如何建置 Spark Connect 自訂擴充功能,以瞭解如何使用專業邏輯。

結論

Spark Connect 是在生產環境中執行 Spark 的更佳架構。它更具彈性、更容易維護,並提供更好的開發人員體驗。

將部分 Spark JVM 程式碼庫遷移至 Spark Connect 很容易,但其他程式碼庫的遷移具有挑戰性。使用 RDD API 或使用私有 Spark JVM 函式的程式碼庫更難以遷移。

然而,從 Spark JVM 遷移至 Spark Connect 是單次成本,因此您在遷移後將享有所有好處。

最新消息

檔案