本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

在 Kubernetes 1.2 上使用 Spark 和 Zeppelin 處理大資料

編者按:這是關於 Kubernetes 1.2 新功能的一系列深度文章中的第五篇。

隨著大資料使用量的指數級增長,許多 Kubernetes 客戶表示有興趣在其 Kubernetes 叢集上執行 Apache Spark,以利用容器的可移植性和靈活性。幸運的是,藉助 Kubernetes 1.2,您現在可以擁有一個同時執行 Spark、Zeppelin 和其他應用程式的平臺。

為什麼選擇 Zeppelin? 

Apache Zeppelin 是一個基於 Web 的筆記本,可實現互動式資料分析。作為其後端之一,Zeppelin 連線到 Spark。Zeppelin 允許使用者以簡單的方式與 Spark 叢集互動,而無需處理命令列直譯器或 Scala 編譯器。

為什麼選擇 Kubernetes? 

在 Kubernetes 之外有多種方式執行 Spark

  • 您可以使用專用資源以獨立模式執行它 
  • 您可以在 YARN 叢集上執行它,與 Hadoop 和 HDFS 共同駐留 
  • 您可以在 Mesos 叢集上與其他 Mesos 應用程式一起執行它 

那麼為什麼要在 Kubernetes 上執行 Spark 呢?

  • 叢集的單一統一介面:Kubernetes 可以管理各種工作負載;無需為資料處理處理 YARN/HDFS,也無需為其他應用程式處理單獨的容器編排器。 
  • 提高伺服器利用率:在 Spark 和雲原生應用程式之間共享節點。例如,您可能有一個流式應用程式正在執行,用於向流式 Spark 管道饋送資料,或者一個 Nginx Pod 用於服務 Web 流量——無需靜態劃分節點。 
  • 工作負載之間的隔離:Kubernetes 的服務質量機制允許您安全地將 Spark 等批處理工作負載與對延遲敏感的伺服器排程到相同的節點上。 

啟動 Spark 

對於此演示,我們將使用 Google Container Engine (GKE),但這應該適用於您已安裝 Kubernetes 叢集的任何地方。首先,使用 storage-full 範圍建立一個 Container Engine 叢集。這些 Google Cloud Platform 範圍將允許叢集寫入私有 Google Cloud Storage Bucket(我們稍後會解釋為什麼需要它): 

$ gcloud container clusters create spark --scopes storage-full
--machine-type n1-standard-4

注意:我們使用 n1-standard-4(大於預設節點大小)來演示水平 Pod 自動擴縮的一些功能。但是,Spark 在預設節點大小 n1-standard-1 上執行良好。

叢集建立後,您就可以使用 Kubernetes GitHub 儲存庫中的配置檔案在 Kubernetes 上啟動 Spark

$ git clone https://github.com/kubernetes/kubernetes.git
$ kubectl create -f kubernetes/examples/spark

‘kubernetes/examples/spark’ 是一個目錄,因此此命令告訴 kubectl 建立該目錄中所有 YAML 檔案中定義的所有 Kubernetes 物件。您不必克隆整個儲存庫,但這會使此演示的步驟稍微容易一些。

Pod(尤其是 Apache Zeppelin)有點大,因此 Docker 可能需要一些時間來拉取映象。一切執行後,您應該會看到類似以下的內容

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
spark-master-controller-v4v4y 1/1 Running 0 21h
spark-worker-controller-7phix 1/1 Running 0 21h
spark-worker-controller-hq9l9 1/1 Running 0 21h
spark-worker-controller-vwei5 1/1 Running 0 21h
zeppelin-controller-t1njl 1/1 Running 0 21h

您可以看到 Kubernetes 正在執行一個 Zeppelin 例項、一個 Spark 主節點和三個 Spark 工作節點。

設定到 Zeppelin 的安全代理 

接下來,您將設定從本地機器到 Zeppelin 的安全代理,以便您可以從本地機器訪問叢集中執行的 Zeppelin 例項。(注意:您需要將此命令更改為叢集上建立的實際 Zeppelin Pod。)

$ kubectl port-forward zeppelin-controller-t1njl 8080:8080

這建立了到 Kubernetes 叢集和 Pod (zeppelin-controller-t1njl) 的安全連結,然後將相關埠 (8080) 轉發到本地埠 8080,這將允許您安全地使用 Zeppelin。

現在 Zeppelin 已經啟動並執行,我該如何使用它呢? 

在我們的示例中,我們將向您展示如何構建一個簡單的電影推薦模型。這基於 Spark 網站上的程式碼,略作修改以使其對 Kubernetes 更具吸引力。 

現在安全代理已啟動,請訪問 https://:8080/。您應該會看到一個介紹頁面,如下所示

點選“匯入筆記”,給它一個任意名稱(例如“電影”),然後點選“從 URL 新增”。對於 URL,輸入

https://gist.githubusercontent.com/zmerlynn/875fed0f587d12b08ec9/raw/6
eac83e99caf712482a4937800b17bbd2e7b33c4/movies.json

然後點選“匯入筆記”。這將為您提供此演示的現成 Zeppelin 筆記。您現在應該有一個“電影”筆記本(或您命名的任何名稱)。如果您點選該筆記,您應該會看到一個類似的螢幕

您現在可以點選 PySpark 程式碼塊右上角的“播放”按鈕,您將建立一個新的、記憶體中的電影推薦模型!在 Spark 應用程式模型中,Zeppelin 作為 Spark 驅動程式,與 Spark 叢集主節點互動以完成其工作。在這種情況下,在 Zeppelin Pod 中執行的驅動程式會獲取資料並將其傳送到 Spark 主節點,主節點將其分發給工作節點,工作節點使用驅動程式中的程式碼計算出電影推薦模型。如果 Google Cloud Storage (GCS) 中有更大的資料集,也可以輕鬆地從 GCS 拉取資料。在下一節中,我們將討論如何將資料儲存到 GCS。

使用 Google Cloud Storage(可選) 

對於此演示,我們將使用 Google Cloud Storage,它允許我們儲存模型資料,使其超越單個 Pod 的生命週期。Kubernetes 版 Spark 內建了 Google Cloud Storage 聯結器。只要您可以在執行 Kubernetes 節點的 Google Container Engine 專案中的虛擬機器訪問資料,您就可以使用 Spark 映象上的 GCS 聯結器訪問資料。

如果您願意,可以更改筆記頂部的變數,以便示例實際上儲存並恢復電影推薦引擎的模型——只需將這些變數指向您可以訪問的 GCS 儲存桶即可。如果您想建立 GCS 儲存桶,您可以在命令列上執行類似以下操作

$ gsutil mb gs://my-spark-models

您需要將此 URI 更改為對您來說獨一無二的名稱。這將建立一個您可以在上述示例中使用的儲存桶。

將水平 Pod 自動擴縮與 Spark 結合使用(可選) 

Spark 對工作節點的來去具有一定的彈性,這意味著我們有機會:我們可以使用 Kubernetes 水平 Pod 自動擴縮來自動擴縮 Spark 工作節點池,為工作節點設定目標 CPU 閾值和最小/最大池大小。這消除了手動配置工作節點副本數量的需要。

像這樣建立自動擴縮器(注意:如果您沒有更改叢集的機器型別,您可能希望將 --max 限制為較小的值): 

$ kubectl autoscale --min=1 --cpu-percent=80 --max=10 \
  rc/spark-worker-controller

要檢視自動擴縮的完整效果,請等待複製控制器穩定回一個副本。使用 ‘kubectl get rc’ 並等待 spark-worker-controller 上的“replicas”列回落到 1。

我們之前執行的工作負載執行得太快,對 HPA 來說沒有太大意義。要更改工作負載使其執行足夠長時間以看到自動擴縮啟用,請將程式碼中的“rank = 100”行更改為“rank = 200”。點選播放後,Spark 工作節點池應該會迅速增加到 20 個 Pod。作業完成後,工作節點池需要長達 5 分鐘才能回落到一個副本。

結論

在本文中,我們向您展示瞭如何在 Kubernetes 上執行 Spark 和 Zeppelin,以及如何使用 Google Cloud Storage 儲存 Spark 模型,以及如何使用水平 Pod 自動擴縮動態調整 Spark 工作節點池的大小。

這是一系列關於如何在 Kubernetes 上執行大資料框架的文章中的第一篇——敬請關注!

請加入我們的社群,幫助我們構建 Kubernetes 的未來!有很多參與方式。如果您對 Kubernetes 和大資料特別感興趣,您會對以下內容感興趣