Google Kubernetes Engine での Dataproc

概要

この機能を使用すると、Dataproc Jobs API で実行中の Google Kubernetes Engine クラスタに Spark ジョブを送信できます。

この機能を使用してできること:

  • 統一リソース管理をデプロイする
  • Spark ジョブを分離して分析ライフ サイクルを加速する

GKE で Dataproc ジョブを実行する

  1. GKE クラスタを作成する

    Dataproc コンポーネント向けのデプロイ プラットフォームとして、実行中の GKE クラスタが必要です。

    gcloud コマンド

    環境変数を設定して、ローカルまたは Cloud Shellgcloud beta container clusters create コマンドを実行し、Dataproc クラスタとして機能する GKE クラスタを作成します。

    1. 環境変数を設定します。
      • gke-cluster-name を設定します。使用できるのは、小文字の英数字と「-」のみです。
      • クラスタ region を設定します(例: 「us-central1」)。
      • クラスタ zone を選択したリージョンのゾーンに設定します(例: 「us-central1-a」)。
      GKE_CLUSTER=gke-cluster-name \
        GCE_REGION=region
      
    2. gcloud コマンドを実行します。
      • クラスタのサービス アカウントを権限メカニズムとして使用するには、--scopes を「cloud-platform」に設定します。
      • Compute Engine VM 認証を使用するには、--workload-metadata-from-node を「GCE_METADATA」に設定します。
      • --machine-type を「n1-standard-4」に設定します(4 個以上の CPU を推奨)。
      gcloud beta container clusters create "${GKE_CLUSTER}" \
          --scopes=cloud-platform \
          --workload-metadata-from-node=GCE_METADATA \
          --machine-type=n1-standard-4 \
          --region="${GCE_REGION}"
      
  2. Dataproc-on-GKE クラスタを作成する

    この手順では、GKE クラスタを Dataproc サービスに関連付けて Spark ジョブの送信を可能にするコンポーネントをデプロイして、Dataproc クラスタを既存の GKE クラスタに割り当てます。

    gcloud コマンド

    環境変数を設定し、ローカルまたは Cloud Shellgcloud beta dataproc clusters create コマンドを実行して Dataproc-on-GKE クラスタを作成します。

    1. 環境変数を設定します。
      • dataproc-cluster-name に使用できるのは、小文字の英数字と「-」のみです。
      • Dataproc-on-GKE version を指定します(例: 1.4.27-beta)。
      • ステージング アーティファクト用の Cloud Storage bucket URI を指定します。

      DATAPROC_CLUSTER=dataproc-cluster-name \
        VERSION=version \
        BUCKET=bucket-name
      

    2. gcloud コマンドを実行します。

      gcloud beta dataproc clusters create "${DATAPROC_CLUSTER}" \
          --gke-cluster="${GKE_CLUSTER}" \
          --region="${GCE_REGION}" \
          --image-version="${VERSION}" \
          --bucket="${BUCKET}"
      

      注:

      • 上記のコマンドは GKE クラスタ内に名前空間を自動的に生成しますが、--gke-cluster-namespace 引数を追加することで名前空間を指定できます。
      • Dataproc のサービス アカウントにアクセス権を付与する必要があります。Dataproc のプロジェクト固有のサービス アカウントに、Kubernetes Engine Admin IAM ロールを付与する必要があります。このサービス アカウントの形式は service-{project-number}@dataproc-accounts.iam.gserviceaccount.com です。

        • 1.4.23-beta バージョンの場合のみ、Kubernetes Engine Admin IAM ロールによって、Kubernetes クラスタへのアクセス権を、Dataproc インストール アカウントである service-51209575642@gcp-sa-saasmanagement.iam.gserviceaccount.com に付与する必要があります。

  3. Spark ジョブの送信

    gcloud dataproc コマンド、Dataproc Jobs API、Cloud Console を使用して、Dataproc クラスタに Spark ジョブを送信します(ジョブの送信を参照)。

    Spark ジョブの例:

    gcloud dataproc jobs submit spark \
        --cluster="${DATAPROC_CLUSTER}" \
        --region="${GCE_REGION}" \
        --class=org.apache.spark.examples.SparkPi \
        --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar
    

    PySpark ジョブの例:

    gcloud dataproc jobs submit pyspark \
        --cluster="${DATAPROC_CLUSTER}" foo.py \
        --region="${GCE_REGION}"
    

    SparkR ジョブの例:

    gcloud dataproc jobs submit spark-r \
        --cluster="${DATAPROC_CLUSTER}" file:/usr/lib/spark/examples/src/main/r/dataframe.R \
        --region="${GCE_REGION}"
    

バージョン

GKE クラスタで Dataproc を作成するには、バージョン番号の指定が必要です。バージョン番号は、Dataproc クラスタ固有の名前空間のクラスタにインストールされる必須コンポーネントとオプション コンポーネントの特定のバンドルに対応しています。次の表に、利用可能なバージョンの一覧を示します。

バージョン コンポーネント デフォルト イメージ
1.4.23-beta Dataproc ジョブ エージェント、Spark 演算子 Spark: gcr.io/cloud-dataproc/spark:1.4.23-deb9-beta
  • Spark、PySpark、SparkR のジョブ タイプのサポート
  • service-51209575642@gcp-sa-saasmanagement.iam.gserviceaccount.com サービス アカウントへの Kubernetes Engine Admin IAM ロールの付与が必要
1.4.27-beta Dataproc ジョブ エージェント、Spark 演算子 Spark: gcr.io/cloud-dataproc/spark:1.4.27-deb9-beta
  • Spark、PySpark、SparkR のジョブ タイプのサポート

Dataproc Docker イメージ

Dataproc クラスタの作成時に指定されたバージョンに基づいて、適切なデフォルトの Dataproc Docker イメージがクラスタによって自動的に使用されます。イメージのデフォルト構成では、Cloud Storage コネクタで Spark を構成します。バージョンのドキュメントで、デフォルトのイメージを確認できます。

ログ

ジョブドライバとエグゼキュータのログは、GKE クラスタと名前空間の下の Stackdriver Logging で確認できます。

トラブルシューティング

  • ストール ドライバ Spark 2.4.1+ には、Kubernetes のクライアント スレッドが原因でドライバ(特に PySpark ドライバ)が滞るという、既知の問題 SPARK-27812 があります。この問題を回避するには:

    1. SparkSessionspark.stop() を呼び出すか、SparkContextsc.stop() を呼び出して、SparkSession または SparkContext を停止します。
    2. Spark 2.4.0 ベースのイメージ(gcr.io/dataproc-2f10d78d114f6aaec7646/spark/spark など)を使用します。

クリーンアップ

割り当てられたリソースを削除するには、次の gcloud delete コマンドを使用します。エラーを回避するには、Dataproc クラスタを削除した後、GKE クラスタを削除します。

Dataproc クラスタ リソースを削除します。

gcloud beta dataproc clusters delete "${DATAPROC_CLUSTER}" \
    --region=${GCE_REGION}

GKE クラスタを削除します。

gcloud beta container clusters delete "${GKE_CLUSTER}"  \
  --region="${GCE_REGION}"