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-operatorPlaygroundとして、皆さんのインストールの流れを簡素化します.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-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:       
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 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は、タスクステータスを表示したい開発者が、このUIページを使用してタスクステータスの表示を行うSpark UIをDriver Podに動的にattachします.
最後に
本稿では,Spark Operatorの設計の初心を議論し,Spark OperatorのPlaygroundおよびSpark Operatorの基本アーキテクチャとプロセスを迅速に構築する方法について議論した.次の記事では、Spark Operatorの内部に深く入り込み、その内部の実現原理とSparkとのシームレスな統合方法について説明します.
著者:莫源
原文を読む
本文は雲栖コミュニティのオリジナル内容で、許可を得ずに転載してはならない.