本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
使用 Spark 和 Zeppelin 在 Kubernetes 1.2 上處理大數據
編者註:這是關於 Kubernetes 1.2 新功能的深入文章系列中的第五篇貼文
隨著大數據使用量呈指數級成長,許多 Kubernetes 客戶表示有興趣在其 Kubernetes 叢集上執行 Apache Spark,以利用容器的可攜性和彈性。幸運的是,透過 Kubernetes 1.2,您現在可以擁有一個平台,可以並排執行 Spark 和 Zeppelin 以及您的其他應用程式。
為何選擇 Zeppelin?
Apache Zeppelin 是一個基於 Web 的筆記本,可實現互動式資料分析。作為其後端之一,Zeppelin 連接到 Spark。Zeppelin 允許使用者以簡單的方式與 Spark 叢集互動,而無需處理命令列直譯器或 Scala 編譯器。
為何選擇 Kubernetes?
在 Kubernetes 之外,有很多方法可以執行 Spark
那麼,為何要在 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 儲存貯體(稍後我們將說明為何需要這樣):
$ 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 master 和三個 Spark worker。
設定 Zeppelin 的安全 Proxy
接下來,您將設定從本機到 Zeppelin 的安全 Proxy,以便您可以從本機存取在叢集中執行的 Zeppelin 實例。(注意:您需要將此命令變更為叢集上建立的實際 Zeppelin Pod。)
$ kubectl port-forward zeppelin-controller-t1njl 8080:8080
這會建立到 Kubernetes 叢集和 Pod (zeppelin-controller-t1njl
) 的安全連結,然後將相關連接埠 (8080) 轉發到本機連接埠 8080,這將允許您安全地使用 Zeppelin。
現在我已啟動並執行 Zeppelin,我該如何使用它?
在我們的範例中,我們將向您展示如何建構一個簡單的電影推薦模型。這基於 Spark 網站上的程式碼,稍作修改以使其對 Kubernetes 更有趣。
現在安全 Proxy 已啟動,請造訪 https://127.0.0.1:8080/。您應該會看到類似這樣的簡介頁面
按一下「匯入筆記」,給它一個任意名稱(例如「電影」),然後按一下「從 URL 新增」。對於 URL,輸入
https://gist.githubusercontent.com/zmerlynn/875fed0f587d12b08ec9/raw/6
eac83e99caf712482a4937800b17bbd2e7b33c4/movies.json
然後按一下「匯入筆記」。這將為您提供此示範的現成 Zeppelin 筆記。您現在應該有一個「電影」筆記本(或您命名的任何名稱)。如果您按一下該筆記,您應該會看到類似這樣的畫面
您現在可以按一下 PySpark 程式碼區塊右上角附近的「播放」按鈕,您將建立一個新的記憶體內電影推薦模型!在 Spark 應用程式模型中,Zeppelin 充當 Spark Driver Program,與 Spark 叢集 master 互動以完成其工作。在本例中,在 Zeppelin Pod 中執行的 Driver Program 提取資料並將其傳送到 Spark master,Spark master 將其分配給 worker,worker 使用來自 Driver 的程式碼計算出電影推薦模型。使用 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 變更為對您來說是唯一的值。這將建立一個您可以在上述範例中使用的儲存貯體。
注意
計算模型並儲存它比計算模型並丟棄它慢得多。這是預期的。但是,如果您計劃重複使用模型,則計算模型並儲存它,然後在每次想要使用它時還原它,會比每次都丟棄並重新計算模型更快。搭配 Spark 使用水平 Pod 自動擴展 (選用)
Spark 對於 worker 的來來去去具有一定的彈性,這表示我們有一個機會:我們可以使用 Kubernetes 水平 Pod 自動擴展 自動擴展 Spark worker 集區,為 worker 設定目標 CPU 閾值和最小/最大集區大小。這消除了必須手動組態 worker 複本數量的需求。
像這樣建立 Autoscaler(注意:如果您沒有變更叢集的機器類型,您可能需要將 --max 限制為較小的數值):
$ kubectl autoscale --min=1 --cpu-percent=80 --max=10 \
rc/spark-worker-controller
若要查看自動擴展的完整效果,請等待 Replication Controller 回復到一個複本。使用 ‘kubectl get rc’
並等待 spark-worker-controller 上的「複本」欄回到 1。
我們之前執行的工作負載執行速度太快,以至於對於 HPA 來說沒有太大的意義。若要變更工作負載以實際執行足夠長的時間以查看自動擴展變得作用中,請將程式碼中的「rank = 100」行變更為「rank = 200」。在您按下播放後,Spark worker 集區應該會快速增加到 20 個 Pod。在工作完成後,最多需要 5 分鐘的時間,worker 集區才會回復到一個複本。
結論
在本文中,我們向您展示了如何在 Kubernetes 上執行 Spark 和 Zeppelin,以及如何使用 Google Cloud Storage 儲存您的 Spark 模型,以及如何使用水平 Pod 自動擴展來動態調整您的 Spark worker 集區大小。
這是我們即將發布的關於如何在 Kubernetes 上執行大數據框架系列文章中的第一篇 — 請繼續關注!
請加入我們的社群,協助我們建構 Kubernetes 的未來!有很多種參與方式。如果您對 Kubernetes 和大數據特別感興趣,您會對以下內容感興趣
- 我們的 大數據 Slack 頻道
- 我們的 Kubernetes 大數據特殊興趣小組電子郵件清單
- 大數據「特殊興趣小組」,每週一太平洋時間下午 1 點 (13:00) 在 SIG-Big-Data hangout 會議。當然,如需有關專案的更多資訊,請前往 www.kubernetes.io。