Menyesuaikan Penskalaan Otomatis Horizontal untuk pipeline streaming

Dalam pipeline streaming dengan volume data input yang tinggi, biasanya ada kompromi antara biaya dan latensi. Untuk mempertahankan latensi rendah, Dataflow harus menambahkan pekerja seiring meningkatnya volume traffic. Faktor lainnya adalah seberapa cepat pipeline harus diskalakan ke atas atau ke bawah sebagai respons terhadap perubahan kecepatan data input.

Autoscaler Dataflow memiliki setelan default yang cocok untuk banyak workload. Namun, Anda mungkin ingin menyesuaikan perilaku ini untuk skenario tertentu. Misalnya, latensi rata-rata yang lebih tinggi mungkin dapat diterima untuk mengurangi biaya, atau Anda mungkin ingin Dataflow diskalakan lebih cepat sebagai respons terhadap lonjakan traffic.

Untuk mengoptimalkan Penskalaan Otomatis Horizontal, Anda dapat menyesuaikan parameter berikut:

Menetapkan rentang penskalaan otomatis

Saat membuat tugas streaming baru, Anda dapat menetapkan jumlah pekerja awal dan jumlah pekerja maksimum. Untuk melakukannya, tentukan opsi pipeline berikut:

Java

  • --numWorkers: jumlah awal pekerja yang tersedia saat pipeline mulai berjalan
  • --maxNumWorkers: jumlah maksimum pekerja yang tersedia untuk pipeline Anda

Python

  • --num_workers: jumlah awal pekerja yang tersedia saat pipeline mulai berjalan
  • --max_num_workers: jumlah maksimum pekerja yang tersedia untuk pipeline Anda

Go

  • --num_workers: jumlah awal pekerja yang tersedia saat pipeline mulai berjalan
  • --max_num_workers: jumlah maksimum pekerja yang tersedia untuk pipeline Anda

Untuk tugas streaming yang menggunakan Streaming Engine, flag --maxNumWorkers bersifat opsional. Defaultnya adalah 100. Untuk tugas streaming yang tidak menggunakan Streaming Engine, --maxNumWorkers diperlukan saat Penskalaan Otomatis Horizontal diaktifkan.

Nilai awal --maxNumWorkers juga menentukan jumlah Persistent Disk yang dialokasikan untuk tugas. Pipeline di-deploy dengan kumpulan Persistent Disk tetap, yang jumlahnya sama dengan --maxNumWorkers. Selama streaming, Persistent Disk didistribusikan ulang sehingga setiap pekerja mendapatkan jumlah disk yang terpasang sama.

Jika Anda menetapkan --maxNumWorkers, pastikan nilai tersebut menyediakan disk yang cukup untuk pipeline Anda. Pertimbangkan pertumbuhan di masa mendatang saat menetapkan nilai awal. Untuk mengetahui informasi tentang performa Persistent Disk, lihat Mengonfigurasi Persistent Disk dan VM. Dataflow menagih penggunaan Persistent Disk dan memiliki kuota Compute Engine, termasuk kuota Persistent Disk.

Secara default, jumlah pekerja minimum adalah 1 untuk tugas streaming yang menggunakan Streaming Engine, dan (maxNumWorkers/15), dibulatkan ke atas, untuk tugas yang tidak menggunakan Streaming Engine.

Memperbarui rentang penskalaan otomatis

Untuk tugas yang menggunakan Streaming Engine, Anda dapat menyesuaikan jumlah pekerja minimum dan maksimum, tanpa menghentikan atau mengganti tugas. Untuk menyesuaikan nilai ini, gunakan update tugas yang sedang berlangsung. Perbarui opsi tugas berikut:

  • --min-num-workers: jumlah pekerja minimum.
  • --max-num-workers: jumlah pekerja maksimum.

gcloud

Gunakan perintah gcloud dataflow jobs update-options:

gcloud dataflow jobs update-options \
  --region=REGION \
  --min-num-workers=MINIMUM_WORKERS \
  --max-num-workers=MAXIMUM_WORKERS \
  JOB_ID

Ganti kode berikut:

  • REGION: ID region endpoint regional tugas
  • MINIMUM_WORKERS: jumlah minimum instance Compute Engine
  • MAXIMUM_WORKERS: jumlah maksimum instance Compute Engine
  • JOB_ID: ID tugas yang akan diupdate

Anda juga dapat memperbarui --min-num-workers dan --max-num-workers satu per satu.

REST

Gunakan projects.locations.jobs.update metode:

PUT https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID?updateMask=runtime_updatable_params.max_num_workers,runtime_updatable_params.min_num_workers
{
  "runtime_updatable_params": {
    "min_num_workers": MINIMUM_WORKERS,
    "max_num_workers": MAXIMUM_WORKERS
  }
}

Ganti kode berikut:

  • PROJECT_ID: project ID Google Cloud dari tugas Dataflow
  • REGION: ID region endpoint regional tugas
  • JOB_ID: ID tugas yang akan diupdate
  • MINIMUM_WORKERS: jumlah minimum instance Compute Engine
  • MAXIMUM_WORKERS: jumlah maksimum instance Compute Engine

Anda juga dapat memperbarui min_num_workers dan max_num_workers satu per satu. Tentukan parameter yang akan diperbarui dalam parameter kueri updateMask, dan sertakan nilai yang diperbarui di kolom runtimeUpdatableParams dalam isi permintaan. Contoh berikut memperbarui min_num_workers:

PUT https://dataflow.googleapis.com/v1b3/projects/my_project/locations/us-central1/jobs/job1?updateMask=runtime_updatable_params.min_num_workers
{
  "runtime_updatable_params": {
    "min_num_workers": 5
  }
}

Untuk tugas yang tidak menggunakan Streaming Engine, Anda dapat mengganti tugas yang ada dengan nilai maxNumWorkers yang diperbarui.

Jika Anda memperbarui tugas streaming yang tidak menggunakan Streaming Engine, tugas yang diperbarui akan menonaktifkan Penskalaan Otomatis Horizontal secara default. Agar penskalaan otomatis tetap diaktifkan, tentukan --autoscalingAlgorithm dan --maxNumWorkers untuk tugas yang diperbarui.

Menetapkan petunjuk penggunaan pekerja

Dataflow menggunakan penggunaan CPU rata-rata sebagai sinyal untuk mengetahui kapan harus menerapkan Penskalaan Otomatis Horizontal. Secara default, Dataflow menetapkan target pemakaian CPU sebesar 0,8. Jika penggunaan berada di luar rentang ini, Dataflow dapat menambahkan atau menghapus pekerja.

Untuk memiliki lebih banyak kontrol atas perilaku penskalaan otomatis, Anda dapat menetapkan penggunaan CPU target ke nilai dalam rentang [0,1, 0,9].

  • Tetapkan nilai penggunaan CPU yang lebih rendah jika Anda ingin mencapai latensi puncak yang lebih rendah. Nilai yang lebih rendah memungkinkan Dataflow melakukan penskalaan keluar secara lebih agresif sebagai respons terhadap meningkatnya pemanfaatan pekerja, dan melakukan penskalaan turun secara lebih konservatif untuk meningkatkan stabilitas. Nilai yang lebih rendah juga memberikan lebih banyak headroom saat pipeline berjalan pada status stabil, yang umumnya menghasilkan latensi ekor yang lebih rendah. (Latensi ekor mengukur waktu tunggu terpanjang sebelum data baru diproses.)

  • Tetapkan nilai yang lebih tinggi jika Anda ingin menghemat resource dan menjaga biaya tetap lebih rendah saat traffic melonjak. Nilai yang lebih tinggi mencegah penskalaan yang berlebihan, dengan mengorbankan latensi yang lebih tinggi.

Untuk mengonfigurasi petunjuk penggunaan saat Anda menjalankan tugas non-template, tetapkan opsi layanan worker_utilization_hint. Untuk tugas template, perbarui petunjuk penggunaan, karena opsi layanan tidak didukung.

Contoh berikut menunjukkan cara menggunakan worker_utilization_hint:

Java

--dataflowServiceOptions=worker_utilization_hint=TARGET_UTILIZATION

Ganti TARGET_UTILIZATION dengan nilai dalam rentang [0,1, 0,9].

Python

--dataflow_service_options=worker_utilization_hint=TARGET_UTILIZATION

Ganti TARGET_UTILIZATION dengan nilai dalam rentang [0,1, 0,9].

Go

--dataflow_service_options=worker_utilization_hint=TARGET_UTILIZATION

Ganti TARGET_UTILIZATION dengan nilai dalam rentang [0,1, 0,9].

Untuk pipeline baru, sebaiknya Anda melakukan pengujian dengan beban yang realistis menggunakan setelan default. Kemudian, evaluasi perilaku penskalaan otomatis yang berlaku untuk pipeline Anda dan lakukan penyesuaian sesuai kebutuhan.

Petunjuk penggunaan hanyalah salah satu faktor yang digunakan Dataflow saat menentukan apakah akan menskalakan pekerja. Faktor lain seperti backlog dan kunci yang tersedia dapat mengganti nilai petunjuk. Selain itu, petunjuk ini bukan target yang ketat. Autoscaler mencoba mempertahankan penggunaan CPU dalam rentang nilai petunjuk, tetapi metrik penggunaan gabungan mungkin lebih tinggi atau lebih rendah. Untuk informasi selengkapnya, lihat Heuristik penskalaan otomatis streaming.

Memperbarui petunjuk penggunaan

Untuk memperbarui petunjuk penggunaan saat tugas berjalan, lakukan update dalam penerbangan sebagai berikut:

gcloud

Guakan perintah gcloud dataflow jobs update-options:

gcloud dataflow jobs update-options \
  --region=REGION \
  --worker-utilization-hint=TARGET_UTILIZATION \
  JOB_ID

Ganti kode berikut:

  • REGION: ID region endpoint regional tugas
  • JOB_ID: ID tugas yang akan diupdate
  • TARGET_UTILIZATION: nilai dalam rentang [0,1, 0,9]

Untuk mereset petunjuk penggunaan ke nilai default, gunakan perintah gcloud berikut:

gcloud dataflow jobs update-options \
  --unset-worker-utilization-hint \
  --region=REGION \
  --project=PROJECT_ID \
  JOB_ID

REST

Gunakan projects.locations.jobs.update metode:

PUT https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID?updateMask=runtime_updatable_params.worker_utilization_hint
{
  "runtime_updatable_params": {
    "worker_utilization_hint": TARGET_UTILIZATION
  }
}

Ganti kode berikut:

  • PROJECT_ID: project ID Google Cloud dari tugas Dataflow.
  • REGION: ID region endpoint regional tugas.
  • JOB_ID: ID tugas yang akan diperbarui.
  • TARGET_UTILIZATION: nilai dalam rentang [0,1, 0,9]

Heuristik penskalaan otomatis streaming

Untuk pipeline streaming, tujuan Penskalaan Otomatis Horizontal adalah meminimalkan backlog sekaligus memaksimalkan penggunaan dan throughput pekerja serta bereaksi dengan cepat terhadap lonjakan beban.

Dataflow mempertimbangkan beberapa faktor saat melakukan penskalaan otomatis, termasuk:

  • Backlog. Estimasi waktu antrean dihitung dari throughput dan byte antrean yang masih harus diproses dari sumber input. Pipeline dianggap memiliki antrean jika estimasi waktu antrean tetap di atas 15 detik.

  • Target pemakaian CPU. Target default untuk penggunaan CPU rata-rata adalah 0,8. Anda dapat mengganti nilai ini.

  • Kunci yang tersedia. Kunci adalah unit dasar paralelisme di Dataflow.

Dalam beberapa kasus, Dataflow menggunakan faktor berikut dalam keputusan penskalaan otomatis. Jika faktor ini digunakan untuk tugas Anda, Anda dapat melihat informasi tersebut di tab metrik Autoscaling.

  • Throttle berbasis kunci menggunakan jumlah kunci pemrosesan yang diterima oleh tugas untuk menghitung batas bagi pekerja pengguna, karena setiap kunci hanya dapat diproses oleh satu pekerja dalam satu waktu.

  • Penurunan skala. Jika Dataflow mendeteksi bahwa keputusan penskalaan otomatis yang tidak stabil telah terjadi, Dataflow akan memperlambat kecepatan penskalaan ke bawah untuk meningkatkan stabilitas.

  • Peningkatan resolusi berbasis CPU menggunakan penggunaan CPU yang tinggi sebagai kriteria peningkatan resolusi.

  • Untuk tugas streaming yang tidak menggunakan Streaming Engine, penskalaan mungkin dibatasi oleh jumlah Persistent Disk. Untuk informasi selengkapnya, lihat Menetapkan rentang penskalaan otomatis.

Penskalaan. Jika pipeline streaming tetap tertunda dengan paralelisme yang memadai pada pekerja selama beberapa menit, Dataflow akan ditingkatkan skalanya. Dataflow mencoba menghapus backlog dalam waktu kurang lebih 150 detik setelah penskalaan, dengan throughput saat ini per pekerja. Jika ada backlog, tetapi pekerja tidak memiliki paralelisme yang cukup untuk pekerja tambahan, pipeline tidak akan diskalakan. (Menskalakan jumlah pekerja di luar jumlah kunci yang tersedia untuk pemrosesan paralel tidak akan membantu memproses backlog lebih cepat.)

Penurunan skala Saat autoscaler membuat keputusan penurunan skala, backlog adalah faktor prioritas tertinggi. Autoscaler bertujuan untuk memiliki backlog tidak lebih dari 15 detik. Jika backlog turun di bawah 10 detik, dan penggunaan pekerja rata-rata di bawah target penggunaan CPU, Dataflow akan diskalakan. Selama backlog dapat diterima, autoscaler akan mencoba mempertahankan penggunaan CPU mendekati target penggunaan CPU. Namun, jika penggunaan sudah cukup dekat dengan target, autoscaler mungkin mempertahankan jumlah pekerja agar tidak berubah, karena setiap langkah penskalaan ke bawah memiliki biaya.

Streaming Engine juga menggunakan teknik penskalaan otomatis prediktif berdasarkan backlog timer. Data tanpa batas dalam pipeline streaming dibagi menjadi jendela yang dikelompokkan menurut stempel waktu. Di akhir periode, timer diaktifkan untuk setiap kunci yang diproses di periode tersebut. Pengaktifan timer menunjukkan bahwa periode kunci tertentu telah berakhir. Streaming Engine dapat mengukur backlog timer dan memprediksi jumlah timer yang akan diaktifkan di akhir periode. Dengan menggunakan backlog timer sebagai sinyal, Dataflow dapat memperkirakan jumlah pemrosesan yang harus terjadi saat timer mendatang diaktifkan. Berdasarkan estimasi beban mendatang, Dataflow akan menskalakan secara otomatis di awal untuk memenuhi permintaan yang diharapkan.

Metrik

Untuk menemukan batas penskalaan otomatis saat ini untuk tugas, buat kueri metrik berikut:

  • job/max_worker_instances_limit: Jumlah pekerja maksimum.
  • job/min_worker_instances_limit: Jumlah minimum pekerja.

Untuk mendapatkan informasi tentang pemanfaatan pekerja, buat kueri metrik berikut:

  • job/aggregated_worker_utilization: Penggunaan pekerja gabungan.
  • job/worker_utilization_hint: Petunjuk penggunaan pekerja saat ini.

Untuk mendapatkan insight tentang perilaku autoscaler, buat kueri metrik berikut:

  • job.worker_utilization_hint_is_actively_used: Menunjukkan apakah autoscaler secara aktif menggunakan petunjuk penggunaan pekerja. Jika faktor lain menggantikan petunjuk saat metrik ini diambil sampelnya, nilainya adalah false.
  • job/horizontal_worker_scaling: Menjelaskan keputusan yang diambil oleh autoscaler. Metrik ini berisi label berikut:
    • direction: Menentukan apakah autoscaler meningkatkan skala, menurunkan skala, atau tidak melakukan tindakan apa pun.
    • rationale: Menentukan alasan keputusan autoscaler.

Untuk informasi selengkapnya, lihat Metrik Cloud Monitoring. Metrik ini juga ditampilkan di diagram pemantauan penskalaan otomatis.

Langkah selanjutnya