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

.

組織のセキュリティ ポリシー、規制コンプライアンス ルール、その他の考慮事項により、クラスタをスケジュールに従って削除してから再作成することで、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. ジョブの実行が完了した後、ローテーションするクラスタを削除します。