當前位置:
首頁 > 最新 > 如何在 Kubernetes 環境中運行 Spark 集群

如何在 Kubernetes 環境中運行 Spark 集群

處理這麼大量的數據,背後的機器可能是數以千計,無法通過人工來監控機器的狀態。因此,本文將介紹用Kubernetes容器管理工具,並通過簡單示例,告訴你如何建立一個Spark集群。

準備階段

1.需要擁有正在運行的 Kubernetes 集群,並使用 Kubectl 為其配置訪問許可權。如果你還沒有可用的 Kubernetes 集群,則可以使用 Minikube 在本地計算機上設置測試集群 。

2.需要具有適當的許可權才能在集群中創建和列出 Pod,ConfigMaps 和 Secrets。想要確認,你可以通過運行 Kubectl Get Pods,Kubectl Get Configmap 以及 Kubectl Get Secrets 列出這些資源。

3.需要擁有 Kubernetes 支持的 Spark 配置。這可以從穩定版本的 Tarball 或通過建立 Kubernetes 支持的 Spark 來獲得。

準備鏡像和驅動

Kubernetes 要求用戶提供的鏡像可以部署到容器的 Pod 中。鏡像是要建立在一個 Kubernetes 支持的容器中運行的運行時環境。Docker 是一個經常與 Kubernetes 一起使用的容器運行時環境。所以 Spark 提供了一些與 Docker 一起快速入門的支持。

如果你希望使用已經構建好的 Docker 鏡像,則可以使用 Kubespark 中發布的鏡像 。鏡像如下:

你也可以從源代碼構建這些 Docker 鏡像,或根據需求自定義它們。分散式 Spark 包括基礎鏡像,驅動程序,執行程序,並分別對應 dockerfiles/spark-base/Dockerfile,dockerfiles/driver/Dockerfile, dockerfiles/executor/Dockerfile,和 dockerfiles/init-container/Dockerfile。

使用這些 Docker 文件來構建 Docker 鏡像,然後這些鏡像要發送到註冊中心進行標記。最後,將鏡像推送到註冊中心。

例如,如果註冊中心主機是 Registry-Host, 正在使用5000埠:

請注意,這個 Spark-Base 是其他鏡像的基礎鏡像。必須在其他鏡像之前構建,其他鏡像可以按任意順序構建。

把程序提交到 Kubernetes

Kubernetes 應用程序可以通過 Spark-Submit 執行。

例如,要計算 Pi 的值,假設鏡像如上所述設置:

通過 --Master 命令行將參數傳遞給 Spark-Submit 或通過 Spark.Master 在應用程序的配置中進行設置以便來指定的 Spark 主機必須是具有該格式的 URL k8s:// 。

使用主字元串前綴 K8s:// 將使 Spark 應用程序在 Kubernetes 集群上啟動,API 伺服器通過 Api_server_url 與之交互 。

如果 URL 中沒有指定 HTTP 協議,則默認為 https。

例如,將主伺服器設置 K8s://example.com:443 等同於將其設置為 K8s://https://example.com:443,但在不同埠上不使用 TLS 連接時,要將主伺服器將設置為 k8s://http://example.com:8443。

如果您有 Kubernetes 集群設置,則可以通過執行 Kubectl cluster-info 發現 Apiserver URL。

在上面的例子中,特定的 Kubernetes 集群可以通過指定 --master k8s://http://127.0.0.1:8080 參數來與 Spark-Submit 一起使用 。

請注意,當前只能在集群模式下執行應用程序,並且驅動程序及其執行程序也要在集群上運行。

最後,請注意,在上面的例子中,我們指定了一個具有特定 URI 的 Jar 包 Local:// 。該 URI 是已經在 Docker 鏡像中的示例 Jar 包的位置。下面討論使用計算機本地磁碟上的依賴關係。

當啟用 Kubernetes RBAC 時,默認驅動程序使用的服務帳戶可能沒有合適的 Pod 編輯許可權來啟動執行程序 Pod。我們建議添加另一個服務帳戶,比如擁有必要許可權的 Spark。例如:

依賴管理

從機器提交的應用程序依賴關係需要被發送到資源中轉伺服器 ,然後驅動程序和執行程序可以與之通信以檢索這些依賴關係。

表示運行此服務的最小 Kubernetes 資源的 YAML 文件位於該文件中 conf/kubernetes-resource-staging-server.yaml。這個 YAML 文件配置一個 ConfigMap 的資源中轉伺服器的 Pod,並通過一個帶有固定節點埠的服務公開服務。

使用包含 YAML 文件部署資源中轉伺服器需要您具有創建部署,服務和配置映射的許可權。

要使用默認配置運行資源中轉伺服器,可以創建 Kubernetes 資源:

然後你可以像下面例子一樣計算 Pi 的值:

資源中轉伺服器的 Docker 鏡像也可以從源代碼構建,類似於驅動程序和執行程序鏡像。

Dockerfile 提供了 dockerfiles/resource-staging-server/Dockerfile。

提供的 YAML 文件專門將服務規範中的 NodePort 設置為31000。如果埠31000在群集的任何節點上都不可用,則應從服務規範中刪除 NodePort 欄位,並允許 Kubernetes 群集確定 NodePort。

請確保在提交你的應用程序時,根據 Kubernetes 集群選擇的 NodePort 在資源中轉伺服器 URI 中是可用的埠。

沒有資源中轉伺服器的依賴管理

請注意,此資源中轉伺服器僅用於提交本地依賴項。如果你的應用程序的依賴關係全部託管在遠程位置(如 HDFS 或 HTTP 伺服器)中,那麼它們可能會被其適當的遠程 URI 引用。此外,應用程序依賴關係可以預先安裝到定製的 Docker 鏡像中。這些依賴關係可以通過在 Local://URI 中引用它們和用 / 或 SPARK_EXTRA_CLASSPATH 在 Dockerfiles 中設置環境變數來添加到類路徑中。

訪問 Kubernetes 集群

Spark-Submit 也支持通過本地 Kubectl 代理提交 。

可以使用身份驗證代理直接與 Api 伺服器進行通信,而無需將憑證傳遞給 Spark-Submit。 本地代理可以通過運行下面的命令啟動:

如果我們的本地代理正在監聽8001埠,我們會提交如下所示的代碼:

Spark 和 Kubernetes 集群之間的通信是使用 Fabric8 Kubernetes-Client 庫執行的。當我們擁有 Fabric8 Kubernetes-Client 庫不支持的認證提供者時,可以使用上述機制。目前支持使用 X509 客戶端證書和 OAuth 令牌進行身份驗證。

運行 PySpark

在 Kubernetes 上運行 PySpark 時和在 Yarn 和 Mesos 上啟動時使用相同的 Spark-Submit 邏輯。Python 文件可以通過在 --Py-files 設置,

以下是一個示例提交:

Kubernetes 中的動態分配

Kubernetes 上的 Spark 支持集群模式下的動態分配。此模式需要運行外部 Shuffle 服務。這是一個典型的 Daemonset 與 Provisioned Hostpath Volume 。這個 Shuffle 服務可以由屬於不同的 SparkJobs 的執行者共享。

舉例來說,如果我們要使用的 Shuffle 服務在默認的命名空間,與 Pods app=spark-shuffle-service 和 Spark-version=2.2.0,我們可以使用這些標籤來定位工作啟動時指定的 Shuffle 服務。為了運行啟用動態分配的作業,該命令可能如下所示:

外部 Shuffle 服務必須安裝可以與執行程序 Pod 共享的目錄。提供的示例 YAML 規範將 HostPath 卷掛載到外部 Shuffle 服務 Pod,但這些 HostPath 卷也必須掛載到執行程序中。

為確保不會意外掛載不正確的 HostPath 卷,Spark.Local.Dir 在使用 Kubernetes 時,必須在應用程序的配置中指定值,儘管在使用其他群集管理器時默認為 JVM 的臨時目錄。

高級

使用 TLS 保護資源中轉伺服器

資源中轉伺服器的默認配置不通過 TLS 進行保護。強烈建議將其配置為保護通過中轉伺服器提交的密鑰和 Jar 文件。

YAML 文件 Conf/kubernetes-resource-staging-server.yaml 包含保存資源中轉伺服器配置的 ConfigMap 資源。

可以在這裡調整屬性以使資源中轉伺服器監聽 TLS。

請參閱安全性頁面以獲取與 TLS 相關的可用設置。

資源中轉伺服器的命名空間是 Kubernetes.ResourceStagingServer ,例如,伺服器的密鑰庫的路徑將被設置 Spark.ssl.Kubernetes.ResourceStagingServer.KeyStore。

除了之前鏈接的安全頁面指定的設置之外,資源中轉伺服器還支持以下附加配置:

請注意,儘管可以在 ConfigMap 中設置屬性,但仍然需要考慮將適當的密鑰文件安裝到資源中轉伺服器的容器中。

一個常見的機制就是使用 Kubernetes 機密作為秘密卷。請參閱相應的 Kubernetes 文檔以獲取指導,並相應地調整提供的 YAML 文件中的資源中轉伺服器規範。

最後,在提交應用程序時,你必須指定一個 TrustStore 或一個 PEM 編碼的證書文件,以通過 TLS 與資源中轉伺服器進行通信。

可以設置 TrustStore,也可以設置 spark.ssl.kubernetes.resourceStagingServer.trustStore 證書文件 spark.ssl.kubernetes.resourceStagingServer.clientCertPem 。

例如,我們的 SparkPi 示例如下所示:

視頻鏈接:https://www.youtube.com/watch?v=UywgL70FQ3s

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 JFrog傑蛙DevOps 的精彩文章:

TAG:JFrog傑蛙DevOps |