Dataproc Container for Spark

Google Distributed Cloud (GDC) 實體隔離環境提供適用於 Spark 的 Dataproc 容器。這是用於資料處理的 Apache Spark 環境。如要進一步瞭解 Apache Spark,請參閱 https://spark.apache.org/。使用 Dataproc Container for Spark 的容器,在 Distributed Cloud Kubernetes 叢集中執行新的或現有的 Spark 應用程式,且變更幅度極小。如果您熟悉 Spark 工具,可以繼續使用。

在 YAML 檔案中定義 Spark 應用程式,Distributed Cloud 就會為您分配資源。Dataproc Container for Spark 容器會在幾秒內啟動。Spark 執行器會根據您的需求擴增或關閉。

設定 Dataproc Container for Spark on Distributed Cloud 中的容器,以使用專用硬體,例如專用硬體節點或 GPU。

部署 Dataproc Container for Spark 服務

平台管理員 (PA) 必須先為您安裝 Marketplace 服務,您才能使用這些服務。如需 Dataproc Container for Spark,請與您的 PA 聯絡。詳情請參閱「安裝 GDC Marketplace 軟體套裝組合」。

執行 Spark 應用程式的必要條件

如要使用 Dataproc Container for Spark 服務,使用者叢集必須有服務帳戶。Dataproc Container for Spark 會建立 Spark 驅動程式 Pod,以執行 Spark 應用程式。Spark 驅動程式 Pod 需要 Pod 命名空間中的 Kubernetes 服務帳戶,並具備下列動作的權限:

  • 建立、取得、列出及刪除執行器 Pod。
  • 為驅動程式建立 Kubernetes 無介面服務。

執行 Spark 應用程式前,請先完成下列步驟,確保您在 foo 命名空間中擁有具備先前權限的服務帳戶:

  1. 建立服務帳戶,供 Spark 驅動程式 Pod 在 foo 命名空間中使用:

    kubectl create serviceaccount spark --kubeconfig AO_USER_KUBECONFIG --namespace=foo
    
  2. 建立角色,授予建立、取得、列出及刪除執行器 Pod 的權限,並在 foo 命名空間中為驅動程式建立 Kubernetes 無標題服務:

    kubectl create role spark-driver --kubeconfig AO_USER_KUBECONFIG --verb=* \
    --resource=pods,services,configmaps,persistentvolumeclaims \
    --namespace=foo
    
  3. 建立角色繫結,在 foo 命名空間中授予服務帳戶角色存取權:

    kubectl create --kubeconfig AO_USER_KUBECONFIG \
    rolebinding spark-spark-driver \
    --role=spark-driver --serviceaccount=foo:spark \
    --namespace=foo
    

執行 Spark 3 範例應用程式

將 Spark 應用程式容器化,可簡化在 Distributed Cloud 上執行大數據應用程式的程序。以應用程式運算子 (AO) 身分,執行 SparkApplication 自訂資源類型 GKE 物件中指定的 Spark 應用程式。

如要在 Distributed Cloud 上執行及使用 Apache Spark 3 應用程式,請完成下列步驟:

  1. 檢查專案中的 spark-operator 圖片,找出要在 Spark 應用程式中參照的 $DATAPROC_IMAGE

    export DATAPROC_IMAGE=$(kubectl get pod --kubeconfig AO_USER_KUBECONFIG \
    --selector app.kubernetes.io/name=spark-operator -n foo \
    -o=jsonpath='{.items[*].spec.containers[0].image}' \
    | sed 's/spark-operator/dataproc/')
    

    例如:

    export DATAPROC_IMAGE=10.200.8.2:10443/dataproc-service/private-cloud-devel/dataproc:3.1-dataproc-17
    
  2. 編寫 SparkApplication 規格並儲存在 YAML 檔案中。詳情請參閱「撰寫 Spark 應用程式規格」一節。

  3. 在 GKE 叢集上,使用 kubectl 指令,根據 SparkApplication 規格提交、執行及監控 Spark 應用程式。詳情請參閱「應用程式範例」一節。

  4. 查看應用程式的狀態。

  5. 選用:查看應用程式記錄。詳情請參閱「查看 Spark 3 應用程式的記錄」一節。

  6. 使用 Spark 應用程式收集驅動程式和執行器的狀態,並向使用者顯示。

編寫 Spark 應用程式規格

SparkApplication 規格包含下列元件:

  • apiVersion 欄位。
  • kind 欄位。
  • metadata 欄位。
  • spec」部分。

詳情請參閱 GitHub 上的「撰寫 SparkApplication 規格」:https://github.com/kubeflow/spark-operator/blob/gh-pages/docs/user-guide.md#writing-a-sparkapplication-spec

應用程式範例

這個部分包含下列範例,以及執行 Spark 應用程式的對應SparkApplication規格:

Spark Pi

本節提供範例,說明如何執行運算密集型 Spark Pi 應用程式,透過在圓形中投擲飛鏢來估算 𝛑 (圓周率)。

請按照下列步驟執行 Spark Pi:

  1. 在使用者叢集中套用下列 SparkApplication 規格範例:

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: foo
    spec:
      type: Python
      pythonVersion: "3"
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: IfNotPresent
      mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/pi.py"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  2. 使用下列指令,確認 SparkApplication 規格範例是否執行並在 1 到 2 分鐘內完成:

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-pi -n foo
    
  3. 查看「驅動程式記錄檔」即可查看結果:

    kubectl --kubeconfig AO_USER_KUBECONFIG logs spark-pi-driver -n foo | grep "Pi is roughly"
    

    輸出內容會類似如下:

    Pi is roughly 3.1407357036785184
    

詳情請參閱下列資源:

  • 如需應用程式程式碼,請參閱 Apache Spark 說明文件中的「Pi estimation」一文:https://spark.apache.org/examples.html
  • 如需 Spark Pi YAML 檔案範例,請參閱「撰寫 Spark 應用程式規格」。

Spark SQL

請按照下列步驟執行 Spark SQL:

  1. 如要執行 Spark SQL 應用程式來選取 1 值,請使用下列查詢:

    select 1;
    
  2. 在使用者叢集中套用下列 SparkApplication 規格範例:

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: pyspark-sql-arrow
      namespace: foo
    spec:
      type: Python
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: IfNotPresent
      mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/sql/arrow.py"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  3. 使用下列指令,確認 SparkApplication 規格範例是否在不到一分鐘內執行並完成:

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication pyspark-sql-arrow -n foo
    

Spark MLlib

請按照下列步驟執行 Spark MLlib:

  1. 使用下列 Scala 範例執行 Spark MLlib 執行個體,進行統計分析並將結果列印到控制台:

    import org.apache.spark.ml.linalg.{Matrix, Vectors}
    import org.apache.spark.ml.stat.Correlation
    import org.apache.spark.sql.Row
    
    val data = Seq(
      Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))),
      Vectors.dense(4.0, 5.0, 0.0, 3.0),
      Vectors.dense(6.0, 7.0, 0.0, 8.0),
      Vectors.sparse(4, Seq((0, 9.0), (3, 1.0)))
    )
    
    val df = data.map(Tuple1.apply).toDF("features")
    val Row(coeff1: Matrix) = Correlation.corr(df, "features").head
    println(s"Pearson correlation matrix:\n $coeff1")
    
    val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head
    println(s"Spearman correlation matrix:\n $coeff2")
    
  2. 在使用者叢集中套用下列 SparkApplication 規格範例:

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-ml
      namespace: foo
    spec:
      type: Scala
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.ml.SummarizerExample
      mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples_2.12-3.1.3.jar"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  3. 使用下列指令,確認 SparkApplication 規格範例是否在不到一分鐘內執行並完成:

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-ml -n foo
    

SparkR

請按照下列步驟執行 SparkR:

  1. 使用下列程式碼範例執行 SparkR 執行個體,載入隨附的資料集並列印第一行:

    library(SparkR)
    sparkR.session()
    df <- as.DataFrame(faithful)
    head(df)
    
  2. 在使用者叢集中套用下列 SparkApplication 規格範例:

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-r-dataframe
      namespace: foo
    spec:
      type: R
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: Always
      mainApplicationFile: "local:///usr/lib/spark/examples/src/main/r/dataframe.R"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  3. 使用下列指令,確認 SparkApplication 規格範例是否在不到一分鐘內執行並完成:

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-r-dataframe -n foo
    

查看 Spark 3 應用程式的記錄

Spark 提供下列兩種記錄類型,可供您以視覺化方式呈現:

使用終端機執行指令。

驅動程式記錄

請按照下列步驟查看 Spark 應用程式的驅動程式記錄:

  1. 找出 Spark 驅動程式 Pod:

    kubectl -n spark get pods
    
  2. 開啟 Spark 驅動程式 Pod 的記錄:

    kubectl -n spark logs DRIVER_POD
    

    DRIVER_POD 替換為上一步中找到的 Spark 驅動程式 Pod 名稱。

事件記錄

您可以在 SparkApplication 規格的 YAML 檔案中指定路徑,找到事件記錄。

請按照下列步驟查看 Spark 應用程式的事件記錄:

  1. 開啟 SparkApplication 規格的 YAML 檔案。
  2. 在檔案中找出 spec 欄位。
  3. 找出 spec 欄位中巢狀的 sparkConf 欄位。
  4. 找出 sparkConf 區段中巢狀的 spark.eventLog.dir 欄位值。
  5. 開啟路徑即可查看事件記錄。

如需 SparkApplication 規格的 YAML 檔案範例,請參閱「撰寫 Spark 應用程式規格」。

如需詳細資訊,請與客戶經理聯絡。