天天看點

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 [email protected]: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 in action on Kubernetes - Playground搭建與架構淺析

​此時在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: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 in action on Kubernetes - Playground搭建與架構淺析

這張圖是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更無縫的內建。

轉自:

https://yq.aliyun.com/articles/688590?msgid=11659951

繼續閱讀