搭建Spark集羣?沒想到你是這樣的k8s

在本文的例子中,你將使用 Kubernetes 和 Docker 建立一個功能型Apache Spark集羣。java

你將使用Spark standalone模式 安裝一個 Spark master服務和一組Spark workers。linux

對於已熟悉這部份內容的讀者,能夠直接跳到 tl;dr 章節。git

源代碼

Docker 鏡像主要基於 https://github.com/mattf/dock...。 源碼託管在 https://github.com/kubernetes...github

步驟零:準備工做

本示例假定你已經具有如下條件:web

● 有已安裝並運行的 kubernetes集羣。
● 已在某個path路徑中安裝了kubectl 命令行工具。
● 已運行了一個spark-master的k8s service,可使用‘spark-master’域名在kube DNS實例中自動發現該服務。sql

更多詳細內容可在源碼的Dockerfile中查看。docker

第一步:建立命名空間

$ kubectl create -f examples/spark/namespace-spark-cluster.yaml

如今列出全部命名空間:shell

$ kubectl get namespaces
NAME          LABELS             STATUS
default       <none>             Active
spark-cluster name=spark-cluster Active

對於kubectl 客戶端使用的命名空間,咱們定義一個環境並使用它:apache

$ kubectl config set-context spark --namespace=spark-cluster --cluster=${CLUSTER_NAME} --user=${USER_NAME}
$ kubectl config use-context spark

你能夠在Kubernetes配置文件~/.kube/config中查看集羣名稱以及用戶名稱。api

第二步:啓動你的master服務

Master service 是 Spark集羣的master服務。
使用 examples/spark/spark-master-controller.yaml 文件來建立一個replication controller 運行Spark Master服務。

$ kubectl create -f examples/spark/spark-master-controller.yaml
replicationcontroller "spark-master-controller" created

而後,用examples/spark/spark-master-service.yaml 文件來建立一個邏輯上的服務端點,Spark workers可使用該服務來訪問Master pod

$ kubectl create -f examples/spark/spark-master-service.yaml
service "spark-master" created

而後你能夠爲Spark Master WebUI 建立一個服務:

$ kubectl create -f examples/spark/spark-webui.yaml
service "spark-webui" created

查看 Master 是否能運行和可訪問

$ kubectl get podsNAME                            READY     STATUS    RESTARTS   AGEspark-master-controller-5u0q5   1/1       Running   0          8m

檢查日誌以查看master的狀態。(使用上一條指令輸出的pod名稱)

{{{$ kubectl logs spark-master-controller-5u0q5
starting org.apache.spark.deploy.master.Master, logging to /opt/spark
-1.5.1-bin-hadoop2.6/sbin/../logs/spark--org.apache.spark.deploy.master.
- Master-1-spark-
master-controller-g0oao.out
Spark Command: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -cp /
opt/spark-1.5.1-bin-hadoop2.6/sbin/../conf/:/opt/spark-1.5.1-bin-
hadoop2.6/lib/spark-assembly-1.5.1-hadoop2.6.0.jar:/opt/spark-1.5.1
-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar:/opt/spark-1.5.1-bin
- -hadoop2.6/lib/datanucleus-core-3.2.10.jar:/opt/spark-1.5.1-bin-
- hadoop2.6/lib/datanucleus-api-jdo-3.2.6.jar -Xms1g -Xmx1g org.apache.spark.deploy.master.Master --ip spark-master --port 7077
-  --webui-port 8080
========================================
15/10/27 21:25:05 INFO Master: Registered signal handlers for 
[TERM, HUP, INT]
15/10/27 21:25:05 INFO SecurityManager: Changing view acls to: root
15/10/27 21:25:05 INFO SecurityManager: Changing modify acls to: root
15/10/27 21:25:05 INFO SecurityManager: SecurityManager: authentication 
disabled; ui acls disabled; users with view permissions: Set(root); users with 
modify permissions: Set(root)
15/10/27 21:25:06 INFO Slf4jLogger: Slf4jLogger started
15/10/27 21:25:06 INFO Remoting: Starting remoting
15/10/27 21:25:06 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkMaster@spark-master:7077]
15/10/27 21:25:06 INFO Utils: Successfully started service 'sparkMaster' on port 
7077.
15/10/27 21:25:07 INFO Master: Starting Spark master at spark://spark-master:
7077
15/10/27 21:25:07 INFO Master: Running Spark version 1.5.1
15/10/27 21:25:07 INFO Utils: Successfully started service 'MasterUI' on 
port 8080.
15/10/27 21:25:07 INFO MasterWebUI: Started MasterWebUI at http://
spark-master:8080
15/10/27 21:25:07 INFO Utils: Successfully started service on port 6066.
15/10/27 21:25:07 INFO StandaloneRestServer: Started REST server for
 submitting applications on port 6066
15/10/27 21:25:07 INFO Master: I have been elected leader! New state: ALIVE}}}

確認master正常運行後,你可使用k8s集羣代理訪問Spark WebUI:

kubectl proxy --port=8001

此時能夠經過http://localhost:8001/api/v1/...訪問UI

第三步:啓動 Spark workers

Spark workers 在 Spark 集羣中扮演十分重要的角色。他們爲程序提供執行資源和數據緩存功能。

Spark workers 須要 Master service處於運行狀態。

使用examples/spark/spark-worker-controller.yaml 文件建立一個replication controller來管理 worker pods 。

$ kubectl create -f examples/spark/spark-worker-controller.yaml
replicationcontroller "spark-worker-controller" created

查看 workers 是否正常運行

若是你啓動Spark WebUI,當worker就緒後應該出如今UI 中。(這可能須要一些時間來拉取鏡像並啓動pods。)你也能夠用如下方式查詢狀態:

$ kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
spark-master-controller-5u0q5   1/1       Running   0          25m
spark-worker-controller-e8otp   1/1       Running   0          6m
spark-worker-controller-fiivl   1/1       Running   0          6m
spark-worker-controller-ytc7o   1/1       Running   0          6m
$ kubectl logs spark-master-controller-5u0q5
[...]
15/10/26 18:20:14 INFO Master: Registering worker 10.244.1.13:53567 
with 2 cores, 6.3 GB RAM
15/10/26 18:20:14 INFO Master: Registering worker 10.244.2.7:46195
 with 2 cores, 6.3 GB RAM
15/10/26 18:20:14 INFO Master: Registering worker 10.244.3.8:39926 
with 2 cores, 6.3 GB RAM

假如上一節中kubectl proxy仍在運行,你應該也能在UI中看到workers。注:UI 將含有到 worker Web UI的超連接。 這些連接是不能正常工做的(連接將嘗試鏈接到集羣IP,而Kubernetes不會自動代理的集羣IP)。

第四步:在 Spark 集羣中啓動 Zeppelin UI來加載工做任務

Zeppelin UI pod能夠用來在Spark集羣加載jobs,加載操做既能夠經過web端的筆記本完成,也能夠經過傳統的Spark命令行方式完成。更多細節見 Zeppelin和 Spark architecture架構。

$ kubectl create -f examples/spark/zeppelin-controller.yaml
replicationcontroller "zeppelin-controller" created

Zeppelin 須要 Master service處於運行狀態。

查看 Zeppelin 是否正常運行

$ kubectl get pods -l component=zeppelin
NAME                        READY     STATUS    RESTARTS   AGE
zeppelin-controller-ja09s   1/1       Running   0          53s

第五步:操做集羣

如今你有兩個選擇:能夠經過圖形界面訪問Spark 集羣,也能夠保持使用CLI。

快速使用pyspark

使用 kubectl exec鏈接到Zeppelin 驅動並運行pipeline。

使用 kubectl exec鏈接到Zeppelin 驅動並運行pipeline。

$ kubectl exec zeppelin-controller-ja09s -it pyspark
Python 2.7.9 (default, Mar  1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more
 information.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 1.5.1
      /_/
Using Python version 2.7.9 (default, Mar  1 2015 12:57:24)
SparkContext available as sc, HiveContext available as sqlContext.
>>> sc.textFile("gs://dataflow-samples/shakespeare/*").map
(lambda s: len(s.split())).sum()
939193

恭喜你,你把全部莎士比亞戲劇中的單詞個數統計出來了。

使用圖形界面,亮瞎你的眼!

使用以前建立的Zeppelin pod,設置WebUI的轉發端口:

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

這條指令將訪問localhost 8080端口的請求轉發到容器中的8080端口。而後你能夠經過https://localhost:8080/ 訪問Zeppelin。

建立一個「New Notebook」。在其中輸入:

%pyspark
print sc.textFile("gs://dataflow-samples/shakespeare/*").map
(lambda s: len(s.split())).sum()

結論

如今你已爲Spark master,Spark workers 和 Spark driver建立了service和replication controller。你能夠用這個例子來進行下一步,並開始使用剛纔建立的Apache Spark集羣,更多信息見Spark 文檔。

tl;dr

kubectl create -f examples/spark

設置後:

kubectl get pods # Make sure everything is running
kubectl proxy --port=8001 # Start an application proxy, if you want
 to see the Spark Master WebUI
kubectl get pods -lcomponent=zeppelin # Get the driver pod to interact
 with.

此時Master UI 能夠經過http://localhost:8001/api/v1/...訪問。

你能夠經過kubectl exec使用傳統的spark-shell / spark-subsubmit / pyspark 命令行與Spark 集羣進行交互,或者若是你想與Zeppelin交互:

kubectl port-forward zeppelin-controller-abc123 8080:8080 &
kubectl port-forward zeppelin-controller-abc123 8080:8080 &

而後訪問http://localhost:8080/

使用Spark 的已知問題

● 該方案提供了一個僅限於集羣網絡的Spark 配置,這意味着Spark master 只能經過集羣service訪問。若是你須要在 zeppelin pod 中使用除了Zeppelin 或spark-submit 以外的外部客戶端來提交 jobs ,你須要爲客戶端提供一種訪問examples/spark/spark-master-service.yaml 的方式。參見service以瞭解更多信息。

使用 Zeppelin 的已知問題

● Zeppelin pod 很大,所以拉取鏡像可能會消耗一段時間,拉取速度取決於你的網絡條件。Zeppelin pod 的尺寸是咱們正要解決的問題,詳見問題# 17231。
● 第一次運行Zeppelin 時, pipeline可能會花費不少時間(約一分鐘)。彷佛須要至關多的時間來加載。
● 在GKE環境中, kubectl port-forward 不可能長時間保持穩定狀態。若是你發現Zeppelin變成斷開狀態,port-forward極可能出現故障,並須要重啓。詳見# 12179。

本文由時速雲翻譯,如若轉載,需註明轉載自「時速雲
原文連接:
https://github.com/kubernetes...

相關文章
相關標籤/搜索