Google Kubernetes Engine で Spark ジョブを実行する

このドキュメントでは、GKE 上の Managed Service for Apache Spark 仮想クラスタを作成し、 クラスタで Spark ジョブを実行する方法について説明します。

オプションの概要

GKE 上の Managed Service for Apache Spark では、コンテナ化された環境の高度な制御が可能ですが、 Google Cloud には、運用の簡素化と開発の加速に役立つ、フルマネージドでサーバーレスのオプションも用意されています。Spark Managed Service for Apache Spark のデプロイ オプションの比較については、 最適な Spark サービスを決定するをご覧ください。

始める前に

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that you have the permissions required to complete this guide.

  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the Dataproc API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  6. Google Cloud CLI をインストールします。

  7. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  8. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  9. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. Verify that you have the permissions required to complete this guide.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Dataproc API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  13. Google Cloud CLI をインストールします。

  14. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  15. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  16. クラスタでWorkload Identity が有効になっている自動パイロットではない標準的な Google Kubernetes Engine(GKE) ゾーン クラスタまたはリージョン クラスタを作成済みである必要があります。

必要なロール

このページの例を実行するには、特定の IAM ロールが必要です。組織のポリシーによっては、これらのロールがすでに付与されている場合があります。ロールの付与を確認するには、 ロールを付与する必要がありますか?をご覧ください。

ロールの付与については、 プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

ユーザーロール

Managed Service for Apache Spark クラスタの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

サービス アカウント ロール

Compute Engine のデフォルトのサービス アカウントに Managed Service for Apache Spark クラスタの作成に必要な権限を付与するには、プロジェクトに対するDataproc ワーカー roles/dataproc.worker)IAM ロールを Compute Engine のデフォルトのサービス アカウントに付与するよう管理者に依頼します。

仮想クラスタを作成する

GKE 上の Managed Service for Apache Spark 仮想クラスタは、 Managed Service for Apache Spark コンポーネントのデプロイ プラットフォームとして作成されます。これは仮想 リソースであり、 Managed Service for Apache Spark on Compute Engine クラスタとは異なり、個別の Managed Service for Apache Spark マスター VM とワーカー VM が含まれません。

  • GKE 上の Managed Service for Apache Spark では、GKE クラスタ内に、GKE 上の Managed Service for Apache Spark 仮想クラスタを作成するときにノードプールが作成されます。

  • GKE 上の Managed Service for Apache Spark ジョブは、こうしたノードプールで Pod として実行されます。ノードプールとノードプール上の Pod のスケジューリングは、GKE が管理します。

  • 複数の仮想クラスタを作成します。GKE クラスタで複数の仮想クラスタを作成して実行し、仮想クラスタ間でノードプールを共有することで、リソース使用率を改善できます。

    • 各仮想クラスタ:
      • Spark エンジンのバージョンやワークロード ID などの個別のプロパティで作成されます。
      • GKE クラスタの個別の GKE Namespace 内で分離されています。

コンソール

  1. コンソールで、Managed Service for Apache Spark の [Clusters] ページに移動します。 Google Cloud

    [クラスタ] に移動

  2. [クラスタを作成] をクリックします。

  3. [Managed Service for Apache Spark クラスタを作成] ダイアログで、[GKE 上のクラスタ] 行の [作成] をクリックします。

  4. [クラスタの設定] パネルで次の操作を行います。

    1. [クラスタ名] フィールドに、クラスタの名前を入力します。
    2. [**リージョン**] リストで、GKE 上の Managed Service for Apache Spark 仮想クラスタの リージョン を選択します。このリージョンは、既存の GKE クラスタが配置されている同じリージョン(次の項目で選択)に存在する必要があります。
    3. [Kubernetes クラスタ] フィールドで、[参照] をクリックして、既存の GKE クラスタが配置されているリージョンを選択します。
    4. 省略可: [Cloud Storage ステージング バケット] フィールドで [参照] をクリックして、既存の Cloud Storage バケットを選択できます。 GKE 上の Managed Service for Apache Spark は、バケットにアーティファクトをステージングします。GKE 上の Managed Service for Apache Spark でステージング バケットを作成するには、この フィールドを省略します。
  5. 左側のパネルで [ノードプールの構成] をクリックし、[ノードプール] パネルで [プールを追加] をクリックします。

    1. GKE のノードプールで既存の Managed Service for Apache Spark を再利用するには:
      1. [既存のノードプールを再利用] をクリックします。
      2. 既存のノードプールの名前を入力して、[ロール] を選択します。少なくとも 1 つのノードプールで DEFAULT のロールを持つ必要があります。
      3. [完了] をクリックします。
    2. 新しい GKE 上の Managed Service for Apache Spark ノードプールを作成するには:
      1. [新しいノードプールを作成] をクリックします。
      2. 次のノードプール値を入力します。
    3. [プールを追加] をクリックしてノードプールをさらに追加します。すべてのノードプールにはロケーションが必要です。合計 4 つのノードプールを追加できます。
  6. (オプション)アクティブおよび削除された GKE 上の Managed Service for Apache Spark クラスタで Spark ジョブ履歴を表示するために使用する Managed Service for Apache Spark Persistent History Server(PHS) を設定した場合は、[クラスタのカスタマイズ]をクリックします。次に、[History サーバー クラスタ] フィールドで、PHS クラスタを参照して選択します。PHS クラスタは、GKE 上の Managed Service for Apache Spark 仮想クラスタと同じリージョンに配置する必要があります。

  7. [作成] をクリックして、Managed Service for Apache Spark クラスタを作成します。GKE 上の Managed Service for Apache Spark クラスタが、[**クラスタ**] ページのリストに表示されます。クラスタが使用できるようになるまでのステータスは [プロビジョニング] で、その後 [実行中] に変わります。

gcloud

環境変数を設定し、ローカルまたは Cloud Shell で gcloud dataproc clusters gke create コマンドを実行して、GKE 上の Managed Service for Apache Spark クラスタを作成します。

  1. 環境変数を設定します。

    DP_CLUSTER=Managed Service for Apache Spark on GKE  cluster-name \
      REGION=region \
      GKE_CLUSTER=GKE cluster-name \
      BUCKET=Cloud Storage bucket-name \
      DP_POOLNAME=node pool-name
      PHS_CLUSTER=Managed Service for Apache Spark PHS server name
    
    注:

    • DP_CLUSTER: Managed Service for Apache Spark の仮想クラスタ名は、小文字で始まり、54 文字以下の小文字、数字、ハイフンで構成される必要があります。末尾をハイフンにはできません。
    • REGION: region は、GKE クラスタが配置されているリージョンと同じである必要があります。
    • GKE_CLUSTER: 既存の GKE クラスタの名前。
    • BUCKET: (省略可) Cloud Storage バケットの名前を指定できます。 Managed Service for Apache Spark は、この名前を使用してアーティファクトをステージングします。バケットを指定しない場合は、 GKE 上の Managed Service for Apache Spark がステージング バケットを作成します。
    • DP_POOLNAME: GKE クラスタに作成するノードプール の名前。
    • PHS_CLUSTER:(省略可)アクティブな GKE 上の Managed Service for Apache Spark クラスタと削除された GKE 上の Managed Service for Apache Spark クラスタの Spark ジョブ履歴の表示に使用するManaged Service for Apache Spark PHS サーバー 。PHS クラスタは、 GKE 上の Managed Service for Apache Spark 仮想クラスタと同じリージョンに配置する必要があります。
  2. 次のコマンドを実行します。

    gcloud dataproc clusters gke create ${DP_CLUSTER} \
        --region=${REGION} \
        --gke-cluster=${GKE_CLUSTER} \
        --spark-engine-version=latest \
        --staging-bucket=${BUCKET} \
        --pools="name=${DP_POOLNAME},roles=default" \
        --setup-workload-identity \
        --history-server-cluster=${PHS_CLUSTER}
    
    注:

    • --spark-engine-version: Managed Service for Apache Spark クラスタで使用される Spark イメージ バージョン 。`3`、`3.1`、`latest` などの識別子を使用することも、`3.1-dataproc-5` などの完全なサブマイナー バージョンを指定することもできます。
    • --staging-bucket: GKE 上の Managed Service for Apache Spark にステージング バケットを 作成させるには、このフラグを削除します。
    • --pools: Managed Service for Apache Spark が、ワークロードの作成やワークロードを実行するために使用する、新規または既存のノードプールの指定に使用します。GKE 上の Managed Service for Apache Spark ノードプールの設定をカンマで区切って列挙します(例:
      --pools=name=dp-default,roles=default,machineType=e2-standard-4,min=0,max=10
      
      ノードプールの namerole を指定する必要があります。その他のノードプールの設定は省略可能です。複数の --pools フラグを使用して、複数のノードプールを指定できます。 少なくとも 1 つのノードプールで default のロールを持つ必要があります。すべてのノードプールには同じロケーションが必要です。
    • --setup-workload-identity: このフラグは、 Workload Identity バインディングを有効にします。これらのバインディングにより、Kubernetes サービス アカウント(KSA) が仮想クラスタのデフォルトの Managed Service for Apache Spark VM サービス アカウント(データプレーン ID) として機能できるようになります。

REST

virtualClusterConfigcluster.create API リクエストの一部として作成します。

リクエストのデータを使用する前に、 次のように置き換えます。

  • PROJECT: Google Cloud プロジェクト ID
  • REGION: Dataproc 仮想クラスタのリージョン(既存の GKE クラスタ リージョンと同じリージョン)
  • DP_CLUSTER: Dataproc クラスタ名
  • GKE_CLUSTER: GKE クラスタ名
  • NODE_POOL: ノードプール名
  • PHS_CLUSTER: 永続履歴サーバー(PHS)のクラスタ名
  • BUCKET:(省略可)ステージング バケット名。GKE 上の Managed Service for Apache Spark でステージング バケットを作成する場合は、これを空のままにします。

HTTP メソッドと URL:

POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/clusters

リクエストの本文(JSON):

{
  "clusterName":"DP_CLUSTER",
  "projectId":"PROJECT",
  "virtualClusterConfig":{
    "auxiliaryServicesConfig":{
      "sparkHistoryServerConfig":{
        "dataprocCluster":"projects/PROJECT/regions/REGION/clusters/PHS_CLUSTER"
      }
    },
    "kubernetesClusterConfig":{
      "gkeClusterConfig":{
        "gkeClusterTarget":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER",
        "nodePoolTarget":[
          {
"nodePool":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER/nodePools/NODE_POOL",
            "roles":[
              "DEFAULT"
            ]
          }
        ]
      },
      "kubernetesSoftwareConfig":{
        "componentVersion":{
          "SPARK":"latest"
        }
      }
    },
    "stagingBucket":"BUCKET"
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "projectId":"PROJECT",
  "clusterName":"DP_CLUSTER",
  "status":{
    "state":"RUNNING",
    "stateStartTime":"2022-04-01T19:16:39.865716Z"
  },
  "clusterUuid":"98060b77-...",
  "statusHistory":[
    {
      "state":"CREATING",
      "stateStartTime":"2022-04-01T19:14:27.340544Z"
    }
  ],
  "labels":{
    "goog-dataproc-cluster-name":"DP_CLUSTER",
    "goog-dataproc-cluster-uuid":"98060b77-...",
    "goog-dataproc-location":"REGION",
    "goog-dataproc-environment":"prod"
  },
  "virtualClusterConfig":{
    "stagingBucket":"BUCKET",
    "kubernetesClusterConfig":{
      "kubernetesNamespace":"dp-cluster",
      "gkeClusterConfig":{
"gkeClusterTarget":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER",
        "nodePoolTarget":[
          {
"nodePool":"projects/PROJECT/locations/REGION/clusters/GKE_CLUSTER/nodePools/NODE_POOL",
            "roles":[
              "DEFAULT"
            ]
          }
        ]
      },
      "kubernetesSoftwareConfig":{
        "componentVersion":{
          "SPARK":"3.1-..."
        },
        "properties":{
          "dpgke:dpgke.unstable.outputOnly.endpoints.sparkHistoryServer":"https://...",
          "spark:spark.eventLog.dir":"gs://BUCKET/.../spark-job-history",
          "spark:spark.eventLog.enabled":"true"
        }
      }
    },
    "auxiliaryServicesConfig":{
      "sparkHistoryServerConfig":{
        "dataprocCluster":"projects/PROJECT/regions/REGION/clusters/PHS_CLUSTER"
      }
    }
  }

Spark ジョブの送信

GKE 上の Managed Service for Apache Spark 仮想クラスタが実行されたら、 コンソール、 gcloud CLI、または Managed Service for Apache Spark jobs.submit API を使用して(直接 HTTP リクエストまたは Cloud クライアント ライブラリを使用)Spark ジョブを送信します。 Google Cloud

gcloud CLI Spark ジョブの例:

gcloud dataproc jobs submit spark \
    --region=${REGION} \
    --cluster=${DP_CLUSTER} \
    --class=org.apache.spark.examples.SparkPi \
    --jars=local:///usr/lib/spark/examples/jars/spark-examples.jar \
    -- 1000

gcloud CLI PySpark ジョブの例:

gcloud dataproc jobs submit pyspark \
    --region=${REGION} \
    --cluster=${DP_CLUSTER} \
    local:///usr/lib/spark/examples/src/main/python/pi.py \
    -- 10

gcloud CLI SparkR ジョブの例:

gcloud dataproc jobs submit spark-r \
    --region=${REGION} \
    --cluster=${DP_CLUSTER} \
    local:///usr/lib/spark/examples/src/main/r/dataframe.R

クリーンアップ