搭建Spark應用
更新時間 2025-03-31 19:07:59
最近更新時間: 2025-03-31 19:07:59
分享文章
本文為您介紹如何搭建Spark應用。
背景信息
Spark是新一代分布式內存計算框架,Apache開源的頂級項目。相比于Hadoop Map-Reduce計算框架,Spark將中間計算結果保留在內存中,速度提升10~100倍;同時它還提供更豐富的算子,采用彈性分布式數據集(RDD)實現迭代計算,更好地適用于數據挖掘、機器學習算法,極大提升開發效率。
前提條件
- 確保您已經創建Serverless集群,具體操作請參閱創建Serverless集群。
- 確保kubectl工具已經連接目標集群。
操作步驟
步驟一:準備鏡像和創建命名空間namespace
- 從dockerHub鏡像倉庫獲取Spark相關鏡像。
docker pull index.docker.io/caicloud/spark:1.5.2
docker pull index.docker.io/caicloud/zeppelin:0.5.6
- 創建命名空間。
#namespace-spark-cluster.yaml
apiVersion: v1
kind: Namespace
metadata:
name: spark-cluster
labels:
? name: spark-cluster
$ kubectl create -f namespace-spark-cluster.yaml
- 查看Namespace。
$ kubectl get ns
NAME ? ? ? ? LABELS ? ? ? ? ? ? STATUS
default ? ? ? <none> ? ? ? ? ? ? Active
spark-cluster name=spark-cluster Active
步驟二:啟動master服務
- 創建無狀態工作負載,spark-master-deployment.yaml可參考如下:
#spark-master-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-master-controller
namespace: spark-cluster
spec:
replicas: 1
selector:
? matchLabels:
? ? component: spark-master
template:
? metadata:
? ? labels:
? ? ? component: spark-master
? spec:
? ? containers:
? ? - name: spark-master
? ? ? image: index.****/spark:1.5.2 ##替換成您自己的spark鏡像
? ? ? imagePullPolicy: Always
? ? ? command: ["/start-master"]
? ? ? ports:
? ? ? - containerPort: 7077
? ? ? - containerPort: 8080
? ? ? resources:
? ? ? ? requests:
? ? ? ? ? cpu: 100m
$ kubectl create -f spark-master-deployment.yaml
- 創建Master-Service,spark-master-service.yaml可參考如下:
# spark-master-service.yaml
kind: Service
apiVersion: v1
metadata:
name: spark-master
namespace: spark-cluster
spec:
ports:
? - port: 7077
? ? targetPort: 7077
selector:
? component: spark-master
$ kubectl create -f spark-master-service.yaml
service "spark-master"created
- 創建WebUI-Service,spark-webui.yaml可參考如下:
# spark-webui.yaml
kind: Service
apiVersion: v1
metadata:
name: spark-webui
namespace: spark-cluster
spec:
ports:
? - port: 8080
? ? targetPort: 8080
selector:
? component: spark-master
$ kubectl create -f service/spark-webui.yaml
service "spark-webui" created
- 檢查Master是否能運行和訪問:
$ kubectl get deploy -nspark-cluster
NAME ? ? ? ? ? ? ? ? ? ? DESIRED ? CURRENT ? AGE
spark-master-controller ? 1 ? ? ? ? 1 ? ? ? ? 23h
$ kubectl get svc
NAME ? ? ? ? ? CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? AGE
spark-master ? 10.254.106.29 ? <none> ? ? ? ?7077/TCP ? 1d
spark-webui ? ?10.254.66.138 ? <none> ? ? ? ?8080/TCP ? 18h
$ kubectl get pod -nspark-cluster
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? ? STATUS ? RESTARTS ? AGE
spark-master-controller-b3gbf ? 1/1 ? ? ? Running ? 0 ? ? ? ? 23h
- 確認master正常運行后,再使用Kubernetes proxy連接Spark WebUI:
$ kubectl proxy --port=8001
然后通過瀏覽器訪問//localhost:8001/api/v1/proxy/namespaces/spark-cluster/services/spark-webui/查看spark的任務運行狀態。其中localhost替換成執行kubectl proxy命令的主機IP,如若在本地主機上執行kubectl proxy命令,直接在本地瀏覽器訪問localhost即可。
步驟三:啟動 Spark workers
Spark workers 啟動時需要 Master service處于運行狀態,您可以通過修改replicas來設定worker數目(比如設定 replicas: 4,即可建立4個Spark Worker)。您可以為每一個worker節點設置了CPU和內存的配額,保證Spark的worker應用不會過度搶占集群中其他應用的資源。spark-worker-deployment.yaml可參考如下:
#spark-worker-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-worker-controller
namespace: spark-cluster
spec:
replicas: 4
selector:
? matchLabels:
? ? component: spark-worker
template:
? metadata:
? ? labels:
? ? ? component: spark-worker
? spec:
? ? containers:
? ? - name: spark-worker
? ? ? image: index.caicloud.io/spark:1.5.2
? ? ? imagePullPolicy: Always
? ? ? command: ["/start-worker"]
? ? ? ports:
? ? ? - containerPort: 8081
? ? ? resources:
? ? ? ? requests:
? ? ? ? ? cpu: 100m
$ kubectl create -f spark-worker-deployment.yaml
deployment "spark-worker-controller" created
查看 workers是否正常運行,通過kubectl查詢狀態(可看到spark-worker都已經正常運行):
$ kubectl get pods -nspark-cluster
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? ? STATUS ? ? ? ? ? ? RESTARTS ? AGE
spark-master-controller-b3gbf ? 1/1 ? ? ? Running ? ? ? ? ? ? 0 ? ? ? ? 1d
spark-worker-controller-ill4z ? 1/1 ? ? ? Running ? ? ? ? ? ? 1 ? ? ? ? 2h
spark-worker-controller-j29sc ? 1/1 ? ? ? Running ? ? ? ? ? ? 0 ? ? ? ? 2h
spark-worker-controller-siue2 ? 1/1 ? ? ? Running ? ? ? ? ? ? 0 ? ? ? ? 2h
spark-worker-controller-zd5kb ? 1/1 ? ? ? Running ? ? ? ? ? ? 0 ? ? ? ? 2h
通過WebUI查看: worker就緒后應該出現在UI中。
步驟四:提交Spark任務
- 通過Spark-client,可以利用spark-submit來提交復雜的Python腳本、Java/Scala的jar包代碼。
$ kubectl get pods -nspark-cluster | grep worker
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? ? STATUS ? RESTARTS ? AGE
spark-worker-controller-1h0l7 ? 1/1 ? ? ? Running ? 0 ? ? ? ? 4h
spark-worker-controller-d43wa ? 1/1 ? ? ? Running ? 0 ? ? ? ? 4h
spark-worker-controller-ka78h ? 1/1 ? ? ? Running ? 0 ? ? ? ? 4h
spark-worker-controller-sucl7 ? 1/1 ? ? ? Running ? 0 ? ? ? ? 4h
$ kubectl exec spark-worker-controller-1h0l7 -it bash
$ cd /opt/spark
# 提交python spark任務
./bin/spark-submit \
? ?--executor-memory 4G \
? ?--master spark://spark-master:7077 \
? examples/src/main/python/wordcount.py \
? ?"hdfs://hadoop-namenode:9000/caicloud/spark/data"
# 提交scala spark任務
./bin/spark-submit
? ?--executor-memory 4G
? ?--master spark://spark-master:7077
? ?--class io.caicloud.LinearRegression
? /nfs/caicloud/spark-mllib-1.0-SNAPSHOT.jar
? ?"hdfs://hadoop-namenode:9000/caicloud/spark/data"
- 通過Zeppelin,可以直接在命令行或UI編寫簡單的spark代碼。
先創建zeppelin的工作負載:
$ kubectl create -f zeppelin-controller.yaml
deployment "zeppelin-controller"created
$ kubectl get pods -nspark-cluster -l component=zeppelin
NAME ? ? ? ? ? ? ? ? ? ? ? READY ? ? STATUS ? RESTARTS ? AGE
zeppelin-controller-5g25x ? 1/1 ? ? ? Running ? 0 ? ? ? ? 5h
使用已創建的Zeppelin pod,設置WebUI的映射端口:
$ kubectl port-forward zeppelin-controller-5g25x 8080:8080
訪問//localhost:8080/,并提交測試代碼。