Spark是很是流行的大數據處理引擎,數據科學家們使用Spark以及相關生態的大數據套件完成了大量又豐富場景的數據分析與挖掘。Spark目前已經逐漸成爲了業界在數據處理領域的行業標準。可是Spark自己的設計更偏向使用靜態的資源管理,雖然Spark也支持了相似Yarn等動態的資源管理器,可是這些資源管理並非面向動態的雲基礎設施而設計的,在速度、成本、效率等領域缺少解決方案。隨着Kubernetes的快速發展,數據科學家們開始考慮是否能夠用Kubernetes的彈性與面向雲原生等特色與Spark進行結合。在Spark 2.3中,Resource Manager
中添加了Kubernetes原生的支持,而本系列咱們會給你們介紹如何用更Kubernetes的方式在集羣中使用Spark進行數據分析。本系列不須要開發者有豐富的Spark使用經驗,對着系列的逐漸深刻,會穿插講解使用到的Spark特性。git
不少的開發者在接觸Hadoop的時候,被安裝流程的複雜度打消了不少的積極性。爲了下降學習的門檻,本系列會經過spark-on-k8s-operator
做爲Playground
,簡化你們的安裝流程。spark-on-k8s-operator
顧名思義是爲了簡化Spark操做而開發的operator,若是對operator不是很瞭解的開發者,能夠先自行搜索瞭解下,理解operator能作什麼能夠快速幫你掌握spark-on-k8s-operator
的要領。github
在講解內部原理前,咱們先將環境搭建起來,經過一個簡單的demo,跑通整個的運行時環境。apache
spark-on-k8s-operator
官方的文檔是經過Helm Chart進行安裝的,因爲不少開發者的環境沒法連通google的repo,所以此處咱們經過標準的yaml進行安裝。api
## 下載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應用來驗證組件是否能夠正常工做。app
學習Spark的時候,咱們運行的第一個任務是官方文檔中介紹的圓周率運行的例子。今天咱們換一種方式,經過Kubernetes的方式再運行一次。oop
## 下發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:08Z Generation: 1 Resource Version: 4923532 Self Link: /apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-pi UID: bbe7445c-1ca0-11e9-9ad4-062fd7c19a7b Spec: Deps: Driver: Core Limit: 200m Cores: 0.1 Labels: Version: 2.4.0 Memory: 512m Service Account: spark Volume Mounts: Mount Path: /tmp Name: test-volume Executor: Cores: 1 Instances: 1 Labels: Version: 2.4.0 Memory: 512m Volume Mounts: Mount Path: /tmp Name: test-volume Image: gcr.io/spark-operator/spark:v2.4.0 Image Pull Policy: Always Main Application File: local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar Main Class: org.apache.spark.examples.SparkPi Mode: cluster Restart Policy: Type: Never Type: Scala Volumes: Host Path: Path: /tmp Type: Directory Name: test-volume Status: Application State: Error Message: State: COMPLETED Driver Info: Pod Name: spark-pi-driver Web UI Port: 31182 Web UI Service Name: spark-pi-ui-svc Execution Attempts: 1 Executor State: Spark - Pi - 1547981232122 - Exec - 1: COMPLETED Last Submission Attempt Time: 2019-01-20T10:47:14Z Spark Application Id: spark-application-1547981285779 Submission Attempts: 1 Termination 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 submission Normal SparkApplicationSubmitted 55m spark-operator SparkApplication spark-pi was submitted successfully Normal SparkDriverPending 55m (x2 over 55m) spark-operator Driver spark-pi-driver is pending Normal SparkExecutorPending 54m (x3 over 54m) spark-operator Executor spark-pi-1547981232122-exec-1 is pending Normal SparkExecutorRunning 53m (x4 over 54m) spark-operator Executor spark-pi-1547981232122-exec-1 is running Normal SparkDriverRunning 53m (x12 over 55m) spark-operator Driver spark-pi-driver is running Normal 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 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頁面進行任務狀態的查看。ui
在本文中,咱們討論了Spark Operator
的設計初衷,如何快速搭建一個Spark Operator
的Playground以及Spark Operator
的基本架構與流程。在下一篇文章中,咱們會深刻到Spark Operator
的內部,爲你們講解其內部的實現原理以及如何與Spark更無縫的集成。
本文爲雲棲社區原創內容,未經容許不得轉載。