Melakukan penskalaan otomatis cluster Dataproc

Apa yang dimaksud dengan penskalaan otomatis?

Memperkirakan jumlah pekerja cluster (node) yang "tepat" untuk beban kerja sulit, dan satu ukuran cluster untuk seluruh pipeline sering kali tidak ideal. Penskalaan Cluster yang dimulai pengguna sebagian mengatasi tantangan ini, tetapi memerlukan pemantauan penggunaan cluster dan intervensi manual.

AutoscalingPolicies API Dataproc menyediakan mekanisme untuk mengotomatiskan pengelolaan resource cluster dan memungkinkan penskalaan otomatis VM pekerja cluster. Autoscaling Policy adalah konfigurasi yang dapat digunakan kembali yang menjelaskan cara pekerja cluster yang menggunakan kebijakan penskalaan otomatis seharusnya diskalakan. Kebijakan ini menentukan batas, frekuensi, dan agresivitas penskalaan untuk memberikan kontrol terperinci atas resource cluster selama masa berlaku cluster.

Kapan harus menggunakan penskalaan otomatis

Gunakan penskalaan otomatis:

di cluster yang menyimpan data di layanan eksternal, seperti Cloud Storage atau BigQuery

di cluster yang memproses banyak tugas

untuk menskalakan cluster tugas tunggal

dengan Mode Fleksibilitas yang Ditingkatkan untuk tugas batch Spark

Penskalaan otomatis tidak direkomendasikan dengan/untuk:

  • HDFS: Penskalaan otomatis tidak dimaksudkan untuk menskalakan HDFS di cluster karena:

    1. Penggunaan HDFS bukan merupakan sinyal untuk penskalaan otomatis.
    2. Data HDFS hanya dihosting di pekerja utama. Jumlah pekerja utama harus memadai untuk menghosting semua data HDFS.
    3. Penghentian DataNode HDFS dapat menunda penghapusan pekerja. Datanode menyalin blok HDFS ke DataNode lain sebelum pekerja dihapus. Bergantung pada ukuran data dan faktor replikasi, proses ini dapat memerlukan waktu beberapa jam.
  • Label Node YARN: Penskalaan otomatis tidak mendukung Label Node YARN, atau properti dataproc:am.primary_only karena YARN-9088. YARN salah melaporkan metrik cluster saat label node digunakan.

  • Spark Structured Streaming: Penskalaan otomatis tidak mendukung Spark Structured Streaming (lihat Penskalaan Otomatis dan Spark Structured Streaming).

  • Cluster Tidak Ada Aktivitas: Penskalaan otomatis tidak direkomendasikan untuk tujuan menskalakan cluster ke ukuran minimum saat cluster tidak ada aktivitas. Karena membuat cluster baru sama cepatnya dengan mengubah ukuran cluster, sebaiknya hapus cluster tidak ada aktivitas dan buat ulang. Alat berikut mendukung model "ephemeral" ini:

    Gunakan Alur Kerja Dataproc untuk menjadwalkan serangkaian tugas di cluster khusus, lalu hapus cluster tersebut saat tugas selesai. Untuk orkestrasi lanjutan, gunakan Cloud Composer, yang didasarkan pada Apache Airflow.

    Untuk cluster yang memproses kueri ad hoc atau beban kerja terjadwal secara eksternal, gunakan Penghapusan Terjadwal Cluster untuk menghapus cluster setelah periode atau durasi tidak ada aktivitas yang ditentukan, atau pada waktu tertentu.

  • Workload dengan ukuran berbeda: Saat tugas kecil dan besar berjalan di cluster, pengurangan skala penghentian layanan yang halus akan menunggu tugas besar selesai. Akibatnya, tugas yang berjalan lama akan menunda penskalaan otomatis resource untuk tugas yang lebih kecil yang berjalan di cluster hingga tugas yang berjalan lama selesai. Untuk menghindari hasil ini, kelompokkan tugas yang lebih kecil dengan ukuran yang sama di cluster, dan isolasi setiap tugas berdurasi panjang di cluster terpisah.

Mengaktifkan penskalaan otomatis

Untuk mengaktifkan penskalaan otomatis di cluster:

  1. Membuat kebijakan penskalaan otomatis.

  2. Salah satu:

    1. Membuat cluster penskalaan otomatis, atau
    2. Aktifkan penskalaan otomatis di cluster yang ada.

Membuat kebijakan penskalaan otomatis

Perintah gcloud

Anda dapat menggunakan perintah gcloud dataproc autoscaling-policies import untuk membuat kebijakan penskalaan otomatis. File ini membaca file YAML lokal yang menentukan kebijakan penskalaan otomatis. Format dan konten file harus cocok dengan objek dan kolom konfigurasi yang ditentukan oleh autoscalingPolicies REST API.

Contoh YAML berikut menentukan kebijakan yang menentukan semua kolom yang diperlukan. Fungsi ini juga memberikan nilai minInstances dan maxInstances untuk pekerja utama, nilai maxInstances untuk pekerja sekunder (dapat di-preempt), dan menentukan cooldownPeriod 4 menit (defaultnya adalah 2 menit). workerConfig mengonfigurasi pekerja utama. Dalam contoh ini, minInstances dan maxInstances ditetapkan ke nilai yang sama untuk menghindari penskalaan pekerja primer.

workerConfig:
  minInstances: 10
  maxInstances: 10
secondaryWorkerConfig:
  maxInstances: 50
basicAlgorithm:
  cooldownPeriod: 4m
  yarnConfig:
    scaleUpFactor: 0.05
    scaleDownFactor: 1.0
    gracefulDecommissionTimeout: 1h

Berikut adalah contoh YAML lain yang menentukan semua kolom kebijakan penskalaan otomatis opsional dan wajib.

workerConfig:
  minInstances: 10
  maxInstances: 10
  weight: 1
secondaryWorkerConfig:
  minInstances: 0
  maxInstances: 100
  weight: 1
basicAlgorithm:
  cooldownPeriod: 2m
  yarnConfig:
    scaleUpFactor: 0.05
    scaleDownFactor: 1.0
    scaleUpMinWorkerFraction: 0.0
    scaleDownMinWorkerFraction: 0.0
    gracefulDecommissionTimeout: 1h

Jalankan perintah gcloud berikut dari terminal lokal atau di Cloud Shell untuk membuat kebijakan penskalaan otomatis. Berikan nama untuk kebijakan. Nama ini akan menjadi id kebijakan, yang dapat Anda gunakan dalam perintah gcloud berikutnya untuk mereferensikan kebijakan. Gunakan flag --source untuk menentukan jalur file lokal dan nama file file YAML kebijakan penskalaan otomatis yang akan diimpor.

gcloud dataproc autoscaling-policies import policy-name \
    --source=filepath/filename.yaml \
    --region=region

REST API

Buat kebijakan penskalaan otomatis dengan menentukan AutoscalingPolicy sebagai bagian dari permintaan autoscalingPolicies.create.

Konsol

Untuk membuat kebijakan penskalaan otomatis, pilih CREATE POLICY dari halaman Autoscaling policies Dataproc menggunakan konsol Google Cloud. Di halaman Create policy, Anda dapat memilih panel rekomendasi kebijakan untuk mengisi kolom kebijakan penskalaan otomatis untuk jenis tugas atau tujuan penskalaan tertentu.

Membuat cluster penskalaan otomatis

Setelah membuat kebijakan penskalaan otomatis, buat cluster yang akan menggunakan kebijakan penskalaan otomatis. Cluster harus berada di region yang sama dengan kebijakan penskalaan otomatis.

Perintah gcloud

Jalankan perintah gcloud berikut dari terminal lokal atau di Cloud Shell untuk membuat cluster penskalaan otomatis. Berikan nama untuk cluster, dan gunakan flag --autoscaling-policy untuk menentukan policy id (nama kebijakan yang Anda tentukan saat membuat kebijakan) atau kebijakan resource URI (resource name) (lihat kolom AutoscalingPolicy id dan name).

gcloud dataproc clusters create cluster-name \
    --autoscaling-policy=policy id or resource URI \
    --region=region

REST API

Buat cluster penskalaan otomatis dengan menyertakan AutoscalingConfig sebagai bagian dari permintaan clusters.create.

Konsol

Anda dapat memilih kebijakan penskalaan otomatis yang ada untuk diterapkan ke cluster baru dari bagian Kebijakan penskalaan otomatis di panel Siapkan cluster di halaman Dataproc Buat cluster di konsol Google Cloud.

Mengaktifkan penskalaan otomatis di cluster yang ada

Setelah membuat kebijakan penskalaan otomatis, Anda dapat mengaktifkan kebijakan di cluster yang ada di region yang sama.

Perintah gcloud

Jalankan perintah gcloud berikut dari terminal lokal atau di Cloud Shell untuk mengaktifkan kebijakan penskalaan otomatis di cluster yang ada. Berikan nama cluster, dan gunakan flag --autoscaling-policy untuk menentukan policy id (nama kebijakan yang Anda tentukan saat membuat kebijakan) atau kebijakan resource URI (resource name) (lihat kolom AutoscalingPolicy id dan name).

gcloud dataproc clusters update cluster-name \
    --autoscaling-policy=policy id or resource URI \
    --region=region

REST API

Untuk mengaktifkan kebijakan penskalaan otomatis di cluster yang ada, tetapkan AutoscalingConfig.policyUri kebijakan di updateMask permintaan clusters.patch.

Konsol

Saat ini, mengaktifkan kebijakan penskalaan otomatis di cluster yang ada tidak didukung di konsol Google Cloud.

Penggunaan kebijakan multi-cluster

  • Kebijakan penskalaan otomatis menentukan perilaku penskalaan yang dapat diterapkan ke beberapa cluster. Kebijakan penskalaan otomatis paling baik diterapkan di beberapa cluster jika cluster akan berbagi beban kerja yang serupa atau menjalankan tugas dengan pola penggunaan resource yang serupa.

  • Anda dapat memperbarui kebijakan yang digunakan oleh beberapa cluster. Pembaruan tersebut segera memengaruhi perilaku penskalaan otomatis untuk semua cluster yang menggunakan kebijakan (lihat autoscalingPolicies.update). Jika Anda tidak ingin update kebijakan diterapkan ke cluster yang menggunakan kebijakan, nonaktifkan penskalaan otomatis di cluster sebelum mengupdate kebijakan.

Perintah gcloud

Jalankan perintah gcloud berikut dari terminal lokal atau di Cloud Shell untuk menonaktifkan penskalaan otomatis di cluster.

gcloud dataproc clusters update cluster-name --disable-autoscaling \
    --region=region

REST API

Untuk menonaktifkan penskalaan otomatis di cluster, tetapkan AutoscalingConfig.policyUri ke string kosong dan tetapkan update_mask=config.autoscaling_config.policy_uri dalam permintaan clusters.patch.

Konsol

Saat ini, menonaktifkan penskalaan otomatis di cluster tidak didukung di konsol Google Cloud.

Cara kerja penskalaan otomatis

Penskalaan otomatis memeriksa metrik Hadoop YARN cluster saat setiap periode "cooldown" berlalu untuk menentukan apakah akan menskalakan cluster, dan jika ya, besarnya pembaruan.

  1. Nilai metrik resource tertunda YARN (Pending Memory atau Pending Cores) menentukan apakah akan menskalakan ke atas atau ke bawah. Nilai yang lebih besar dari 0 menunjukkan bahwa tugas YARN sedang menunggu resource dan penskalaan mungkin diperlukan. Nilai 0 menunjukkan YARN memiliki resource yang memadai sehingga penskalaan ke bawah atau perubahan lainnya mungkin tidak diperlukan.

    Jika resource yang tertunda > 0:

    $estimated\_worker\_count =$

    \[ \Biggl \lceil AVERAGE\ during\ cooldown\ period\Big(\frac{Pending + Available + Allocated + Reserved}{Resource\ per\ worker}\Big)\Biggr \rceil \]

    Jika resource yang tertunda adalah 0:

    $estimated\_worker\_count =$

    \[ \Biggl \lceil AVERAGE\ during\ cooldown\ period\Big(\frac{Allocated + Reserved}{Resource\ per\ worker}\Big)\Biggr \rceil \]

    Secara default, autoscaler memantau resource memori YARN. Jika Anda mengaktifkan penskalaan otomatis berbasis core, memori YARN dan core YARN akan dipantau: estimated_worker_count dievaluasi secara terpisah untuk memori dan core, dan jumlah pekerja yang lebih besar yang dihasilkan akan dipilih.

    $estimated\_worker\_count =$

    \[ max(estimated\_worker\_count\_by\_memory,\ estimated\_worker\_count\_by\_cores) \]

    \[ estimated\ \Delta worker = estimated\_worker\_count - current\_worker\_count \]

  2. Dengan estimasi perubahan yang diperlukan pada jumlah pekerja, penskalaan otomatis menggunakan scaleUpFactor atau scaleDownFactor untuk menghitung perubahan sebenarnya pada jumlah pekerja:

    if estimated Δworkers > 0:
      actual Δworkers = ROUND_UP(estimated Δworkers * scaleUpFactor)
      # examples:
      # ROUND_UP(estimated Δworkers=5 * scaleUpFactor=0.5) = 3
      # ROUND_UP(estimated Δworkers=0.8 * scaleUpFactor=0.5) = 1
    else:
      actual Δworkers = ROUND_DOWN(estimated Δworkers * scaleDownFactor)
      # examples:
      # ROUND_DOWN(estimated Δworkers=-5 * scaleDownFactor=0.5) = -2
      # ROUND_DOWN(estimated Δworkers=-0.8 * scaleDownFactor=0.5) = 0
      # ROUND_DOWN(estimated Δworkers=-1.5 * scaleDownFactor=0.5) = 0
    
    scaleUpFactor atau scaleDownFactor sebesar 1,0 berarti penskalaan otomatis akan diskalakan sehingga resource yang tertunda/tersedia adalah 0 (pemanfaatan sempurna).

  3. Setelah perubahan pada jumlah pekerja dihitung, scaleUpMinWorkerFraction dan scaleDownMinWorkerFraction akan bertindak sebagai nilai minimum untuk menentukan apakah penskalaan otomatis akan menskalakan cluster. Bagian kecil menunjukkan bahwa penskalaan otomatis harus diskalakan meskipun Δworkers kecil. Fraksi yang lebih besar berarti penskalaan hanya boleh terjadi saat Δworkers besar.

    IF (Δworkers >  scaleUpMinWorkerFraction * current_worker_count) then scale up
    
    ATAU
    IF (abs(Δworkers) >  scaleDownMinWorkerFraction * current_worker_count),
    THEN scale down.
    

  4. Jika jumlah pekerja yang akan diskalakan cukup besar untuk memicu penskalaan, penskalaan otomatis akan menggunakan batas minInstances maxInstances dari workerConfig dan secondaryWorkerConfig serta weight (rasio pekerja primer terhadap pekerja sekunder) untuk menentukan cara membagi jumlah pekerja di seluruh grup instance pekerja primer dan sekunder. Hasil penghitungan ini adalah perubahan autoscaling akhir ke cluster untuk periode penskalaan.

  5. Permintaan penskalaan otomatis akan dibatalkan di cluster yang dibuat dengan versi image setelah 2.0.57 dan 2.1.5 jika:

    1. penskalaan ke bawah sedang berlangsung dengan nilai waktu tunggu penghentian tuntas bukan nol, dan
    2. jumlah pekerja YARN AKTIF ("pekerja aktif") ditambah perubahan jumlah total pekerja yang direkomendasikan oleh autoscaler (Δworkers) sama dengan atau lebih besar dari DECOMMISSIONING pekerja YARN ("pekerja yang dinonaktifkan"), seperti yang ditunjukkan dalam formula berikut:

      IF (active workers + Δworkers ≥ active workers + decommissioning workers)
      THEN cancel the scaledown operation
      

    Untuk contoh pembatalan penurunan skala, lihat Kapan penskalaan otomatis membatalkan operasi penurunan skala?.

Rekomendasi konfigurasi penskalaan otomatis

Menghindari penskalaan pekerja primer

Pekerja utama menjalankan Datanode HDFS, sedangkan pekerja sekunder hanya untuk komputasi. Penggunaan pekerja sekunder memungkinkan Anda menskalakan resource komputasi secara efisien tanpa perlu menyediakan penyimpanan, sehingga menghasilkan kemampuan penskalaan yang lebih cepat. Namenode HDFS dapat memiliki beberapa kondisi perlombaan yang menyebabkan HDFS menjadi rusak sehingga penghentian layanan macet selamanya. Untuk menghindari masalah ini, hindari penskalaan pekerja utama. Contoh: workerConfig: minInstances: 10 maxInstances: 10 secondaryWorkerConfig: minInstances: 0 maxInstances: 100

Ada beberapa modifikasi yang perlu dilakukan pada perintah pembuatan cluster:

  1. Tetapkan --num-workers=10 agar cocok dengan ukuran grup pekerja utama kebijakan penskalaan otomatis.
  2. Tetapkan --secondary-worker-type=non-preemptible untuk mengonfigurasi pekerja sekunder agar tidak dapat di-preempt. (Kecuali jika preemptible VM diinginkan).
  3. Menyalin konfigurasi hardware dari pekerja utama ke pekerja sekunder. Misalnya, tetapkan --secondary-worker-boot-disk-size=1000GB agar cocok dengan --worker-boot-disk-size=1000GB.

Menggunakan Mode Fleksibilitas yang Ditingkatkan untuk tugas batch Spark

Gunakan Mode Fleksibilitas yang Ditingkatkan (EFM) dengan penskalaan otomatis untuk:

memungkinkan penurunan skala cluster yang lebih cepat saat tugas berjalan

mencegah gangguan pada tugas yang sedang berjalan karena penyempitan skala cluster

meminimalkan gangguan pada tugas yang sedang berjalan karena preemptif pekerja sekunder yang dapat di-preempt

Dengan EFM diaktifkan, waktu tunggu penghentian tuntas kebijakan penskalaan otomatis harus ditetapkan ke 0s. Kebijakan penskalaan otomatis hanya boleh menskalakan otomatis pekerja sekunder.

Memilih waktu tunggu penghentian tuntas

Penskalaan otomatis mendukung penghentian normal YARN saat menghapus node dari cluster. Penghentian operasi yang halus memungkinkan aplikasi menyelesaikan pengacakan data antar-tahap untuk menghindari penentuan ulang progres tugas. ⁠Waktu tunggu penghentian layanan yang wajar yang diberikan dalam kebijakan penskalaan otomatis adalah batas atas durasi yang akan ditunggu YARN untuk menjalankan aplikasi (aplikasi yang berjalan saat penghentian layanan dimulai) sebelum menghapus node.

Jika proses tidak selesai dalam periode waktu tunggu penghentian operasi yang ditentukan, node pekerja akan dimatikan secara paksa, yang berpotensi menyebabkan hilangnya data atau gangguan layanan. Untuk membantu menghindari kemungkinan ini, tetapkan waktu tunggu penghentian tuntas ke nilai yang lebih lama dari tugas terlama yang akan diproses cluster. Misalnya, jika Anda mengharapkan tugas terpanjang berjalan selama satu jam, tetapkan waktu tunggu setidaknya satu jam (1h).

Pertimbangkan untuk memigrasikan tugas yang memerlukan waktu lebih dari 1 jam ke cluster sementaranya sendiri untuk menghindari pemblokiran penghentian layanan yang halus.

Setelan scaleUpFactor

scaleUpFactor mengontrol seberapa agresif autoscaler meningkatkan skala cluster. Tentukan angka antara 0.0 dan 1.0 untuk menetapkan nilai pecahan resource YARN yang tertunda yang menyebabkan penambahan node.

Misalnya, jika ada 100 penampung tertunda yang masing-masing meminta 512 MB, maka ada memori YARN tertunda sebesar 50 GB. Jika scaleUpFactor adalah 0.5, autoscaler akan menambahkan node yang cukup untuk menambahkan memori YARN sebesar 25 GB. Demikian pula, jika nilainya 0.1, autoscaler akan menambahkan node yang cukup untuk 5 GB. Perhatikan bahwa nilai ini sesuai dengan memori YARN, bukan total memori yang tersedia secara fisik di VM.

Titik awal yang baik adalah 0.05 untuk tugas MapReduce dan tugas Spark dengan alokasi dinamis yang diaktifkan. Untuk tugas Spark dengan jumlah eksekutor tetap dan tugas Tez, gunakan 1.0. scaleUpFactor 1.0 berarti penskalaan otomatis akan diskalakan sehingga resource yang tertunda/tersedia adalah 0 (penggunaan sempurna).

Setelan scaleDownFactor

scaleDownFactor mengontrol seberapa agresif autoscaler menurunkan skala cluster. Tentukan angka antara 0.0 dan 1.0 untuk menetapkan nilai pecahan resource yang tersedia YARN yang menyebabkan penghapusan node.

Tetapkan nilai ini ke 1.0 untuk sebagian besar cluster multi-tugas yang perlu sering ditingkatkan dan diturunkan skalanya. Sebagai akibat dari penghentian tuntas, operasi penskalaan ke bawah jauh lebih lambat daripada operasi penskalaan ke atas. Menetapkan scaleDownFactor=1.0 akan menetapkan tingkat penurunan skala yang agresif, yang meminimalkan jumlah operasi penurunan skala yang diperlukan untuk mencapai ukuran cluster yang sesuai.

Untuk cluster yang memerlukan stabilitas lebih tinggi, tetapkan scaleDownFactor yang lebih rendah untuk rasio penskalaan yang lebih lambat.

Tetapkan nilai ini ke 0.0 untuk mencegah penurunan skala cluster, misalnya, saat menggunakan cluster tugas tunggal atau sementara.

Menetapkan scaleUpMinWorkerFraction dan scaleDownMinWorkerFraction

scaleUpMinWorkerFraction dan scaleDownMinWorkerFraction digunakan dengan scaleUpFactor atau scaleDownFactor dan memiliki nilai default 0.0. Nilai ini mewakili nilai minimum saat autoscaler akan menaikkan atau menurunkan skala cluster: peningkatan nilai pecahan minimum atau penurunan ukuran cluster yang diperlukan untuk mengeluarkan permintaan penskalaan ke atas atau ke bawah.

Contoh: Autoscaler tidak akan mengeluarkan permintaan pembaruan untuk menambahkan 5 pekerja ke cluster 100 node kecuali jika scaleUpMinWorkerFraction kurang dari atau sama dengan 0.05 (5%). Jika ditetapkan ke 0.1, autoscaler tidak akan mengeluarkan permintaan untuk menskalakan cluster. Demikian pula, jika scaleDownMinWorkerFraction adalah 0.05, autoscaler tidak akan mengeluarkan permintaan update untuk menghapus node dari cluster 100 node kecuali jika setidaknya 5 node akan dihapus.

Nilai default 0.0 menunjukkan tidak ada nilai minimum.

Sebaiknya tetapkan scaleDownMinWorkerFractionthresholds yang lebih tinggi di cluster besar (> 100 node) untuk menghindari operasi penskalaan kecil yang tidak perlu.

Memilih periode tunggu

cooldownPeriod menetapkan jangka waktu selama autoscaler tidak akan mengeluarkan permintaan untuk mengubah ukuran cluster. Anda dapat menggunakannya untuk membatasi frekuensi perubahan autoscaler pada ukuran cluster.

cooldownPeriod minimum dan default adalah dua menit. Jika cooldownPeriod yang lebih singkat ditetapkan dalam kebijakan, perubahan beban kerja akan lebih cepat memengaruhi ukuran cluster, tetapi cluster mungkin tidak perlu diskalakan ke atas dan ke bawah. Praktik yang direkomendasikan adalah menetapkan scaleUpMinWorkerFraction dan scaleDownMinWorkerFraction kebijakan ke nilai non-nol saat menggunakan cooldownPeriod yang lebih pendek. Hal ini memastikan bahwa cluster hanya diskalakan ke atas atau ke bawah jika perubahan dalam penggunaan resource cukup untuk menjamin update cluster.

Jika workload Anda sensitif terhadap perubahan ukuran cluster, Anda dapat meningkatkan periode tunggu. Misalnya, jika menjalankan tugas pemrosesan batch, Anda dapat menetapkan periode tunggu menjadi 10 menit atau lebih. Bereksperimenlah dengan periode waktu tunggu yang berbeda untuk menemukan nilai yang paling sesuai untuk workload Anda.

Batas jumlah pekerja dan bobot grup

Setiap grup pekerja memiliki minInstances dan maxInstances yang mengonfigurasi batas keras pada ukuran setiap grup.

Setiap grup juga memiliki parameter yang disebut weight yang mengonfigurasi target keseimbangan antara kedua grup. Perhatikan bahwa parameter ini hanya merupakan petunjuk, dan jika grup mencapai ukuran minimum atau maksimum, node hanya akan ditambahkan atau dihapus dari grup lain. Jadi, weight hampir selalu dapat dibiarkan pada 1 default.

Mengaktifkan penskalaan otomatis berbasis core

Secara default, YARN menggunakan metrik memori untuk alokasi resource. Untuk aplikasi yang intensif menggunakan CPU, praktik terbaiknya adalah mengonfigurasi YARN untuk menggunakan Dominant Resource Calculator. Untuk melakukannya, tetapkan properti berikut saat Anda membuat cluster:

capacity-scheduler:yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator

Metrik dan log penskalaan otomatis

Referensi dan alat berikut dapat membantu Anda memantau operasi penskalaan otomatis dan pengaruhnya terhadap cluster dan tugasnya.

Cloud Monitoring

Gunakan Cloud Monitoring untuk:

  • melihat metrik yang digunakan oleh penskalaan otomatis
  • melihat jumlah Pengelola Node di cluster Anda
  • memahami alasan penskalaan otomatis menskalakan atau tidak menskalakan cluster Anda autoscaling-stackdriver1 autoscaling-stackdriver2 autoscaling-stackdriver3

Cloud Logging

Gunakan Cloud Logging untuk melihat log dari Cloud Dataproc Autoscaler.

1) Temukan log untuk cluster Anda.

autoscaling-logs-for-cluster

2) Pilih dataproc.googleapis.com/autoscaler.

autoscaling-log-file

3) Luaskan pesan log untuk melihat kolom status. Log dalam JSON, yaitu format yang dapat dibaca mesin.

autoscaling-three-logs autoscaling-update-operation

4) Luaskan pesan log untuk melihat rekomendasi penskalaan, metrik yang digunakan untuk keputusan penskalaan, ukuran cluster asli, dan ukuran cluster target baru.

autoscaling-recommendation-message

Latar belakang: Penskalaan otomatis dengan Apache Hadoop dan Apache Spark

Bagian berikut membahas cara penskalaan otomatis (atau tidak) berinteraksi dengan Hadoop YARN dan Hadoop Mapreduce, serta dengan Apache Spark, Spark Streaming, dan Spark Structured Streaming.

Metrik YARN Hadoop

Penskalaan otomatis berfokus pada metrik Hadoop YARN berikut:

  1. Allocated resource mengacu pada total resource YARN yang digunakan oleh penampung yang berjalan di seluruh cluster. Jika ada 6 penampung yang berjalan yang dapat menggunakan hingga 1 unit resource, ada 6 resource yang dialokasikan.

  2. Available resource adalah resource YARN di cluster yang tidak digunakan oleh penampung yang dialokasikan. Jika ada 10 unit resource di semua pengelola node dan 6 unit di antaranya dialokasikan, akan ada 4 resource yang tersedia. Jika ada resource yang tersedia (tidak digunakan) di cluster, penskalaan otomatis dapat menghapus pekerja dari cluster.

  3. Pending resource adalah jumlah permintaan resource YARN untuk penampung yang tertunda. Penampung tertunda menunggu ruang untuk dijalankan di YARN. Resource yang tertunda tidak nol hanya jika resource yang tersedia nol atau terlalu kecil untuk dialokasikan ke penampung berikutnya. Jika ada penampung yang tertunda, penskalaan otomatis dapat menambahkan pekerja ke cluster.

Anda dapat melihat metrik ini di Cloud Monitoring. Secara default, memori YARN akan menjadi 0,8 * total memori di cluster, dengan memori yang tersisa dicadangkan untuk daemon dan penggunaan sistem operasi lainnya, seperti cache halaman. Anda dapat mengganti nilai default dengan setelan konfigurasi YARN "yarn.nodemanager.resource.memory-mb" (lihat Apache Hadoop YARN, HDFS, Spark, dan properti terkait).

Penskalaan otomatis dan MapReduce Hadoop

MapReduce menjalankan setiap tugas pemetaan dan pengurangan sebagai penampung YARN terpisah. Saat tugas dimulai, MapReduce mengirimkan permintaan penampung untuk setiap tugas peta, sehingga menyebabkan lonjakan besar pada memori YARN yang tertunda. Saat tugas peta selesai, memori yang tertunda akan berkurang.

Saat mapreduce.job.reduce.slowstart.completedmaps selesai (95% secara default di Dataproc), MapReduce mengantrekan permintaan penampung untuk semua pengurang, sehingga menyebabkan lonjakan lain dalam memori yang tertunda.

Kecuali jika tugas pemetaan dan pengurangan Anda memerlukan waktu beberapa menit atau lebih, jangan menetapkan nilai tinggi untuk penskalaan otomatis scaleUpFactor. Menambahkan pekerja ke cluster memerlukan waktu minimal 1,5 menit, jadi pastikan ada pekerjaan tertunda yang memadai untuk menggunakan pekerja baru selama beberapa menit. Titik awal yang baik adalah menetapkan scaleUpFactor ke 0,05 (5%) atau 0,1 (10%) memori yang tertunda.

Penskalaan Otomatis dan Spark

Spark menambahkan lapisan penjadwalan tambahan di atas YARN. Secara khusus, alokasi dinamis Spark Core membuat permintaan ke YARN agar penampung menjalankan eksekutor Spark, lalu menjadwalkan tugas Spark pada thread di eksekutor tersebut. Cluster Dataproc mengaktifkan alokasi dinamis secara default, sehingga eksekutor ditambahkan dan dihapus sesuai kebutuhan.

Spark selalu meminta container ke YARN, tetapi tanpa alokasi dinamis, Spark hanya meminta container di awal tugas. Dengan alokasi dinamis, penampung akan dihapus, atau meminta penampung baru, sesuai kebutuhan.

Spark dimulai dari sejumlah kecil eksekutor – 2 di cluster penskalaan otomatis – dan terus melipatgandakan jumlah eksekutor saat ada tugas yang tertunda. Hal ini akan memperlancar memori yang tertunda (lebih sedikit lonjakan memori yang tertunda). Sebaiknya tetapkan scaleUpFactor penskalaan otomatis ke angka besar, seperti 1,0 (100%), untuk tugas Spark.

Menonaktifkan alokasi dinamis Spark

Jika menjalankan tugas Spark terpisah yang tidak mendapatkan manfaat dari alokasi dinamis Spark, Anda dapat menonaktifkan alokasi dinamis Spark dengan menetapkan spark.dynamicAllocation.enabled=false dan menetapkan spark.executor.instances. Anda tetap dapat menggunakan penskalaan otomatis untuk menskalakan cluster naik dan turun saat tugas Spark terpisah berjalan.

Tugas Spark dengan data yang di-cache

Tetapkan spark.dynamicAllocation.cachedExecutorIdleTimeout atau hapus cache set data jika tidak diperlukan lagi. Secara default, Spark tidak menghapus eksekutor yang telah menyimpan data dalam cache, yang akan mencegah penskalaan cluster ke bawah.

Penskalaan Otomatis dan Spark Streaming

  1. Karena Spark Streaming memiliki versi alokasi dinamis nya sendiri yang menggunakan sinyal khusus streaming untuk menambahkan dan menghapus eksekutor, tetapkan spark.streaming.dynamicAllocation.enabled=true dan nonaktifkan alokasi dinamis Spark Core dengan menetapkan spark.dynamicAllocation.enabled=false.

  2. Jangan gunakan Penghentian tuntas (penskalaan otomatis gracefulDecommissionTimeout) dengan tugas Spark Streaming. Sebagai gantinya, untuk menghapus pekerja dengan penskalaan otomatis secara aman, konfigurasi checkpointing untuk toleransi error.

Atau, untuk menggunakan Spark Streaming tanpa penskalaan otomatis:

  1. Nonaktifkan alokasi dinamis Spark Core (spark.dynamicAllocation.enabled=false), dan
  2. Tetapkan jumlah eksekutor (spark.executor.instances) untuk tugas Anda. Lihat Properti cluster.

Penskalaan Otomatis dan Streaming Terstruktur Spark

Penskalaan otomatis tidak kompatibel dengan Spark Structured Streaming karena Spark Structured Streaming saat ini tidak mendukung alokasi dinamis (lihat SPARK-24815: Structured Streaming harus mendukung alokasi dinamis).

Mengontrol penskalaan otomatis melalui partisi dan paralelisme

Meskipun paralelisme biasanya ditetapkan atau ditentukan oleh resource cluster (misalnya, jumlah blok HDFS dikontrol oleh jumlah tugas), dengan penskalaan otomatis, hal sebaliknya berlaku: penskalaan otomatis menetapkan jumlah pekerja sesuai dengan paralelisme tugas. Berikut adalah panduan untuk membantu Anda menetapkan paralelisme tugas:

  • Meskipun Dataproc menetapkan jumlah default tugas pengurangan MapReduce berdasarkan ukuran cluster awal cluster Anda, Anda dapat menetapkan mapreduce.job.reduces untuk meningkatkan paralelisme fase pengurangan.
  • Paralelisme Spark SQL dan Dataframe ditentukan oleh spark.sql.shuffle.partitions, yang secara default ditetapkan ke 200.
  • Fungsi RDD Spark secara default ditetapkan ke spark.default.parallelism, yang ditetapkan ke jumlah core pada node pekerja saat tugas dimulai. Namun, semua fungsi RDD yang membuat shuffle menggunakan parameter untuk jumlah partisi, yang menggantikan spark.default.parallelism.

Anda harus memastikan data Anda dipartisi secara merata. Jika ada penyimpangan kunci yang signifikan, satu atau beberapa tugas mungkin memerlukan waktu yang jauh lebih lama daripada tugas lainnya, sehingga penggunaannya rendah.

Setelan properti Spark/Hadoop default penskalaan otomatis

Cluster penskalaan otomatis memiliki nilai properti cluster default yang membantu menghindari kegagalan tugas saat pekerja utama dihapus atau pekerja sekunder didahulukan. Anda dapat mengganti nilai default ini saat membuat cluster dengan penskalaan otomatis (lihat Properti Cluster).

Default untuk meningkatkan jumlah maksimum percobaan ulang untuk tugas, master aplikasi, dan tahap:

yarn:yarn.resourcemanager.am.max-attempts=10
mapred:mapreduce.map.maxattempts=10
mapred:mapreduce.reduce.maxattempts=10
spark:spark.task.maxFailures=10
spark:spark.stage.maxConsecutiveAttempts=10

Default untuk mereset penghitung percobaan ulang (berguna untuk tugas Spark Streaming yang berjalan lama):

spark:spark.yarn.am.attemptFailuresValidityInterval=1h
spark:spark.yarn.executor.failuresValidityInterval=1h

Default untuk membuat mekanisme alokasi dinamis Spark dengan awal lambat dimulai dari ukuran kecil:

spark:spark.executor.instances=2

Pertanyaan Umum (FAQ)

Dapatkah penskalaan otomatis diaktifkan di cluster Ketersediaan Tinggi dan cluster Node Tunggal?

Penskalaan otomatis dapat diaktifkan di cluster Ketersediaan Tinggi, tetapi tidak di cluster Node Tunggal (cluster Node Tunggal tidak mendukung pengubahan ukuran).

Dapatkah Anda mengubah ukuran cluster penskalaan otomatis secara manual?

Ya. Anda dapat memutuskan untuk mengubah ukuran cluster secara manual sebagai tindakan sementara saat menyesuaikan kebijakan penskalaan otomatis. Namun, perubahan ini hanya akan memiliki efek sementara, dan Penskalaan Otomatis pada akhirnya akan menskalakan kembali cluster.

Daripada mengubah ukuran cluster penskalaan otomatis secara manual, pertimbangkan:

Memperbarui kebijakan penskalaan otomatis. Setiap perubahan yang dilakukan pada kebijakan penskalaan otomatis akan memengaruhi semua cluster yang saat ini menggunakan kebijakan tersebut (lihat Penggunaan kebijakan multi-cluster).

Melepas kebijakan dan menskalakan cluster secara manual ke ukuran yang diinginkan.

Mendapatkan dukungan Dataproc.

Apa perbedaan antara Dataproc dan penskalaan otomatis Dataflow?

Lihat Penskalaan otomatis horizontal Dataflow dan Penskalaan otomatis vertikal Dataflow Prime.

Dapatkah tim developer Dataproc mereset status cluster dari ERROR kembali ke RUNNING?

Secara umum, tidak. Tindakan ini memerlukan upaya manual untuk memverifikasi apakah aman untuk mereset status cluster, dan sering kali cluster tidak dapat direset tanpa langkah manual lainnya, seperti memulai ulang Namenode HDFS.

Dataproc menetapkan status cluster ke ERROR jika tidak dapat menentukan status cluster setelah operasi gagal. Cluster di ERROR tidak diskalakan secara otomatis atau tidak menjalankan tugas. Penyebab umum meliputi:

  1. Error yang ditampilkan dari Compute Engine API, sering kali selama pemadaman layanan Compute Engine.

  2. HDFS mengalami kerusakan karena bug dalam penghentian HDFS.

  3. Error Dataproc Control API seperti "Lease tugas berakhir"

Hapus dan buat ulang cluster yang statusnya ERROR.

Kapan penskalaan otomatis membatalkan operasi penskalaan turun?

Grafik berikut adalah ilustrasi yang menunjukkan kapan penskalaan otomatis akan membatalkan operasi penskalaan ke bawah (lihat juga Cara kerja penskalaan otomatis).

dataproc-autoscaling-cancellation-example

Catatan:

  • Cluster telah mengaktifkan penskalaan otomatis berdasarkan metrik memori YARN saja (default).
  • T1-T9 mewakili interval waktu tunggu saat autoscaler mengevaluasi jumlah pekerja (waktu peristiwa telah disederhanakan).
  • Batang bertumpuk mewakili jumlah pekerja YARN cluster yang aktif, dinonaktifkan, dan dinonaktifkan.
  • Jumlah pekerja yang direkomendasikan autoscaler (garis hitam) didasarkan pada metrik memori YARN, jumlah pekerja aktif YARN, dan setelan kebijakan penskalaan otomatis (lihat Cara kerja penskalaan otomatis).
  • Area latar belakang merah menunjukkan periode saat operasi penskalaan turun berjalan.
  • Area latar belakang kuning menunjukkan periode saat operasi penskalaan ke bawah dibatalkan.
  • Area latar belakang hijau menunjukkan periode operasi penskalaan.

Operasi berikut terjadi pada waktu berikut:

  • T1: Autoscaler memulai operasi penurunan skala penghentian layanan yang wajar untuk menskalakan turun sekitar setengah dari pekerja cluster saat ini.

  • T2: Autoscaler terus memantau metrik cluster. Hal ini tidak mengubah rekomendasi penskalaan, dan operasi penskalaan akan berlanjut. Beberapa pekerja telah dinonaktifkan, dan pekerja lainnya sedang dinonaktifkan (Dataproc akan menghapus pekerja yang dinonaktifkan).

  • T3: Autoscaler menghitung bahwa jumlah pekerja dapat diskalakan lebih lanjut, mungkin karena memori YARN tambahan tersedia. Namun, karena jumlah pekerja aktif ditambah perubahan jumlah pekerja yang direkomendasikan tidak sama dengan atau lebih besar dari jumlah pekerja aktif ditambah pekerja yang dinonaktifkan, kriteria untuk pembatalan penskalaan menurun tidak terpenuhi, dan autoscaler tidak membatalkan operasi penskalaan menurun.

  • T4: YARN melaporkan peningkatan memori tertunda. Namun, autoscaler tidak mengubah rekomendasi jumlah pekerjanya. Seperti pada T3, kriteria pembatalan penskalaan turun tetap tidak terpenuhi, dan autoscaler tidak membatalkan operasi penskalaan turun.

  • T5: Memori tertunda YARN meningkat, dan perubahan jumlah pekerja yang direkomendasikan oleh autoscaler meningkat. Namun, karena jumlah pekerja aktif ditambah perubahan yang direkomendasikan dalam jumlah pekerja kurang dari jumlah pekerja aktif ditambah pekerja yang dinonaktifkan, kriteria pembatalan tetap tidak terpenuhi, dan operasi penskalaan turun tidak dibatalkan.

  • T6: Memori tertunda YARN meningkat lebih lanjut. Jumlah pekerja aktif ditambah perubahan jumlah pekerja yang direkomendasikan oleh autoscaler kini lebih besar dari jumlah pekerja aktif ditambah pekerja yang dinonaktifkan. Kriteria pembatalan terpenuhi, dan autoscaler membatalkan operasi penskalaan ke bawah.

  • T7: Autoscaler menunggu pembatalan operasi penskalaan ke bawah selesai. Autoscaler tidak mengevaluasi dan merekomendasikan perubahan jumlah pekerja selama interval ini.

  • T8: Pembatalan operasi penskalaan ke bawah selesai. Pekerja yang dinonaktifkan ditambahkan ke cluster dan menjadi aktif. Autoscaler mendeteksi penyelesaian pembatalan operasi penskalaan, dan menunggu periode evaluasi berikutnya (T9) untuk menghitung jumlah pekerja yang direkomendasikan.

  • T9: Tidak ada operasi aktif pada waktu T9. Berdasarkan kebijakan autoscaler dan metrik YARN, autoscaler merekomendasikan operasi penskalaan.