Dataproc カスタムイメージの作成

Dataproc クラスタには、ユーザーがプリインストールしたパッケージを含むカスタム イメージをプロビジョニングできます。次の手順では、カスタム イメージを作成して Dataproc クラスタにインストールする方法について説明します。

注:

  • このドキュメントの説明は、Linux オペレーティング システムのみに適用されます。その他のオペレーティング システムは、今後の Dataproc リリースでサポートされる可能性があります。
  • カスタム イメージを構築するには、Dataproc ベースイメージから始める必要があります(Debian、Rocky Linux、Ubuntu のベースイメージがサポートされています)。
  • オプション コンポーネントの使用: デフォルトでは、カスタム イメージは、Dataproc のオプション コンポーネント(OS パッケージと構成ファイル)のすべてをベースイメージから継承します。デフォルトの OS パッケージ バージョンと構成ファイルはカスタマイズできますが、クラスタを作成する際にオプションのコンポーネント名を指定する必要があります(たとえば、gcloud dataproc clusters create --optional-components=COMPONENT_NAME コマンドを実行して追加するオプション コンポーネントを確認します)。クラスタを作成する際にコンポーネント名を指定しない場合、コンポーネント(カスタムの OS パッケージと構成ファイルを含む)は削除されます。

準備

プロジェクトを設定する

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Dataproc API, Compute Engine API, and Cloud Storage API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. Dataproc API, Compute Engine API, and Cloud Storage API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init
  12. Python 3.11+ をインストールする
  13. カスタム パッケージのインストールまたは構成の更新を行うカスタマイズ スクリプトを準備します。たとえば、次のようにします。
      #! /usr/bin/bash
      apt-get -y update
      apt-get install python-dev
      apt-get install python-pip
      pip install numpy
      

プロジェクトで Cloud Storage バケットを作成する

  1. Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。

    [バケット] ページに移動

  2. [バケットを作成] をクリックします。
  3. [バケットの作成] ページでユーザーのバケット情報を入力します。次のステップに進むには、[続行] をクリックします。
    • [バケットに名前を付ける] で、バケット名の要件を満たす名前を入力します。
    • [データの保存場所の選択] で、次の操作を行います。
      • [ロケーション タイプ] オプションを選択します。
      • [ロケーション] オプションを選択します。
    • [データのデフォルトのストレージ クラスを選択する] で、ストレージ クラスを選択します。
    • [オブジェクトへのアクセスを制御する方法を選択する] で [アクセス制御] オプションを選択します。
    • [詳細設定(省略可)] には、暗号化メソッド保持ポリシー、またはバケットラベルを指定します。
  4. [作成] をクリックします。

カスタム イメージを生成する

Python プログラムの generate_custom_image.py を使用して、Dataproc カスタム イメージを作成します。

仕組み

generate_custom_image.py プログラムは、指定された Dataproc ベースイメージを使用して一時的な Compute Engine VM インスタンスを起動し、VM インスタンス内でカスタマイズ スクリプトを実行して、カスタム パッケージのインストールと構成の更新を行います。カスタマイズ スクリプトが完了すると、VM インスタンスがシャットダウンされ、VM インスタンスのディスクから Dataproc カスタム イメージが作成されます。一時的な VM は、カスタム イメージの作成後に削除されます。カスタム イメージは保存され、Dataproc クラスタを作成するために使用できます。

generate_custom_image.py プログラムは、gcloud CLI を使用して Compute Engine で複数ステップのワークフローを実行します。

コードの実行

GitHub の Dataproc カスタム イメージで、ファイルをフォークまたはクローンします。次に、generate_custom_image.py プログラムを実行し、Dataproc によりカスタム イメージを生成して保存します。

python3 generate_custom_image.py \
    --image-name=CUSTOM_IMAGE_NAME \
    [--family=CUSTOM_IMAGE_FAMILY_NAME] \
    --dataproc-version=IMAGE_VERSION \
    --customization-script=LOCAL_PATH \
    --zone=ZONE \
    --gcs-bucket=gs://BUCKET_NAME \
    [--no-smoke-test]

必須フラグ

  • --image-name: カスタムイメージの出力名。注: イメージ名は、正規表現 [a-z](?:[-a-z0-9]{0,61}[a-z0-9]) と一致する必要があります。たとえば、アンダースコアやスペースは使用できません。また、63 文字以下にする必要があります。
  • --dataproc-version: カスタム イメージで使用する Dataproc イメージ バージョン。バージョンは、「x.y.z-os」か「x.y.z-rc-os」の形式で指定します(例: 2.0.69-debian10)。
  • --customization-script: ツールを実行したときに、カスタム パッケージのインストールや、その他のカスタマイズが行われるスクリプトのローカルパス。このスクリプトは、カスタム イメージを作成するために一時的な VM でのみ実行されることに注意してください。カスタム イメージを使用してクラスタを作成するときに実行するその他の初期化アクションには、異なる初期化スクリプトを指定できます。
  • --zone: Compute Engine ゾーンgenerate_custom_image.py は、カスタム イメージを作成するために使用する一時的な VM をこのゾーンに作成します。
  • --gcs-bucket: gs://BUCKET_NAME 形式の URI。プロジェクトで Cloud Storage バケットを作成するで作成した Cloud Storage バケットを指します。generate_custom_image.py は、このバケットにログファイルを書き込みます。

オプション フラグ

  • --family: イメージのイメージ ファミリー。イメージ ファミリーとは、類似したイメージをグループ化するために使用され、ファミリー内の最新イメージへのポインタとしてクラスタを作成するときに使用されます。たとえば、「custom-1-5-debian10」のように使用します。
  • --no-smoke-test: 新しくビルドされたカスタム イメージのスモークテストを無効にするオプション フラグ。スモークテストでは、新しく作成されたイメージを使用して Dataproc のテストクラスタが作成され、小さいジョブが実行され、テストの終了時にクラスタが削除されます。スモークテストは、新しく作成されたカスタム イメージによって正常に機能する Dataproc クラスタを作成できることを検証するために、デフォルトで実行されます。--no-smoke-test フラグを使用すると、この手順を無効にできます。無効にすると、カスタム イメージのビルドプロセスは速くなりますが、おすすめしません。
  • --subnet: カスタム Dataproc イメージをビルドする VM の作成に使用するサブネットワーク。プロジェクトが共有 VPC の一部である場合、完全なサブネットワーク URL を projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET の形式で指定する必要があります。

追加のオプション フラグのリストについては、GithHub のオプションの引数をご覧ください。

generate_custom_image.py が正常に実行されると、カスタム イメージの imageURI がターミナル ウィンドウの出力に一覧表示されます(下に完全な imageUri太字で示します)。

...
managedCluster:
    clusterName: verify-image-20180614213641-8308a4cd
    config:
      gceClusterConfig:
        zoneUri: ZONE
      masterConfig:
        imageUri: https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

INFO:__main__:Successfully built Dataproc custom image: CUSTOM_IMAGE_NAME
INFO:__main__:

#####################################################################
  WARNING: DATAPROC CUSTOM IMAGE 'CUSTOM_IMAGE_NAME'
           WILL EXPIRE ON 2018-07-14 21:35:44.133000.
#####################################################################

上級ユーザー向けのカスタム イメージ バージョン ラベル

Dataproc の標準カスタム イメージ ツールを使用する場合、このツールは作成されたカスタム イメージに必要な goog-dataproc-version ラベルを自動的に設定します。このラベルは、Dataproc でイメージ上のソフトウェアを管理するために使用される機能と能力を反映しています。

独自のプロセスを使用してカスタム Dataproc イメージを作成する上級ユーザーは、次のようにカスタム イメージに手動でラベルを追加する必要があります。

  1. カスタム イメージの作成に使用されるベース Dataproc イメージから goog-dataproc-version ラベルを抽出します。

    gcloud compute images describe ${BASE_DATAPROC_IMAGE} \
        --project cloud-dataproc \
        --format="value(labels.goog-dataproc-version)"
    

  2. カスタム イメージにラベルを設定します。

    gcloud compute images add-labels IMAGE_NAME --labels=[KEY=VALUE,...]
    

カスタム イメージを使用する

Dataproc クラスタを作成するときに、カスタム イメージを指定します。 カスタム イメージは Cloud Compute イメージに保存され、作成日から 365 日間、Dataproc クラスタの作成に利用できます(365 日間の有効期限後にカスタム イメージを使用する方法については、期限切れのカスタム イメージを使用してクラスタを作成する方法をご覧ください)。

カスタム イメージの URI

カスタム イメージの imageUri をクラスタ作成オペレーションに渡します。 この URI は、次の 3 つのいずれかの方法で指定できます。

  1. 完全 URI:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/`gs://`BUCKET_NAME`
  2. 部分 URI: projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
  3. 省略名: CUSTOM_IMAGE_NAME

カスタム イメージは、ファミリー URI で指定することもできます。これにより、イメージ ファミリー内の最新イメージが常に選択されます。

  1. 完全 URI:
    https://www.googleapis.com/compute/beta/projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME/var>
  2. 部分 URI: projects/PROJECT_ID/global/images/family/CUSTOM_IMAGE_FAMILY_NAME

カスタム イメージ URI の検索方法

gcloud コマンド

次の gcloud コマンドを実行して、カスタム イメージの名前を一覧表示します。

gcloud compute images list

カスタム イメージの名前を次の gcloud コマンドに渡し、カスタム イメージの URI(selfLink)を一覧表示します。

gcloud compute images describe custom-image-name
...
name: CUSTOM_IMAGE_NAME
selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME
...

コンソール

  1. Google Cloud コンソールで [Compute Engine] → [イメージ] ページを開き、イメージ名をクリックします。 イメージのフィルタ用テキスト ボックスにクエリを挿入して、表示されるイメージの数を制限できます。
  2. イメージの詳細ページが開きます。[同等の REST] をクリックします。
  3. REST レスポンスには、イメージの URI である selfLink など、イメージに関する詳細情報が一覧表示されます。
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

カスタム イメージを使用してクラスタを作成する

カスタム イメージを使用したマスターノードとワーカーノードからなるクラスタを作成するには、gcloud コマンドライン ツール、Dataproc API、Google Cloud Console を使用できます。

gcloud コマンド

カスタム イメージを使用して Dataproc クラスタを作成するには、--image フラグを指定した dataproc clusters create コマンドを使用します。例:
gcloud dataproc clusters create CLUSTER-NAME \
    --image=CUSTOM_IMAGE_URI \
    --region=REGION \
    ... other flags ...

REST API

カスタム イメージを使用してクラスタを作成するには、cluster.create API リクエストに含まれる masterConfigworkerConfig、および該当する場合は secondaryWorkerConfig の各オブジェクトの InstanceGroupConfig.imageUri フィールドにカスタム イメージの URI を指定します。

例: カスタム イメージで標準の Dataproc クラスタ(1 つのマスターノード、2 つのワーカーノード)を作成するための REST リクエスト。

POST /v1/projects/PROJECT_ID/regions/REGION/clusters/
{
  "clusterName": "CLUSTER_NAME",
  "config": {
    "masterConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    },
    "workerConfig": {
      "imageUri": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME"
    }
  }
}
  

コンソール

  1. Google Cloud コンソールで、Dataproc の [クラスタの作成] ページを開きます。[クラスターを設定] パネルが選択されています。
  2. [バージョニング] セクションで、[変更] をクリックします。[カスタム イメージ] タブを選択し、Dataproc クラスタに使用するカスタム イメージを選択して、[選択] をクリックします。

[クラスタを作成] フォームを送信すると、選択したカスタム イメージとともに、クラスタの VM がプロビジョニングされます。

カスタム イメージを使用して Dataproc クラスタ プロパティをオーバーライドする

カスタム イメージを使用して、クラスタの作成時に設定されたクラスタ プロパティを上書きできます。ユーザーがカスタム イメージを使用してクラスタを作成する場合に、カスタム イメージとは異なるクラスタ プロパティを設定すると、カスタム イメージ クラスタのプロパティ設定が優先されます。

カスタム イメージを使用してクラスタ プロパティを設定するには:

  1. カスタム イメージのカスタマイズ スクリプトで、/etc/google-dataprocdataproc.custom.properties ファイルを作成し、ファイルにクラスタのプロパティ値を設定します。
    • dataproc.custom.properties ファイル コンテンツの例:
      dataproc.conscrypt.provider.enable=VALUE
      dataproc.logging.stackdriver.enable=VALUE
      

2 つのクラスタ プロパティをオーバーライドするためのカスタマイズ スクリプト ファイル作成スニペットの例:

     cat <<EOF >/etc/google-dataproc/dataproc.custom.properties
     dataproc.conscrypt.provider.enable=true
     dataproc.logging.stackdriver.enable=false
     EOF

期限切れのカスタム イメージを使用してクラスタを作成する方法

デフォルトで、カスタム イメージはイメージの作成日から 365 日後に期限切れになります。 次の手順に従って、期限切れのカスタム イメージを使用するクラスタを作成できます。

  1. 期限切れのカスタム イメージ、または 10 日以内に期限切れになるカスタム イメージを使用して、Dataproc クラスタの作成を試みます。

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --region=REGION \
        ... other flags ...
    

  2. dataproc:dataproc.custom.image.expiration.token CLI によって、クラスタ のプロパティ名とトークン値が含まれたエラー メッセージが発行されます。

    dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE
    
    「トークン値」の文字列をクリップボードにコピーします。

  3. gcloud CLI を使用して、上記でコピーした「トークン値」をクラスタのプロパティとして追加し、Dataproc クラスタをもう一度作成します。

    gcloud dataproc clusters create CLUSTER-NAME \
        --image=CUSTOM-IMAGE-NAME \
        --properties=dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE \
        --region=REGION \
        ... other flags ...
    

これで、このカスタム イメージを使用してクラスタを作成できます。