Tindakan inisialisasi

Saat membuat cluster Dataproc, Anda dapat menentukan tindakan inisialisasi dalam executable atau skrip yang akan dijalankan Dataproc di semua node dalam cluster Dataproc Anda segera setelah cluster disiapkan. Tindakan inisialisasi sering kali menyiapkan dependensi tugas, seperti menginstal paket Python, sehingga tugas dapat dikirimkan ke cluster tanpa harus menginstal dependensi saat tugas dijalankan.

Anda dapat menemukan contoh skrip tindakan inisialisasi di lokasi berikut: Catatan: Google tidak mendukung contoh ini.

Pertimbangan dan panduan penting

  • Jangan membuat cluster produksi yang mereferensikan tindakan inisialisasi yang berada di bucket publik gs://goog-dataproc-initialization-actions-REGION. Skrip ini disediakan sebagai penerapan referensi. Skrip ini disinkronkan dengan perubahan repositori GitHub yang sedang berlangsung, dan update pada skrip ini dapat mengganggu pembuatan cluster Anda. Sebagai gantinya, salin tindakan inisialisasi dari bucket publik ke folder bucket Cloud Storage yang diberi versi, seperti yang ditunjukkan dalam contoh berikut:

    REGION=COMPUTE_REGION
    gcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \
        gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh
    
    Kemudian, buat cluster dengan merujuk salinan di Cloud Storage:
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \
        ...other flags...
    

  • Tindakan inisialisasi dijalankan pada setiap node secara berurutan selama pembuatan cluster. Skrip ini juga dijalankan di setiap node yang ditambahkan saat cluster menskalakan atau menskalakan otomatis.

  • Saat Anda memperbarui tindakan inisialisasi—misalnya, saat Anda menyinkronkan tindakan inisialisasi Cloud Storage ke perubahan yang dilakukan pada tindakan inisialisasi bucket publik atau repositori GitHub—buat folder baru (sebaiknya diberi nama versi) untuk menerima tindakan inisialisasi yang diperbarui. Jika Anda memperbarui tindakan inisialisasi di tempat, node baru, seperti yang ditambahkan oleh autoscaler, akan menjalankan tindakan inisialisasi yang diperbarui di tempat, bukan tindakan inisialisasi versi sebelumnya yang berjalan di node yang ada. Perbedaan tindakan inisialisasi tersebut dapat menyebabkan node cluster tidak konsisten atau rusak.

  • Tindakan inisialisasi berjalan sebagai pengguna root. Anda tidak perlu menggunakan sudo.

  • Gunakan jalur absolut dalam tindakan inisialisasi.

  • Gunakan baris shebang dalam tindakan inisialisasi untuk menunjukkan cara skrip harus ditafsirkan (seperti #!/bin/bash atau #!/usr/bin/python).

  • Jika tindakan inisialisasi dihentikan dengan kode keluar bukan nol, operasi pembuatan cluster akan melaporkan status "ERROR". Untuk men-debug tindakan inisialisasi, gunakan SSH untuk terhubung ke instance VM cluster, lalu periksa log. Setelah memperbaiki masalah tindakan inisialisasi, Anda dapat menghapus, lalu membuat ulang cluster.

  • Jika Anda membuat cluster Dataproc dengan alamat IP internal saja, upaya untuk mengakses github.com melalui internet dalam tindakan inisialisasi akan gagal kecuali jika Anda telah mengonfigurasi rute untuk mengarahkan traffic melalui Cloud NAT atau Cloud VPN. Tanpa akses ke internet, Anda dapat mengaktifkan Akses Google Pribadi dan menempatkan dependensi tugas di Cloud Storage; node cluster dapat mendownload dependensi dari Cloud Storage dari IP internal.

  • Anda dapat menggunakan image kustom Dataproc alih-alih tindakan inisialisasi untuk menyiapkan dependensi tugas.

  • Pemrosesan inisialisasi:

    • Cluster gambar sebelum 2.0:
      • Master: Untuk mengizinkan tindakan inisialisasi dijalankan di master untuk menulis file ke HDFS, tindakan inisialisasi node master tidak dimulai hingga HDFS dapat ditulis (hingga HDFS keluar dari mode aman dan setidaknya dua DataNode HDFS telah bergabung).
      • Pekerja: Jika Anda menetapkan dataproc:dataproc.worker.custom.init.actions.mode properti cluster ke RUN_BEFORE_SERVICES, setiap pekerja menjalankan tindakan inisialisasinya sebelum memulai daemon datanode HDFS dan nodemanager YARN. Karena Dataproc tidak menjalankan tindakan inisialisasi master hingga HDFS dapat ditulis, yang memerlukan 2 daemon datanode HDFS agar berjalan, menyetel properti ini dapat meningkatkan waktu pembuatan cluster.
    • Cluster gambar 2.0+:

      • Master: Tindakan inisialisasi node master dapat berjalan sebelum HDFS dapat ditulis. Jika Anda menjalankan tindakan inisialisasi yang menyiapkan file di HDFS atau bergantung pada ketersediaan layanan yang bergantung pada HDFS, seperti Ranger, tetapkan dataproc.master.custom.init.actions.mode properti cluster ke RUN_AFTER_SERVICES. Catatan: karena setelan properti ini dapat meningkatkan waktu pembuatan cluster—lihat penjelasan tentang penundaan pembuatan cluster untuk worker cluster gambar pra-2.0—gunakan hanya jika diperlukan (sebagai praktik umum, andalkan setelan RUN_BEFORE_SERVICES default untuk properti ini).
      • Pekerja: dataproc:dataproc.worker.custom.init.actions.mode Properti cluster disetel ke RUN_BEFORE_SERVICES dan tidak dapat diteruskan ke cluster saat cluster dibuat (Anda tidak dapat mengubah setelan properti). Setiap pekerja menjalankan tindakan inisialisasinya sebelum memulai daemon HDFS datanode dan YARN nodemanager. Karena Dataproc tidak menunggu HDFS dapat ditulis sebelum menjalankan tindakan inisialisasi master, tindakan inisialisasi master dan pekerja berjalan secara paralel.
    • Rekomendasi:

      • Gunakan metadata untuk menentukan peran node guna menjalankan tindakan inisialisasi secara bersyarat pada node (lihat Menggunakan metadata cluster).
      • Buat salinan tindakan inisialisasi ke bucket Cloud Storage untuk stabilitas (lihat Cara penggunaan tindakan inisialisasi).
      • Menambahkan percobaan ulang saat Anda mendownload dari internet untuk membantu menstabilkan tindakan inisialisasi.

Menggunakan tindakan inisialisasi

Tindakan inisialisasi cluster dapat ditentukan terlepas dari cara Anda membuat cluster:

Perintah Gcloud

Saat membuat cluster dengan perintah gcloud dataproc clusters create, tentukan satu atau beberapa lokasi Cloud Storage (URI) yang dipisahkan koma dari skrip atau file yang dapat dieksekusi untuk inisialisasi dengan tanda --initialization-actions. Catatan: Beberapa "/" berturut-turut dalam URI lokasi Cloud Storage setelah "gs://" awal, seperti "gs://bucket/my//object//name", tidak didukung. Jalankan gcloud dataproc clusters create --help untuk mengetahui informasi perintah.

gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
    --initialization-action-timeout=timeout-value (default=10m) \
    ... other flags ...
Catatan:
  • Gunakan flag --initialization-action-timeout untuk menentukan periode waktu tunggu untuk tindakan inisialisasi. Nilai waktu tunggu default adalah 10 menit. Jika executable atau skrip inisialisasi belum selesai pada akhir periode waktu tunggu, Dataproc membatalkan tindakan inisialisasi.
  • Gunakan dataproc:dataproc.worker.custom.init.actions.mode properti cluster untuk menjalankan tindakan inisialisasi pada pekerja utama sebelum daemon node manager dan datanode dimulai.

REST API

Tentukan satu atau beberapa skrip atau file yang dapat dieksekusi dalam array ClusterConfig.initializationActions sebagai bagian dari permintaan API clusters.create.

Contoh

POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
  "projectId": "my-project-id",
  "clusterName": "example-cluster",
  "config": {
    "configBucket": "",
    "gceClusterConfig": {
      "subnetworkUri": "default",
      "zoneUri": "us-central1-b"
    },
    "masterConfig": {
      "numInstances": 1,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "workerConfig": {
      "numInstances": 2,
      "machineTypeUri": "n1-standard-4",
      "diskConfig": {
        "bootDiskSizeGb": 500,
        "numLocalSsds": 0
      }
    },
    "initializationActions": [
      {
        "executableFile": "gs://cloud-example-bucket/my-init-action.sh"
      }
    ]
  }
}

Konsol

  • Buka halaman Create a cluster Dataproc, lalu pilih panel Customize cluster.
  • Di bagian Tindakan inisialisasi, masukkan lokasi bucket Cloud Storage setiap tindakan inisialisasi di kolom File yang dapat dieksekusi. Klik Browse untuk membuka halaman Google Cloud konsol Cloud Storage Browser guna memilih skrip atau file yang dapat dieksekusi. Klik Tambahkan Tindakan Inisialisasi untuk menambahkan setiap file.
  • Meneruskan argumen ke tindakan inisialisasi

    Dataproc menetapkan nilai metadata khusus untuk instance yang berjalan di cluster Anda. Anda dapat menetapkan metadata kustom sendiri sebagai cara untuk meneruskan argumen ke tindakan inisialisasi.

    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
        --metadata=name1=value1,name2=value2... \
        ... other flags ...
    

    Nilai metadata dapat dibaca dalam tindakan inisialisasi sebagai berikut:

    var1=$(/usr/share/google/get_metadata_value attributes/name1)
    

    Pemilihan node

    Jika Anda ingin membatasi tindakan inisialisasi ke node master, driver, atau pekerja, Anda dapat menambahkan logika pemilihan node sederhana ke file yang dapat dieksekusi atau skrip Anda.

    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      ... master specific actions ...
    else if [[ "${ROLE}" == 'Driver' ]]; then
      ... driver specific actions ...
    else
      ... worker specific actions ...
    fi
    

    Biner pementasan

    Skenario inisialisasi cluster yang umum adalah penyiapan biner tugas di cluster untuk menghilangkan kebutuhan penyiapan biner setiap kali tugas dikirimkan. Misalnya, asumsikan bahwa skrip inisialisasi berikut disimpan di gs://my-bucket/download-job-jar.sh, lokasi bucket Cloud Storage:

    #!/bin/bash
    ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
    if [[ "${ROLE}" == 'Master' ]]; then
      gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username
    fi
    

    Lokasi skrip ini dapat diteruskan ke perintah gcloud dataproc clusters create:

    gcloud dataproc clusters create my-dataproc-cluster \
        --region=${REGION} \
        --initialization-actions=gs://my-bucket/download-job-jar.sh
    

    Dataproc akan menjalankan skrip ini di semua node, dan sebagai konsekuensi dari logika pemilihan node skrip, akan mendownload JAR ke node master. Tugas yang dikirimkan kemudian dapat menggunakan JAR yang telah disiapkan sebelumnya:

    gcloud dataproc jobs submit hadoop \
        --cluster=my-dataproc-cluster \
        --region=${REGION} \
        --jar=file:///home/username/sessionalize-logs-1.0.jar
    

    Contoh tindakan inisialisasi

    Skrip tindakan inisialisasi sampel yang sering digunakan dan lainnya berada di gs://goog-dataproc-initialization-actions-<REGION>, bucket Cloud Storage publik regional, dan di repositori GitHub. Untuk menyumbangkan skrip, tinjau dokumen CONTRIBUTING.md, lalu ajukan permintaan penarikan.

    Logging

    Output dari eksekusi setiap tindakan inisialisasi dicatat untuk setiap instance di /var/log/dataproc-initialization-script-X.log, dengan X adalah indeks berbasis nol dari setiap skrip tindakan inisialisasi berikutnya. Misalnya, jika cluster Anda memiliki dua tindakan inisialisasi, output akan dicatat di /var/log/dataproc-initialization-script-0.log dan /var/log/dataproc-initialization-script-1.log.

    Langkah berikutnya

    Pelajari tindakan inisialisasi GitHub.