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

プリインストールされたパッケージを含むカスタム イメージを使用して Dataproc クラスタを作成できます。このページでは、カスタム イメージを作成して Dataproc クラスタにインストールする方法について説明します。

使用上の検討事項と制限事項

  • カスタム イメージの存続期間: クラスタが最新のサービス更新とバグ修正を確実に受け取れるようにするため、カスタム イメージを使用したクラスタの作成は、カスタム イメージの作成日から 365 日以内に制限されています。カスタム イメージを使用して作成された既存のクラスタは無期限に実行できます。

    365 日を超える期間に特定のカスタム イメージを使用してクラスタを作成する場合は、自動化が必要になる場合があります。詳細については、期限切れのカスタム イメージを使用してクラスタを作成するをご覧ください。

  • Linux のみ: このドキュメントの説明は、Linux オペレーティング システムにのみ適用されます。その他のオペレーティング システムは、今後の Dataproc リリースでサポートされる可能性があります。

  • サポートされているベースイメージ: カスタム イメージのビルドは、Dataproc ベースイメージから開始する必要があります。サポートされているベースイメージは、Debian、Rocky Linux、Ubuntu です。

    • ベースイメージの可用性: Dataproc リリースノートで通知された新しいイメージは、通知日から 1 週間経過するまで、カスタム イメージのベースとして使用できません。
  • オプション コンポーネントの使用

    • 2.2 以前のベースイメージ: デフォルトでは、すべての Dataproc オプション コンポーネント(OS パッケージと構成)がカスタム イメージにインストールされます。OS パッケージのバージョンと構成をカスタマイズできます。

    • 2.3 以降のベースイメージ: 選択したオプション コンポーネントのみがカスタム イメージにインストールされます(generate_custom_image.py --optional-components フラグを参照)。

    カスタム イメージに使用するベースイメージに関係なく、クラスタを作成するときに、オプションのコンポーネントを一覧表示または選択する必要があります。

    例: Google Cloud CLI クラスタの作成コマンド:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

    クラスタを作成するときにコンポーネントを指定しないと、オプション コンポーネント(カスタムの OS パッケージと構成を含む)は削除されます。

  • ホストされているカスタム イメージの使用: 別のプロジェクトでホストされているカスタム イメージを使用する場合、プロジェクトの Dataproc サービス エージェント サービス アカウントにホスト プロジェクトのイメージに対する compute.images.get 権限が必要です。この権限を付与するには、ホストされているイメージに対する roles/compute.imageUser ロールをプロジェクトの Dataproc サービス エージェント サービス アカウントに付与します(組織内でカスタム イメージを共有するを参照)。

  • セキュアブート MOK(マシン所有者キー)シークレットの使用: Dataproc カスタム イメージでセキュアブートを有効にするには、次の操作を行います。

    1. Secret Manager API(secretmanager.googleapis.comを有効にします。Dataproc では、鍵ペアの生成と管理に Secret Manager サービスを使用します。

    2. カスタム イメージを生成するときに、generate_custom_image.py コマンドに --service-account="SERVICE_ACCOUNT" フラグを追加します。注: サービス アカウントに、プロジェクトに対する Secret Manager 閲覧者ロール(roles/secretmanager.viewer)と公開および非公開のシークレットに対する Secret Manager アクセサー ロール(roles/secretmanager.secretAccessor)を付与する必要があります。

      例を含む詳細については、GitHub の GoogleCloudDataproc/custom-images リポジトリの examples/secure-boot ディレクトリにある README.md などのファイルをご覧ください。

      セキュアブートを無効にする方法: デフォルトでは、Dataproc カスタム イメージ スクリプトを Dataproc クラスタから実行するとき、鍵ペアの生成と管理に Secret Manager が使用されます。カスタム イメージでセキュアブートを使用しない場合は、カスタム イメージを生成するときに、generate_custom_image.py コマンドに --trusted-cert=""(空のフラグ値)を含めます。

始める前に

カスタム イメージを生成する前に、プロジェクトを設定してください。

プロジェクトを設定する

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Google Cloud CLI をインストールします。

  6. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  7. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Dataproc API, Compute Engine API, and Cloud Storage APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Google Cloud CLI をインストールします。

  12. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  13. gcloud CLI を初期化するには、次のコマンドを実行します:

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

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

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

    [バケット] に移動

  2. [ [Create]] をクリックします。
  3. [バケットの作成] ページでユーザーのバケット情報を入力します。次のステップに進むには、[続行] をクリックします。
    1. [スタートガイド] セクションで、次の操作を行います。
    2. [データの保存場所の選択] セクションで、次の操作を行います。
      1. ロケーション タイプを選択してください。
      2. [Location type] プルダウン メニューから、バケットのデータが永続的に保存されるロケーションを選択します。
      3. クロスバケット レプリケーションを設定するには、 [Storage Transfer Service 経由でクロスバケット レプリケーションを追加する] を選択し、 次の手順を実施します:

        クロスバケット レプリケーションを設定する

        1. [バケット] メニューで、バケットを選択します。
        2. [レプリケーション設定] セクションで、[構成] をクリックして、レプリケーション ジョブの設定を構成します。

          [**クロスバケット レプリケーションを構成する**] ペインが表示されます。

          • オブジェクト名の接頭辞で複製するオブジェクトをフィルタするには、 オブジェクトを追加または除外する接頭辞を入力し、 [接頭辞を追加] をクリックします。
          • 複製されたオブジェクトのストレージ クラスを設定するには、 [Storage class] メニューからストレージ クラスを選択します。 この手順をスキップすると、複製されたオブジェクトはデフォルトで宛先バケットのストレージ クラスを使用します。
          • [完了] をクリックします。
    3. [データの保存場所の選択] セクションで、次の操作を行います。
      1. バケットのデフォルトのストレージ クラスを選択するか、バケットデータのストレージ クラスを自動的に管理するAutoclassを選択します。
      2. 階層名前空間を有効にするには、 [データ量が多いワークロード向けにストレージを最適化] セクションで、 [このバケットで階層的な名前空間を有効にする] を選択します。
    4. In the [オブジェクトへのアクセスを制御する方法を選択する] セクションで、バケットに 公開アクセスの防止 を適用するかどうかを選択し、バケットのオブジェクトに使用する アクセス制御方法 を選択します。
    5. [オブジェクト データを保護する方法を選択する] セクションで、次の操作を行います。
      • [**データ保護**] で、バケットに設定するオプションを選択します。
        • 削除(復元可能)を有効にするには、 [削除(復元可能)ポリシー(データ復旧用)] チェックボックスをオンにして、 削除後にオブジェクトを保持する日数を指定します。
        • オブジェクトのバージョニングを設定するには、 [オブジェクトのバージョニング(バージョン管理用)] チェックボックスをオンにして、 オブジェクトごとの最大バージョン数と、非現行バージョンが期限切れになるまでの日数を指定します。
        • オブジェクトとバケットで保持ポリシーを有効にするには、[保持(コンプライアンス用)] チェックボックスをオンにして、次の操作を行います。
          • [オブジェクト保持ロック]を有効にするには、 [オブジェクト保持を有効にする]チェックボックスをオンにします。
          • [Bucket Lock] を有効にするには、[バケット保持ポリシーを設定する] チェックボックスをオンにして、保持期間の単位と保持期間を選択します。
      • オブジェクト データの暗号化方法を選択するには、 [データ暗号化] セクション()を開き、 [データの暗号化] 方法を選択します
  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: カスタム イメージの出力名。

  • --dataproc-version: カスタム イメージで使用する Dataproc イメージ バージョン。バージョンは x.y.z-os または x.y.z-rc-os の形式で指定します(例: 2.0.69-debian10)。

  • --customization-script: ツールを実行したときに、カスタム パッケージのインストールや、その他のカスタマイズが行われるスクリプトのローカルパス。このスクリプトは、カスタム イメージの作成に使用される一時的な VM でのみ、Linux 起動スクリプトとして実行されます。カスタム イメージを使用してクラスタを作成するときに実行するその他の初期化アクションには、異なる初期化スクリプトを指定できます。

    プロジェクト間のイメージ: カスタム イメージを使用して異なるプロジェクトにクラスタを作成すると、イメージ内に保存されている gcloud コマンドまたは gsutil コマンドのキャッシュが原因でエラーが発生することがあります。この問題を回避するには、カスタマイズ スクリプトに次のコマンドを含めて、キャッシュに保存された認証情報を消去します。

    rm -r /root/.gsutil /root/.config/gcloud
    
  • --zone: Compute Engine ゾーンgenerate_custom_image.py は、カスタム イメージを作成するために使用する一時的な VM をこのゾーンに作成します。

  • --gcs-bucket: Cloud Storage バケットを指す gs://BUCKET_NAME 形式の URI。generate_custom_image.py は、このバケットにログファイルを書き込みます。

オプション フラグ

  • --family: カスタム イメージのイメージ ファミリー。イメージ ファミリーは、類似したイメージをグループ化するために使用されます。クラスタを作成するときに、ファミリー内の最新イメージへのポインタとして使用できます。例: custom-2-2-debian12
  • --no-smoke-test: 新しくビルドされたカスタム イメージのスモークテストを無効にするオプション フラグ。スモークテストでは、新しく作成されたイメージを使用して Dataproc のテストクラスタが作成され、小さいジョブが実行され、テストの終了時にクラスタが削除されます。スモークテストは、新しく作成されたカスタム イメージによって正常に機能する Dataproc クラスタを作成できることを検証するために、デフォルトで実行されます。--no-smoke-test フラグを使用すると、この手順を無効にできます。無効にすると、カスタム イメージのビルドプロセスは速くなりますが、おすすめしません。
  • --subnet: カスタム Dataproc イメージをビルドする VM の作成に使用するサブネットワーク。プロジェクトが共有 VPC の一部である場合、完全なサブネットワーク URL を projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET の形式で指定する必要があります。
  • --optional-components: このフラグは、ベースイメージ バージョン 2.3 以降を使用する場合にのみ使用できます。イメージにインストールするオプション コンポーネント(SOLR、RANGER、TRINO、DOCKER、FLINK、HIVE_WEBHCAT、ZEPPELIN、HUDI、ICEBERG、PIG など)のリスト(PIG はイメージ バージョン 2.3 以降でオプション コンポーネントとして使用可能)。

    例: Google Cloud CLI クラスタの作成コマンド:

    gcloud dataproc clusters create CLUSTER_NAME
        --image=CUSTOM_IMAGE_URI  \
        --optional-components=COMPONENT_NAME \
        ... other flags
    

使用可能なオプション フラグのリストについては、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 イメージを作成する場合は、次のようにカスタム イメージに goog-dataproc-version ラベルを手動で追加する必要があります。

  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 イメージに保存され、作成日から 60 日間、Cloud Dataproc クラスタの作成に利用できます(60 日間の有効期限後にカスタム イメージを使用する方法については、期限切れのカスタム イメージを使用してクラスタを作成をご覧ください)。

カスタム イメージの 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 を見つける

Google Cloud CLI

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

gcloud compute images list

カスタム イメージの名前を次のコマンドに渡し、カスタム イメージの 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] → [イメージ] ページを開き、イメージ名をクリックします。[filter images] フィールドにクエリを挿入して、表示されるイメージの数を制限できます。
  2. [イメージの詳細] ページが開きます。[同等の REST] をクリックします。
  3. REST レスポンスに、イメージの URI である selfLink など、イメージに関する詳細情報が一覧表示されます。
    {
      ...
      "name": "my-custom-image",
      "selfLink": "projects/PROJECT_ID/global/images/CUSTOM_IMAGE_NAME",
      "sourceDisk": ...,
      ...
    }
    

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

gcloud CLI、Dataproc API、またはGoogle Cloud コンソールを使用してクラスタを作成します。

gcloud CLI

--image フラグを指定した dataproc clusters create コマンを実行し、カスタム イメージを使用して Dataproc クラスタを作成します。

例:
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. 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. gcloud CLI によって、クラスタのプロパティ名とトークン値 dataproc:dataproc.custom.image.expiration.token を含むエラー メッセージが発行されます。

dataproc:dataproc.custom.image.expiration.token=TOKEN_VALUE

TOKEN_VALUE 文字列をクリップボードにコピーします。

  1. gcloud CLI を使用して、コピーした TOKEN_VALUE をクラスタのプロパティとして追加し、Dataproc クラスタをもう一度作成します。

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

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