Spark in action on Kubernetes - Playground搭建与架构浅析
前言
Spark是非常流行的大數據處理引擎,數據科學家們使用Spark以及相關生態的大數據套件完成了大量又豐富場景的數據分析與挖掘。Spark目前已經逐漸成為了業界在數據處理領域的行業標準。但是Spark本身的設計更偏向使用靜態的資源管理,雖然Spark也支持了類似Yarn等動態的資源管理器,但是這些資源管理并不是面向動態的云基礎設施而設計的,在速度、成本、效率等領域缺乏解決方案。隨著Kubernetes的快速發展,數據科學家們開始考慮是否可以用Kubernetes的彈性與面向云原生等特點與Spark進行結合。在Spark 2.3中,Resource Manager中添加了Kubernetes原生的支持,而本系列我們會給大家介紹如何用更Kubernetes的方式在集群中使用Spark進行數據分析。本系列不需要開發者有豐富的Spark使用經驗,對著系列的逐漸深入,會穿插講解使用到的Spark特性。
搭建Playground
很多的開發者在接觸Hadoop的時候,被安裝流程的復雜度打消了很多的積極性。為了降低學習的門檻,本系列會通過spark-on-k8s-operator作為Playground,簡化大家的安裝流程。spark-on-k8s-operator顧名思義是為了簡化Spark操作而開發的operator,如果對operator不是很了解的開發者,可以先自行搜索了解下,理解operator能做什么可以快速幫你掌握spark-on-k8s-operator的要領。
在講解內部原理前,我們先將環境搭建起來,通過一個簡單的demo,跑通整個的運行時環境。
1. 安裝spark-on-k8s-operator
官方的文檔是通過Helm Chart進行安裝的,由于很多開發者的環境無法連通google的repo,因此此處我們通過標準的yaml進行安裝。
## 下載repo git clone git@github.com:AliyunContainerService/spark-on-k8s-operator.git## 安裝crd kubectl apply -f manifest/spark-operator-crds.yaml ## 安裝operator的服務賬號與授權策略 kubectl apply -f manifest/spark-operator-rbac.yaml ## 安裝spark任務的服務賬號與授權策略 kubectl apply -f manifest/spark-rbac.yaml ## 安裝spark-on-k8s-operator kubectl apply -f manifest/spark-operator.yaml驗證安裝結果
?此時在spark-operator的命名空間下的無狀態應用下,可以看到一個運行中的sparkoperator,表名此時組件已經安裝成功,接下來我們運行一個demo應用來驗證組件是否可以正常工作。
2. Demo驗證
學習Spark的時候,我們運行的第一個任務是官方文檔中介紹的圓周率運行的例子。今天我們換一種方式,通過Kubernetes的方式再運行一次。
## 下發spark-pi任務 kubectl apply -f examples/spark-pi.yaml任務下發成功后,可以通過命令行觀察任務的狀態。
## 查詢任務 kubectl describe sparkapplication spark-pi## 任務結果 Name: spark-pi Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"sparkoperator.k8s.io/v1alpha1","kind":"SparkApplication","metadata":{"annotations":{},"name":"spark-pi","namespace":"defaul... API Version: sparkoperator.k8s.io/v1alpha1 Kind: SparkApplication Metadata:Creation Timestamp: 2019-01-20T10:47:08ZGeneration: 1Resource Version: 4923532Self Link: /apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-piUID: bbe7445c-1ca0-11e9-9ad4-062fd7c19a7b Spec:Deps:Driver:Core Limit: 200mCores: 0.1Labels:Version: 2.4.0Memory: 512mService Account: sparkVolume Mounts:Mount Path: /tmpName: test-volumeExecutor:Cores: 1Instances: 1Labels:Version: 2.4.0Memory: 512mVolume Mounts:Mount Path: /tmpName: test-volumeImage: gcr.io/spark-operator/spark:v2.4.0Image Pull Policy: AlwaysMain Application File: local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jarMain Class: org.apache.spark.examples.SparkPiMode: clusterRestart Policy:Type: NeverType: ScalaVolumes:Host Path:Path: /tmpType: DirectoryName: test-volume Status:Application State:Error Message:State: COMPLETEDDriver Info:Pod Name: spark-pi-driverWeb UI Port: 31182Web UI Service Name: spark-pi-ui-svcExecution Attempts: 1Executor State:Spark - Pi - 1547981232122 - Exec - 1: COMPLETEDLast Submission Attempt Time: 2019-01-20T10:47:14ZSpark Application Id: spark-application-1547981285779Submission Attempts: 1Termination Time: 2019-01-20T10:48:56Z Events:Type Reason Age From Message---- ------ ---- ---- -------Normal SparkApplicationAdded 55m spark-operator SparkApplication spark-pi was added, Enqueuing it for submissionNormal SparkApplicationSubmitted 55m spark-operator SparkApplication spark-pi was submitted successfullyNormal SparkDriverPending 55m (x2 over 55m) spark-operator Driver spark-pi-driver is pendingNormal SparkExecutorPending 54m (x3 over 54m) spark-operator Executor spark-pi-1547981232122-exec-1 is pendingNormal SparkExecutorRunning 53m (x4 over 54m) spark-operator Executor spark-pi-1547981232122-exec-1 is runningNormal SparkDriverRunning 53m (x12 over 55m) spark-operator Driver spark-pi-driver is runningNormal SparkExecutorCompleted 53m (x2 over 53m) spark-operator Executor spark-pi-1547981232122-exec-1 completed此時我們發現任務已經執行成功,查看這個Pod的日志,我們可以到計算最終的結果為Pi is roughly 3.1470557352786765。至此,在Kubernetes上,已經跑通了第一個Job,接下來我們要來詳解一下剛才這一波操作到底都做了些什么。
Spark Operator的基礎架構淺析
這張圖是Spark Operator的流程圖,在上面的操作中,第一個步驟里面,實際上是將圖中的中心位置藍色的Spark Operator安裝到集群中,Spark Opeartor本身即是是一個CRD的Controller也是一個Mutating Admission Webhook的Controller。當我們下發spark-pi模板的時候,會轉換為一個名叫SparkApplication的CRD對象,然后Spark Operator會監聽Apiserver,并將SparkApplication對象進行解析,變成spark-submit的命令并進行提交,提交后會生成Driver Pod,用簡單的方式理解,Driver Pod就是一個封裝了Spark Jar的鏡像。如果是本地任務,就直接在Driver Pod中執行;如果是集群任務,就會通過Driver Pod再生成Exector Pod進行執行。當任務結束后,可以通過Driver Pod進行運行日志的查看。此外在任務的執行中,Spark Operator還會動態attach一個Spark UI到Driver Pod上,希望查看任務狀態的開發者,可以通過這個UI頁面進行任務狀態的查看。
最后
在本文中,我們討論了Spark Operator的設計初衷,如何快速搭建一個Spark Operator的Playground以及Spark Operator的基本架構與流程。在下一篇文章中,我們會深入到Spark Operator的內部,為大家講解其內部的實現原理以及如何與Spark更無縫的集成。
#阿里云開年Hi購季#幸運抽好禮!
點此抽獎:https://www.aliyun.com/acts/product-section-2019/yq-lottery?utm_content=g_1000042901
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的Spark in action on Kubernetes - Playground搭建与架构浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nacos 发布0.3.0版本,迄今为止
- 下一篇: Node.js 应用故障排查手册 ——