Saat membuat cluster Managed Service untuk Apache Spark, Anda dapat menentukan tindakan inisialisasi dalam file yang dapat dieksekusi atau skrip yang akan dijalankan oleh Managed Service untuk Apache Spark di semua node dalam cluster Managed Service untuk Apache Spark 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 skrip tindakan inisialisasi contoh di lokasi berikut: Catatan: Google tidak mendukung contoh ini.
- Repositori GitHub
- Cloud Storage—di bucket publik regional
gs://goog-dataproc-initialization-actions-REGION
Pertimbangan dan panduan penting
Jangan membuat cluster produksi yang mereferensikan tindakan inisialisasi yang berada di
gs://goog-dataproc-initialization-actions-REGIONbucket publik. Skrip ini disediakan sebagai implementasi referensi. Skrip ini disinkronkan dengan perubahan repositori GitHub yang sedang berlangsung, dan update pada skrip ini dapat merusak 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: Kemudian, buat cluster dengan mereferensikan salinan di Cloud Storage:REGION=COMPUTE_REGIONgcloud 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.shgcloud 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. Tindakan ini juga dijalankan pada setiap node yang ditambahkan saat cluster ditingkatkan skalanya atau diskalakan otomatis.
Saat Anda mengupdate tindakan inisialisasi—misalnya, saat Anda menyinkronkan tindakan inisialisasi Cloud Storage dengan perubahan yang dilakukan pada tindakan inisialisasi repositori GitHub atau bucket publik—buat folder baru (sebaiknya diberi nama versi) untuk menerima tindakan inisialisasi yang diupdate. Jika, sebagai gantinya, Anda mengupdate tindakan inisialisasi di tempat, node baru, seperti yang ditambahkan oleh penskala otomatis, akan menjalankan tindakan inisialisasi yang diupdate di tempat, bukan tindakan inisialisasi versi sebelumnya yang berjalan di node yang ada. Perbedaan tindakan inisialisasi tersebut dapat menyebabkan node cluster yang tidak konsisten atau rusak.
Tindakan inisialisasi berjalan sebagai pengguna
root. Anda tidak perlu menggunakansudo.Gunakan jalur absolut dalam tindakan inisialisasi.
Gunakan akhir baris gaya Unix (LF) dalam tindakan inisialisasi. Jika Anda membuat tindakan inisialisasi di Windows, tindakan tersebut mungkin berisi akhir baris gaya Windows (CRLF), yang dapat menyebabkan kegagalan eksekusi skrip.
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 Managed Service untuk Apache Spark dengan alamat IP internal saja, upaya untuk mengakses
github.commelalui 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 Managed Service untuk Apache Spark , bukan tindakan inisialisasi, untuk menyiapkan dependensi tugas.
Pemrosesan inisialisasi:
- Cluster image pra-2.0:
- Master: Untuk mengizinkan tindakan inisialisasi berjalan 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 HDFS DataNode telah bergabung).
- Pekerja: Jika Anda menetapkan
dataproc:dataproc.worker.custom.init.actions.modeproperti cluster keRUN_BEFORE_SERVICES, setiap pekerja akan menjalankan tindakan inisialisasinya sebelum memulai daemon datanode HDFS dan nodemanager YARN. Karena Managed Service untuk Apache Spark tidak menjalankan tindakan inisialisasi master hingga HDFS dapat ditulis, yang memerlukan 2 daemon datanode HDFS untuk berjalan, menetapkan properti ini dapat meningkatkan waktu pembuatan cluster.
Cluster image 2.0+:
- Master: Tindakan inisialisasi node master dapat berjalan sebelum
HDFS dapat ditulis. Jika Anda menjalankan tindakan inisialisasi yang menyimpan
file di HDFS atau bergantung pada ketersediaan layanan yang bergantung pada HDFS,
seperti Ranger, tetapkan
dataproc.master.custom.init.actions.modeproperti cluster keRUN_AFTER_SERVICES. Catatan: karena setelan properti ini dapat meningkatkan waktu pembuatan cluster—lihat penjelasan untuk penundaan pembuatan cluster bagi pekerja cluster image pra-2.0—gunakan setelan ini hanya jika diperlukan (sebagai praktik umum, gunakan setelan default untuk properti ini).RUN_BEFORE_SERVICES - Pekerja:
dataproc:dataproc.worker.custom.init.actions.modeProperti cluster ditetapkan keRUN_BEFORE_SERVICESdan tidak dapat diteruskan ke cluster saat cluster dibuat (Anda tidak dapat mengubah setelan properti). Setiap pekerja menjalankan tindakan inisialisasinya sebelum memulai daemon datanode HDFS dan nodemanager YARN. Karena Managed Service untuk Apache Spark tidak menunggu HDFS dapat ditulis sebelum menjalankan tindakan inisialisasi master, tindakan inisialisasi master dan pekerja berjalan secara paralel.
- Master: Tindakan inisialisasi node master dapat berjalan sebelum
HDFS dapat ditulis. Jika Anda menjalankan tindakan inisialisasi yang menyimpan
file di HDFS atau bergantung pada ketersediaan layanan yang bergantung pada HDFS,
seperti Ranger, tetapkan
Rekomendasi:
- Gunakan metadata untuk menentukan peran node guna menjalankan tindakan inisialisasi secara kondisional pada node (lihat Menggunakan metadata cluster).
- Buat fork salinan tindakan inisialisasi ke bucket Cloud Storage untuk stabilitas (lihat Cara tindakan inisialisasi digunakan).
- Tambahkan percobaan ulang saat Anda mendownload dari internet untuk membantu menstabilkan tindakan inisialisasi.
- Cluster image pra-2.0:
Menggunakan tindakan inisialisasi
Tindakan inisialisasi cluster dapat ditentukan, terlepas dari cara Anda membuat cluster:
- Melalui the Google Cloud konsol
- Menggunakan gcloud CLI
- Secara terprogram dengan Managed Service untuk Apache Spark clusters.create API (lihat NodeInitializationAction)
gcloud CLI
Saat membuat cluster dengan perintah
gcloud dataproc clusters create, tentukan satu atau beberapa lokasi Cloud Storage (URI) yang dipisahkan koma
dari file yang dapat dieksekusi atau skrip inisialisasi dengan flag
--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 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 ...
- Gunakan flag
--initialization-action-timeoutuntuk menentukan periode waktu tunggu bagi tindakan inisialisasi. Nilai waktu tunggu default adalah 10 menit. Jika file yang dapat dieksekusi atau skrip inisialisasi belum selesai pada akhir periode waktu tunggu, Managed Service untuk Apache Spark akan membatalkan tindakan inisialisasi. -
Gunakan
dataproc:dataproc.worker.custom.init.actions.modeproperti cluster untuk menjalankan tindakan inisialisasi pada pekerja utama sebelum daemon pengelola node 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
Meneruskan argumen ke tindakan inisialisasi
Managed Service untuk Apache Spark menetapkan nilai metadata khusus untuk instance yang berjalan di cluster Anda. Anda dapat menetapkan metadata kustom Anda 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 ingin membatasi tindakan inisialisasi ke node master, driver, atau pekerja, Anda dapat menambahkan logika pemilihan node ke file yang dapat dieksekusi atau skrip.
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
File biner tahap
Skenario inisialisasi cluster yang umum adalah penahapan file biner tugas pada cluster untuk menghilangkan kebutuhan untuk menahapkan file 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
Managed Service untuk Apache Spark 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 ditahapkan 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 yang sering digunakan dan contoh lainnya berada di
gs://goog-dataproc-initialization-actions-<REGION>, bucket Cloud Storage publik regional, dan di repositori GitHub
.
Untuk berkontribusi skrip, tinjau dokumen
CONTRIBUTING.md, lalu ajukan permintaan pull.
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 berturut-turut. 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.