クラスタのローテーション

.

組織のセキュリティ ポリシー、規制遵守のルール、その他の考慮事項により、スケジュールに従ってクラスタを削除して再作成することで、定期的に Dataproc クラスタを「ローテーション」するように求められます。クラスタ ローテーションの一環として、置換されたクラスタの構成を維持しながら、最新の Dataproc イメージ バージョンで新しいクラスタをプロビジョニングできます。

このページでは、ローテーションするクラスタ(「ローテーションされたクラスタ」)を設定して、クラスタにジョブを送信し、必要に応じてクラスタをローテーションする方法について説明します。

カスタム イメージのクラスタ ローテーション: カスタム イメージ クラスタを再作成する場合、以前のまたは新しいカスタマイズを以前の、または新しい Dataproc ベースイメージに適用できます。

ローテーションされたクラスタを設定する

ローテーションされるクラスタを設定するには、新しいクラスタと区別するために一意のタイムスタンプが付いたクラスタ名を作成し、クラスタがローテーションされたクラスタプールの一部であることと、アクティブに新しいジョブ送信を受け取っているクラスタにラベルを付けます。この例では、これらの目的で cluster-pool ラベルと cluster-state=active ラベルを使用しますが、独自のラベル名を使用することもできます。

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

    PROJECT=project ID \
      REGION=region \
      CLUSTER_POOL=cluster-pool-name \
      CLUSTER_NAME=$CLUSTER_POOL-$(date '+%Y%m%d%H%M') \
      BUCKET=Cloud Storage bucket-name
    

    注:

    • cluster-pool-name: 1 つ以上のクラスタに関連付けられたクラスタプールの名前。この名前は、クラスタ名で使用されます。クラスタに cluster-pool ラベルが付加され、クラスタがプールの一部として識別されます。
  2. クラスタを作成します。引数を追加して、さまざまなラベルを使用できます。

    gcloud dataproc clusters create ${CLUSTER_NAME} \
      --project=${PROJECT_ID} \
      --region=${REGION} \
      --bucket=${BUCKET} \
      --labels="cluster-pool=${CLUSTER_POOL},cluster-state=active"
    

クラスタにジョブを送信する

次の Google Cloud CLI と Apache Airflow の有向非巡回グラフ(DAG)の例では、Apache Pig ジョブをクラスタに送信します。クラスタラベルは、クラスタプール内のアクティブ クラスタにジョブを送信するために使用されます。

gcloud

Cloud Storage にある Apache Pig ジョブを送信します。ラベルを使用してクラスタを選択します。

gcloud dataproc jobs submit pig \
    --region=${REGION} \
    --file=gs://${BUCKET}/scripts/script.pig \
    --cluster-labels="cluster-pool=${CLUSTER_POOL},cluster-state=active"
  

Airflow

Airflow を使用して Cloud Storage にある Apache Pig ジョブを送信します。ラベルを使用してクラスタを選択します。

from airflow import DAG
from airflow.providers.google.cloud.operators.dataproc import DataprocSubmitJobOperator
from datetime import datetime

# Declare variables
project_id=  # e.g: my-project
region="us-central1"
dag_id='pig_wordcount'
cluster_labels={"cluster-pool":${CLUSTER_POOL},
                "cluster-state":"active"}
wordcount_script="gs://bucket-name/scripts/wordcount.pig"

# Define DAG

dag = DAG(
    dag_id,
    schedule_interval=None,
    start_date=datetime(2023, 8, 16),
    catchup=False
)

PIG_JOB = {
    "reference": {"project_id": project_id},
    "placement": {"cluster_labels": cluster_labels},
    "pig_job": {"query_file_uri": wordcount_script},
}

wordcount_task = DataprocSubmitJobOperator(
    task_id='wordcount',
    region=region,
    project_id=project_id,
    job=PIG_JOB,
    dag=dag
)

クラスタをローテーションする

  1. ローテーションするクラスタに付加されているクラスタラベルを更新します。この例では、cluster-state=pendingfordeletion ラベルを使用して、クラスタが新しいジョブ送信を受信せず、ローテーションされていることを示しますが、この目的には独自のラベルを使用できます。

    gcloud dataproc clusters update ${CLUSTER_NAME} \
        --region=${REGION} \
        --update-labels="cluster-state=pendingfordeletion"
    

    クラスタラベルが更新されても、クラスタが新しいジョブを受信することはありません。これは、ジョブが active ラベルのみを持つクラスタプールに送信されるためです。クラスタへのジョブの送信をご覧ください。

  2. ローテーションを実行しているクラスタは、ジョブの実行後に削除します。