Livy 系列 - 基於 Spark 的 REST 服務 Livy 簡介#
內容整理自:
Livy 簡介#
Apache Livy 是一個基於 Spark 的開源 REST 服務,它能夠以 REST 的方式將代碼片段或是序列化的二進制代碼提交到 Spark 集群中去執行,它提供了以下這些基本功能:
- 提交 Scala, Python 或是 R 代碼片段到遠端的 Spark 集群上執行。
- 提交 Java, Scala, Python 所編寫的 Spark 作業到遠端的 Spark 集群上執行。
- 提交批處理應用到集群中運行
關於 Livy REST API 的使用,參考官方文檔
Livy 基本架構#
Livy 是一個典型的 REST 服務架構,它一方面接受並解析用戶的 REST 請求,轉換成相應的操作;另一方面它管理著用戶所啟動的所有的 Spark 集群
用戶可以以 REST 請求的方式通過 Livy 啟動一個新的 Spark 集群,Livy 將每一個啟動的 Spark 集群稱之為一個會話 (session),一個會話是由一個完整的 Spark 集群所構成的,並且通過 RPC 協議在 Spark 集群和 Livy 服務端之間進行通信。根據處理交互方式的不同,Livy 將會話分成了兩種類型:
交互式會話(interactive session)
。這與 Spark 中的交互式處理相同,交互式會話在其啟動後可以接收用戶所提交的代碼片段,在遠端的 Spark 集群上編譯並執行。批處理會話(batch session)
。用戶可以通過 Livy 以批處理的方式啟動 Spark 應用,這樣的一個方式在 Livy 中稱之為批處理會話,這與 Spark 中的批處理是相同的
Livy 的企業級特性#
多用戶支持#
假定用戶 tom 向 Livy 服務端發起 REST 請求啟動一個新的會話,而 Livy 服務端則是由用戶 livy 啟動的,這個時候所創建出來 Spark 集群的用戶是誰呢,會是用戶 tom 還是 livy?在默認情況下這個 Spark 集群的用戶是 livy。這會帶來訪問權限的問題:用戶 tom 無法訪問其擁有權限的資源,而相對的是他卻可以訪問用戶 livy 所擁有的資源。
為了解決這個問題 Livy 引入了Hadoop 中的代理用戶 (proxy user) 模式,代理用戶模式廣泛使用於多用戶的環境,如 HiveServer2。在此模式中超級用戶可以代理成普通用戶去訪問資源,並擁有普通用戶相應的權限。開啟了代理用戶模式後,以用戶 tom 所創建的會話所啟動的 Spark 集群用戶就會是 tom
端到端安全#
- 基於 Kerberos 的 Spnego 認證實現客戶端認證安全
- 使用標準的 SSL 來加密 Http 協議,保證客戶端與 Livy 服務端之間 Http 傳輸的安全性
- 基於 SASL 認證的 RPC 通信機制保證 Livy 服務端和 Spark 集群之間網絡通信安全
失敗恢復機制#
Livy 提供了失敗恢復的機制,當用戶啟動會話的同時 Livy 會在可靠的存儲上記錄會話相關的元信息,一旦 Livy 從失敗中恢復過來時它會試圖讀取相關的元信息並與 Spark 集群重新連接。
為了使用該特性我們需要進行以下 Livy 配置:
// 開啟失敗恢復功能
livy.server.recovery.mode: recovery
// 配置將元信息存儲在何種可靠存儲上,當前支持filesystem和zookeeper
livy.server.recovery.state-store
// 配置具體的存儲路徑,如果是filesystem則改配置為文件路徑;而zookeeper則為zookeeper集群的URL
livy.server.recovery.state-store.url
Livy 與 spark-jobserver 對比#
Livy 的優勢:
- Livy 不需要對代碼進行任何更改,而 SJS 作業必須擴展特定的類。
- Livy 允許提交代碼片段 (包括 Python) 以及預編譯的 jar,而 SJS 只接受 jar。
- 除了 REST 之外,Livy 還有 Java 和 Scala API。Python API 正在開發中,SJS 有一個 “python 綁定”
SJS 優勢:
- SJS 可以管理 jars,它允許您上傳和存儲 Jars,部署作業的時候只需要通過單獨的 REST 去調用。而 Livy 每次重新部署作業,都需要重新上傳這些 jar。
- 可以使用 HOCON 格式配置 SJS 作業,該格式可以作為 REST 調用提交
官方鏈接
Livy: https://livy.incubator.apache.org/
spark-jobserver: https://github.com/spark-jobserver/spark-jobserver