Dataproc セカンダリ ワーカー

Dataproc クラスタは、標準的な Compute Engine VM を Dataproc ワーカー(「プライマリ」ワーカーと呼びます)として使用するだけでなく、secondary ワーカーも使用できます。

次のルールは、Dataproc クラスタ内のすべてのセカンダリ ワーカーに適用されます。

  • 処理のみ - セカンダリ ワーカーはデータを保存しません。これらは、処理ノードとしてのみ機能します。そのため、セカンダリ ワーカーを使用すると、ストレージをスケールすることなく、コンピューティングをスケールできます。

  • セカンダリ ワーカーのみのクラスタはゼロ: クラスタにはプライマリ ワーカーが必要です。クラスタを作成し、プライマリ ワーカーの数を指定しない場合、Dataproc によって 2 つのプライマリ ワーカーがクラスタに追加されます。

  • マシンタイプ - デフォルトでは、セカンダリ ワーカーはクラスタのプライマリ ワーカーのマシンタイプを使用します。たとえば、n1-standard-4 マシンタイプを使用するプライマリ ワーカーでクラスタを作成した場合、デフォルトでは、クラスタに追加されたすべてのセカンダリ ワーカーも n1-standard-4 マシンを使用します。

    セカンダリ ワーカーにデフォルトのプライマリ ワーカー マシンタイプを使用する代わりに、セカンダリ ワーカーに 1 つ以上のマシンタイプのランク付けされたリストを指定できます。詳細については、Dataproc フレキシブル VM をご覧ください。

  • 永続ディスクサイズ: デフォルトとして、すべてのセカンダリ ワーカーは 100GB またはプライマリ ワーカーのブートディスク サイズのいずれか小さい方で作成されます。このディスク容量は、データをローカルのキャッシュに保存するために使用され、HDFS では使用できません。 クラスタ作成時に gcloud dataproc clusters create --secondary-worker-boot-disk-size コマンドを使用して、デフォルトのディスクサイズをオーバーライドできます。このフラグは、クラスタの作成時にセカンダリ ワーカーが割り当てられなかった場合でも指定できます。

  • 非同期作成 - クラスタの作成またはスケーリングによってセカンダリ ワーカーを追加する場合、セカンダリ ワーカーは、作成または更新のオペレーションが完了するまでプロビジョニングされません。これは、Dataproc はプロビジョニングが可能になり次第 VM を非同期に作成し、マネージド インスタンス グループ(MIG)を使用してセカンダリ ワーカーを管理するためです(マネージド インスタンスのステータスの確認をご覧ください)。

プリエンプティブルと非プリエンプティブル セカンダリ ワーカー

セカンダリ ワーカーには、Spot VM、標準プリエンプティブル VM非プリエンプティブル VM の 3 種類があります。デフォルトの Dataproc セカンダリ ワーカーのタイプは、標準プリエンプティブル VM です。Spot と非プリエンプティブル セカンダリ ワーカーを組み合わせて指定できます。

例: クラスタを作成するときに 3 つのセカンダリ ワーカーを選択した場合は、3 つの Spot VM、3 つのプリエンプティブル VM、3 つの非プリエンプティブル VM、またはSpot ワーカーと非プリエンプティブル ワーカーを組み合わせることができます。

プリエンプティブル ワーカー

  • プリエンプティブル ワーカーの削除の可能性はジョブの安定性に影響を及ぼす可能性がありますが、プリエンプティブル インスタンスを使用して、重要性の低いデータ処理の 1 時間あたりの計算費用の削減や、非常に大規模なクラスタの低総費用での作成ができます(Google Cloud 料金計算ツールを使用して費用を見積もることができます)。

  • 最適な結果を得るには、クラスタ内のプリエンプティブル ワーカーの数を、クラスタ内のワーカー数の合計(プライマリ ワーカーとすべてのセカンダリ ワーカー)の 50% 未満にする必要があります。

  • プリエンプティブル ワーカーを使用する場合は、非プリエンプティブル ワーカーで実行されるジョブと比較して、ジョブの一時的な単一ワーカータスクの失敗が多くなります。低レベルのタスクの失敗に対するジョブの許容度を上げるには、クラスタの自動スケーリングで使用されるデフォルトのプロパティ値と同様のクラスタ プロパティ値を設定して、タスクの再試行の最大回数を増やし、ジョブの失敗を回避することが可能です。

  • コスト節減の検討事項: プリエンプティブル VM を使用しても、プリエンプションによってジョブの実行時間が長くなり、ジョブの費用が高くなる可能性があるため、必ずしもコスト削減につながるわけではありません。プリエンプティブル VM で高度な柔軟性モード(EFM)を使用すると、この影響を軽減できますが、プリエンプティブル VM の全体的なコスト削減はユースケースによって異なります。一般的に、有効期間が短いジョブの方が、ジョブ実行中のプリエンプションの可能性が低いため、プリエンプティブル VM の使用に適しています。非プリエンプティブル VM や EFM を使用するプリエンプティブル VM など、さまざまなジョブ オプションを試して、費用の見積もりを行い、最適なソリューションを見つけてください。

非プリエンプティブル ワーカー

セカンダリ ワーカーを選択する

Google Cloud Consolegcloud CLI、または Dataproc API を使用してクラスタを作成するときに、セカンダリ ワーカーの数とタイプを指定できます。

  • スポットと非プリエンプティブル セカンダリ ワーカーを組み合わせることができます
  • 作成後にクラスタを更新して、クラスタ内のセカンダリ ワーカーの数を変更できますが、セカンダリ ワーカーのタイプは変更できません。
  • ラベルの更新は、24 時間以内にすべてのプリエンプティブル セカンダリ ワーカーに反映されます。ラベルの更新はプリエンプティブルでない既存のセカンダリ ワーカーには反映されません。ラベルの更新は、ラベル更新のにクラスタに追加されたすべてのワーカーに伝搬されます。たとえば、クラスタをスケールアップすると、すべての新しいプライマリ ワーカーとセカンダリ ワーカーに新しいラベルが付けられます。

Console

Google Cloud コンソールから Dataproc クラスタを作成する際に、セカンダリ ワーカーの数を指定できます。クラスタを作成したら、Google Cloud コンソールからクラスタ構成を編集して、セカンダリ ワーカーの追加や削除を行います。

セカンダリ ワーカーを含むクラスタを作成する

Google Cloud コンソールの Dataproc [クラスタの作成] ページの [ノードの構成] パネルの [セカンダリ ワーカーノード] セクションで、新しいクラスタに適用するセカンダリ ワーカーの数とタイプを設定します。[セカンダリ ワーカー ノード] フィールドと [プリエンプティブル] フィールドに、セカンダリ ワーカーの数とタイプをそれぞれ指定します。

セカンダリ インスタンスを使用してクラスタを更新する

クラスタ内のセカンダリ ワーカー数を更新するには、Google Cloud コンソールの [クラスタ] ページでクラスタ名をクリックします。[クラスタの詳細] ページで、[構成] タブをクリックし、[編集] をクリックして、[セカンダリ ワーカーノード] フィールドの番号を更新します。

クラスタからすべてのセカンダリ インスタンスを削除する

クラスタからすべてのセカンダリ ワーカーを削除するには、[セカンダリ ワーカーノード] フィールドに 0 を指定して、先ほどの説明のとおりにクラスタ構成を更新します。

Google Cloud CLI コマンド

gcloud dataproc clusters create コマンドを使用して、クラスタの作成時にセカンダリ ワーカーをクラスタに追加します。クラスタの作成後に、gcloud dataproc clusters update コマンド(更新できるセカンダリ ワーカーのタイプではなく、数値)を使用して、セカンダリ ワーカーをクラスタから追加または削除できます。

セカンダリ ワーカーを含むクラスタを作成する

セカンダリ ワーカーを持つクラスタを作成するには、--num-secondary-workers 引数を持つ gcloud dataproc clusters create コマンドを使用します。セカンダリ ワーカーは、デフォルトでは標準プリエンプティブル VM です。クラスタの作成時に、--secondary-worker-type フラグを「non-preemptible」または「spot」に設定して、非プリエンプティブルまたは Spot のセカンダリ ワーカーを指定できます。次の例は、各セカンダリ ワーカー タイプ(プリエンプティブル(デフォルト)、Spot(プリエンプティブル)、非プリエンプティブル)を使用してクラスタを作成する方法を示しています。追加のフラグを使用して、スポットと非プリエンプティブルのセカンダリ ワーカーを組み合わせることができます。

例 1

次のコマンドは、2 つの標準プリエンプティブル(デフォルト タイプ)セカンダリ ワーカーを持つ「cluster1」を作成します。

gcloud dataproc clusters create cluster1 \
    --num-secondary-workers=2 \
    --region=us-central1
例 2

次のコマンドは、secondary-worker-type フラグを使用して 2 つの Spot(プリエンプティブル)セカンダリ ワーカーを持つ「cluster2」を作成します。

gcloud dataproc clusters create cluster2 \
    --num-secondary-workers=2 \
    --secondary-worker-type=spot \
    --region=us-central1

例 3

次のコマンドは、secondary-worker-type フラグを使用して 2 つの非プリエンプティブルセカンダリ ワーカーを持つ「cluster3」を作成します。

gcloud dataproc clusters create cluster3 \
    --num-secondary-workers=2 \
    --secondary-worker-type=non-preemptible \
    --region=us-central1
セカンダリ ワーカーのブートディスクのサイズを変更します。デフォルトとして、すべてのセカンダリ ワーカーが 100GB またはメインワーカーのブート ディスク サイズ未満で作成されます。このディスク容量は、データをローカルのキャッシュに保存するために使用され、HDFS では使用できません。クラスタ作成時に gcloud dataproc clusters create --secondary-worker-boot-disk-size コマンドを使用して、デフォルトのディスクサイズをオーバーライドできます。このフラグは、クラスタの作成時にセカンダリ ワーカーが割り当てられなかった場合でも指定できます。Google Cloud コンソールにクラスタ作成リクエストを作成させます。Dataproc の [クラスタの作成] ページの左パネルの下部にある [ 同等の REST またはコマンドライン] リンクをクリックすると、Google Cloud コンソールにより同等の API REST リクエストまたは gcloud ツールコマンドが作成されます。

セカンダリ ワーカーを含むクラスタを更新する

セカンダリ ワーカーを追加または削除するクラスタを更新するには、--num-secondary-workers フラグを指定して gcloud dataproc clusters update コマンドを使用します。


次のコマンドは、4 つのセカンダリ ワーカー(デフォルト タイプまたはクラスタ作成時に指定したタイプ)を使用するように example-cluster を更新します。

gcloud dataproc clusters update example-cluster \
    --num-secondary-workers=4 \
    --region=us-central1

クラスタからすべてのセカンダリ ワーカーを削除する

クラスタからすべてのセカンダリ ワーカーを削除するには、--num-secondary-workers0 に設定して gcloud dataproc clusters update コマンドを使用します。


次のコマンドは、「example-cluster」からすべてのセカンダリ ワーカーを削除します。

gcloud dataproc clusters update example-cluster \
    --num-secondary-workers=0 \
    --region=us-central1

REST API

セカンダリ ワーカーを含むクラスタを作成する

Dataproc clusters.create API を使用して、クラスタの作成時にセカンダリ ワーカーをクラスタに追加します。次の例は、preemptible(デフォルト)、spot(プリエンプティブ)、non-preemptible の各セカンダリ ワーカータイプを使用してクラスタを作成する方法を示しています。追加のフィールドを使用して、スポットと非プリエンプティブル セカンダリ ワーカーを組み合わせることができます。

例 1

次の POST リクエストは、2 つの標準プリエンプティブル(デフォルト タイプ)VM ワーカーを持つ「cluster1」を作成します。


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

{
  "clusterName": "cluster1",
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 2
    }
  }
}
例 2

次の POST リクエストは、2 つの Spot(プリエンプティブル)VM ワーカーを持つ「cluster2」を作成します。


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

{
  "clusterName": "cluster2",
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 2,
      "preemptibility": "SPOT"
    }
  }
}

例 3

次の POST リクエストは、2 つの非プリエンプティブル セカンダリ ワーカーを持つ「cluster3」を作成します。


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

{
  "clusterName": "cluster3",
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 2,
      "preemptibility": "NON_PREEMPTIBLE"
    }
  }
}

セカンダリ ワーカーを含むクラスタを更新する

Dataproc clusters.patch API を使用して、セカンダリ ワーカーを追加および削除します。


次の PATCH リクエストは、4 つのセカンダリ ワーカー(デフォルト タイプまたはクラスタ作成時に指定したタイプ)を持つようにクラスタを更新します。


PATCH /v1/projects/project-id/regions/region/clusters/cluster-name?updateMask=config.secondary_worker_config.num_instances
{
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 4
    }
  }
}
Google Cloud コンソールにクラスタ作成リクエストを作成させます。Dataproc の [クラスタの作成] ページの左パネルの下部にある [ 同等の REST またはコマンドライン] リンクをクリックすると、Google Cloud コンソールにより同等の API REST リクエストまたは gcloud CLI コマンドが作成されます。

セカンダリ ワーカーのトラブルシューティング

  • サービス アカウントの権限に関する問題: セカンダリ ワーカーはマネージド インスタンス グループを介して作成されます。権限に関する問題がある場合、Dataproc ログにはセカンダリ ワーカーの作成エラーは報告されませんが、失敗したワーカーは Google Cloud コンソールの [クラスタの詳細] ページの [VM インスタンス] タブに緑色のチェックマークなしで表示されます。リスティングを表示するには、Dataproc の [クラスタ] ページを開き、クラスタ名をクリックして、クラスタの [クラスタの詳細] ページを開きます。

  • マネージド インスタンス グループの権限の問題: マネージド インスタンス グループの権限に問題があるかどうかを確認するには:

    1. マネージド インスタンス グループの名前(instanceGroupManagerName)を確認します。

      Console

      1. Dataproc の [クラスタ] ページを開き、クラスタ名をクリックして、クラスタの [クラスタの詳細] ページを開きます。
      2. ページの下部にある [同等の REST] をクリックして、config.secondaryWorkerConfig.managedGroupConfig.instanceGroupManagerName 値を表示します。

      Google Cloud CLI

      --format フラグを指定して gcloud dataproc clusters describe コマンドを実行し、instanceGroupManagerName を表示します。
      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION \
          --format='value(config.secondaryWorkerConfig.managedGroupConfig.instanceGroupManagerName)'
      

      REST API

      clusters.get リクエストを送信して、config.secondaryWorkerConfig.managedGroupConfig.instanceGroupManagerName の値を返します。
    2. ログ エクスプローラでログを表示します。
    • Google Compute Engine Instance Group リソースタイプを選択し、マネージド インスタンス グループ名でフィルタします。

    • または、`resource.type="gce_instance_group" と resource.labels.instance_group_name=INSTANCE_GROUP_MANAGER_NAME にロギング フィルタを適用することもできます。

スポットと非プリエンプティブル セカンダリ ワーカーを組み合わせる

Dataproc クラスタを作成するときに、Spot セカンダリ ワーカーと非プリエンプティブル セカンダリ ワーカーを組み合わせて指定できます。

Spot と非プリエンプティブル セカンダリ ワーカーを混在させるセカンダリ ワーカーの設定

Dataproc クラスタを作成するときに、次のセカンダリ ワーカー設定を使用して、Spot VM が使用可能な場合に容量を増やすことができる最小レベルのセカンダリ ワーカー容量を取得します。

  • セカンダリ ワーカー数: プロビジョニングするセカンダリ ワーカーの合計数。

  • セカンダリ ワーカーのタイプ: spot は、Spot と非プリエンプティブル セカンダリ ワーカーを混在させる場合のセカンダリ ワーカーのタイプです。

  • standardCapacityBase: プロビジョニングする非プリエンプティブル(標準)セカンダリ ワーカーの数。非プリエンプティブル セカンダリ ワーカーは、他のタイプのセカンダリ ワーカーの前にプロビジョニングされます。

  • standardCapacityPercentAboveBase: standardCapacityBase のセカンダリ ワーカー数が入力されると、リクエストされたセカンダリ ワーカーの合計数を満たすために必要な残りのセカンダリ ワーカー数は、次のように非プリエンプティブル VM と Spot VM が混在して入力されます。

    • standardCapacityPercentAboveBase: プリエンプティブでない VM で埋める残りのセカンダリ ワーカーの割合。
    • リクエストされたセカンダリ ワーカーの合計数を満たすために必要な残りの数は、スポット VM で埋められます。

例:

  • セカンダリ ワーカーの数: 15
  • standardCapacityBase: 5
  • standardCapacityPercentAboveBase 30%

結果:

  • プリエンプティブではない: 8 = 5(standardCapacityBase)+ 3(残りの 10 の 30%)
  • スポット: 7(残りの 10 個の 70%)
  • 合計 = 15

Spot セカンダリ ワーカーと非プリエンプティブル セカンダリ ワーカーを組み合わせてクラスタを作成する

クラスタを作成するときに、gcloud CLI または Dataproc API を使用して、スポットと非プリエンプティブル セカンダリ ワーカーを組み合わせることができます。

gcloud

ローカルまたは Cloud Shell で次のコマンドを実行して、Spot セカンダリ ワーカーと非プリエンプティブル セカンダリ ワーカーを組み合わせたクラスタを作成します。

gcloud dataproc clusters create CLUSTER_NAME \
    --project=PROJECT_ID \
    --region=REGION \
    --secondary-worker-type=spot \
    --num-secondary-workers=NUMBER_SECONDARY_WORKERS \
    --secondary-worker-standard-capacity-base=STANDARD_CAPACITY_BASE \
    --secondary-worker-standard-capacity-percent-above-base=STANDARD_CAPACITY_PERCENT_ABOVE_BASE \
    OTHER_FLAGS_AS_NEEDED

注:

API

スポットとプリエンプティブル以外のセカンダリ ワーカーを混在させるには、次の JSON サンプルに示すように、cluster.create リクエストの一部として Dataproc の preemptibilitystandardCapacityBasestandardCapacityPercentAboveBase API フィールドを設定します。

{
  "clusterName": "CLUSTER_NAME",
  "config": {
    "secondaryWorkerConfig": {
      "numInstances": 15,
      "preemptibility": "spot",
      "instanceFlexibilityPolicy": {
        "provisioningModelMix": {
          "standardCapacityBase": STANDARD_CAPACITY_BASE
          "standardCapacityPercentAboveBase": STANDARD_CAPACITY_PERCENT_ABOVE_BASE
        }
      }
    }
  }
}

注:

セカンダリ ワーカーの混在とフレキシブル VM を組み合わせる

クラスタの作成時に、Spot セカンダリ ワーカーと非プリエンプティブル セカンダリ ワーカーを組み合わせて、セカンダリ ワーカーのフレキシブル VM シェイプを指定できます。

gcloud CLI の例:

gcloud dataproc clusters create cluster-name \
    --project=project-id \
    --region=us-cdbtral1 \
    --secondary-worker-type=spot \
    --num-secondary-workers=15 \
    --secondary-worker-standard-capacity-base=5 \
    --secondary-worker-standard-capacity-percent-above-base=30 \
    --secondary-worker-machine-types="type=n2-standard-8,rank=0" \
    --secondary-worker-machine-types="type=e2-standard-8,type=t2d-standard-8,rank=1"
    ...other flags as needed

セカンダリ ワーカーの混合特性

このセクションでは、スポット ワーカーと非プリエンプティブル セカンダリ ワーカーの混在に関連する動作と特性について説明します。

セカンダリ ワーカーの設定

Dataproc は、セカンダリ ワーカーでアプリケーションをスケジューリングするときに、Spot VM と非プリエンプティブル VM のどちらも優先しません。

セカンダリ ワーカーのスケーリング

セカンダリ ワーカーが自動スケーリングまたは手動スケーリングでスケーリングされる場合、Dataproc はセカンダリ ワーカーを追加するときに、リクエストされたスポットと非プリエンプティブルの比率を維持します。

セカンダリ ワーカーの混合設定の更新

Spot セカンダリ ワーカーと非プリエンプティブル セカンダリ ワーカーの組み合わせは、Dataproc クラスタを作成するときに指定します。クラスタの作成後にセカンダリ ワーカーの構成を変更することはできません。

Spot セカンダリ ワーカーのプリエンプション

  • Dataproc は、Spot VM のプリエンプションのタイミングを制御しません(Spot VM のプリエンプションをご覧ください)。
  • Spot プリエンプションが発生すると、Compute Engine がプリエンプトされた VM を再プロビジョニングするまで、セカンダリ ワーカー グループは容量が減らされて一時的に実行されます。
  • Dataproc は、グループの初期設定を超える容量をセカンダリ ワーカー グループに追加しません。