Memecahkan masalah hambatan di Dataflow

Bottleneck terjadi saat satu langkah, tahap, atau pekerja memperlambat keseluruhan tugas. Bottleneck dapat menyebabkan pekerja tidak ada aktivitas dan meningkatkan latensi.

Jika Dataflow mendeteksi bottleneck, grafik tugas akan menampilkan pemberitahuan, dan panel Info Langkah akan mencantumkan jenis bottleneck dan penyebabnya, jika diketahui. Dataflow juga mengekspor informasi deteksi bottleneck ke metrik Stackdriver, yang menyajikan data sebagai deret waktu. Hal ini memungkinkan Anda melihat bottleneck dari waktu ke waktu atau di masa lalu.

Memahami bottleneck

Saat Dataflow menjalankan pipeline streaming, tugas terdiri dari serangkaian komponen, seperti streaming shuffle, thread pemrosesan fungsi yang ditentukan pengguna (DoFn), dan checkpointing status persisten. Untuk memfasilitasi aliran data, Dataflow menggunakan antrean untuk menghubungkan komponen ini. Data didorong dari hulu ke hilir.

Di banyak pipeline, kapasitas throughput keseluruhan dibatasi oleh satu komponen, sehingga membuat bottleneck di pipeline. Kecepatan data dapat berpindah melalui bottleneck membatasi seberapa cepat pipeline dapat menerima dan memproses data input.

Misalnya, pertimbangkan pipeline tempat pemrosesan DoFn terjadi di hilir streaming shuffle. Antrean di antara keduanya akan mem-buffer data yang diacak tetapi belum diproses. Jika pemrosesan DoFn tidak dapat menggunakan data secepat streaming shuffle menghasilkannya, antrean akan bertambah. Bottleneck yang berkepanjangan dapat menyebabkan antrean mencapai kapasitasnya. Pada saat itu, pengacakan lebih lanjut akan dijeda, dan backlog akan menyebar ke hulu. Antrean lebih lanjut di hulu juga mengakumulasi backlog, yang pada akhirnya menyebabkan perlambatan yang meluas ke sumber data, yang berarti seluruh pipeline tidak dapat mengimbangi input.

Saat bottleneck terjadi, sebagian besar pipeline mungkin tampak tidak responsif, meskipun satu titik dalam pipeline menyebabkan backlog. Perilaku ini dapat mempersulit proses debug bottleneck. Tujuan deteksi bottleneck adalah mengidentifikasi lokasi dan penyebab yang tepat, sehingga menghilangkan tebakan, agar Anda dapat memperbaiki penyebab utamanya.

Dataflow mendeteksi bottleneck saat penundaan melebihi nilai minimum lima menit. Jika penundaan tidak melebihi nilai minimum ini, Dataflow tidak akan mendeteksi bottleneck.

Deteksi bottleneck tidak selalu mengharuskan Anda bertindak dan bergantung pada kasus penggunaan Anda. Pipeline dapat beroperasi secara normal dengan penundaan sementara lebih dari lima menit. Jika hal ini dapat diterima untuk kasus penggunaan Anda, Anda mungkin tidak perlu mengatasi bottleneck yang ditunjukkan.

Jenis bottleneck

Saat Dataflow mendeteksi bottleneck, antarmuka pemantauan akan menunjukkan tingkat keparahan masalah. Bottleneck dikelompokkan ke dalam kategori berikut:

Pemrosesan macet dan tidak mengalami kemajuan
Progres pipeline sepenuhnya dihentikan pada langkah ini.
Pemrosesan sedang berlangsung, tetapi tertinggal.
Pipeline tidak dapat memproses data masuk secepat data tersebut tiba. Akibatnya, backlog bertambah.
Pemrosesan sedang berlangsung, tetapi backlog stabil
Pipeline mengalami kemajuan, dan kecepatan pemrosesan sebanding dengan kecepatan input. Pemrosesan cukup cepat sehingga backlog tidak bertambah, tetapi backlog yang terakumulasi juga tidak berkurang secara signifikan.
Pemrosesan sedang berlangsung dan mengejar backlog
Backlog berkurang, tetapi bottleneck saat ini mencegah pipeline mengejar lebih cepat. Jika Anda memulai pipeline dengan backlog, status ini mungkin normal dan tidak memerlukan intervensi apa pun. Pantau progres untuk melihat apakah backlog terus berkurang.

Penyebab bottleneck

Bagian ini mencantumkan penyebab bottleneck yang dapat dideteksi. Gunakan informasi ini untuk mengatasi masalah. Dalam beberapa kasus, mungkin ada beberapa penyebab, dan penyebab tersebut mungkin terkait. Misalnya, jika pekerja tidak memiliki cukup resource, penggunaan vCPU mungkin tinggi. Penggunaan vCPU yang tinggi dapat menyebabkan operasi melambat, yang pada gilirannya dapat menyebabkan penundaan antrean yang lebih tinggi. Analisis kemungkinan penyebab dapat menampilkan semua hal ini sebagai penyebab bottleneck.

Operasi dengan waktu pemrosesan yang lama

Beberapa operasi dalam komputasi ini memiliki waktu pemrosesan yang lama. Hal ini terjadi setiap kali paket input dikirim ke pekerja yang menjalankan DoFn dan waktu yang signifikan telah berlalu tanpa hasil yang tersedia.

Hal ini paling sering merupakan hasil dari satu operasi yang berjalan lama dalam kode pengguna. Masalah lain dapat muncul sebagai operasi dengan waktu pemrosesan yang lama. Misalnya, error yang ditampilkan dan dicoba ulang di dalam DoFn, percobaan ulang dalam jangka waktu yang lama, atau error pada harness pekerja karena faktor seperti OOM dapat menyebabkan waktu pemrosesan yang lama ini.

Jika komputasi yang terpengaruh berada dalam kode pengguna, cari cara untuk mengoptimalkan kode atau membatasi waktu eksekusi. Untuk membantu proses debug, log pekerja menampilkan pelacakan stack untuk operasi apa pun yang macet selama lebih dari 5 menit.

Key commit terlalu besar

Lihat Pengecualian key commit terlalu besar.

Waktu pemrosesan yang lama di semua operasi

Operasi dalam komputasi ini secara konsisten membutuhkan waktu yang lama, yang menunjukkan masalah dalam DoFn yang disediakan pengguna.

Penyebab ini berbeda dengan Operasi dengan waktu pemrosesan yang lama; sedangkan penyebab tersebut memengaruhi beberapa operasi, penyebab ini menunjukkan bahwa semua operasi dalam komputasi ini terpengaruh.

Periksa log pekerja untuk mengetahui error, pengecualian, atau pelacakan stack yang menunjukkan thread yang lambat atau macet. Jika Anda menggunakan Apache Beam SDK untuk Python, dan jika operasi secara inheren berjalan lama berdasarkan desain (misalnya, panggilan API eksternal yang lambat atau I/O latensi tinggi), pertimbangkan untuk menggunakan Async DoFn. Fitur ini dapat meningkatkan throughput dengan mencegah pemrosesan diblokir pada tugas yang berjalan lama ini.

Pembacaan status persisten yang lambat

Komputasi menghabiskan banyak waktu untuk membaca status persisten sebagai bagian dari eksekusi DoFn. Hal ini mungkin disebabkan oleh status persisten yang terlalu besar, atau terlalu banyak pembacaan. Pertimbangkan untuk mengurangi ukuran status yang dipertahankan atau frekuensi pembacaan. Hal ini mungkin juga merupakan masalah sementara karena lambatnya status persisten yang mendasarinya.

Penulisan status persisten yang lambat

Komputasi menghabiskan banyak waktu untuk menulis status persisten selama commit hasil pemrosesan. Hal ini mungkin disebabkan oleh status persisten yang terlalu besar. Pertimbangkan untuk mengurangi ukuran status yang dipertahankan. Hal ini mungkin juga merupakan masalah sementara karena lambatnya status persisten yang mendasarinya.

Commit ditolak

Pemrosesan data tidak dapat di-commit ke status persisten karena tidak valid. Hal ini biasanya disebabkan oleh melebihi salah satu batas operasional limits. Periksa log untuk mengetahui detail selengkapnya, atau hubungi dukungan.

Partisi sumber Apache Kafka tidak cukup

Komputasi sumber Apache Kafka tidak memiliki partisi yang cukup. Untuk mengatasi masalah ini, coba langkah-langkah berikut:

  • Tingkatkan jumlah partisi Kafka.
  • Sertakan redistribute menggunakan .withRedistribute() saat mengonfigurasi pembacaan Kafka IO untuk memparalelkan data dengan lebih efisien. Sertakan .withRedistributeNumKeys(N) dengan N > partitions untuk memberikan batas atas pada jumlah total kunci. Memiliki jumlah kunci yang terbatas memberikan efisiensi melalui penggabungan data.
  • Untuk meminimalkan biaya pengacakan redistribute, gunakan .withOffsetDeduplication(). Mode ini meminimalkan jumlah data yang perlu dipertahankan sebagai bagian dari pengacakan, sekaligus tetap menyediakan pemrosesan yang tepat satu kali.

Untuk mengetahui informasi selengkapnya, lihat Paralelisme di halaman Membaca dari Apache Kafka ke Dataflow.

Sumber Apache Kafka Volume Besar Status Persisten

Komputasi sumber Apache Kafka mendistribusikan ulang data dalam volume tinggi yang mungkin menimbulkan latensi dan biaya yang tinggi. Untuk mengatasi masalah ini, coba langkah-langkah berikut:

  • Jika pemrosesan yang tepat satu kali diperlukan untuk pipeline, minimalkan biaya pengacakan redistribute dengan memanfaatkan mode deduplikasi offset. Mode ini meminimalkan jumlah data yang perlu dipertahankan sebagai bagian dari pengacakan, sekaligus tetap menyediakan pemrosesan yang tepat satu kali.
  • Jika pemrosesan setidaknya satu kali sudah cukup untuk pipeline, konfigurasi izinkan duplikat dapat diaktifkan.

Untuk mengetahui informasi selengkapnya, lihat Membaca dari Apache Kafka ke Dataflow.

Paralelisme sumber tidak cukup

Komputasi sumber tidak memiliki paralelisme yang cukup. Jika memungkinkan, tingkatkan paralelisme dalam sumber. Jika Anda tidak dapat meningkatkan paralelisme dan tugas menggunakan mode setidaknya satu kali, coba tambahkan transformasi Redistribute ke pipeline.

Hot key atau paralelisme kunci yang tidak cukup

Tugas memiliki hot key atau paralelisme kunci yang tidak cukup.

Untuk setiap kunci sharding, Dataflow memproses pesan secara serial. Saat Dataflow memproses batch pesan untuk kunci tertentu, pesan masuk lainnya untuk kunci tersebut akan diantrekan hingga batch saat ini selesai.

Jika Dataflow tidak dapat memproses kunci berbeda yang cukup secara paralel, hal ini dapat menyebabkan bottleneck. Misalnya, data mungkin memiliki terlalu sedikit kunci berbeda, atau kunci tertentu mungkin terlalu banyak direpresentasikan dalam data ("hot key"). Untuk mengetahui informasi selengkapnya, termasuk cara melihat kunci mana yang hot, lihat Memecahkan masalah tugas streaming yang lambat atau macet.

vCPU tidak cukup

Tugas tidak memiliki vCPU pekerja yang cukup. Situasi ini terjadi saat tugas sudah diskalakan ke maksimum, penggunaan vCPU tinggi, dan masih ada backlog. Anda mungkin harus meningkatkan jumlah maksimum pekerja yang disediakan untuk tugas ini. Misalnya, Anda dapat meningkatkan jumlah ini dengan meng update rentang penskalaan otomatis. Atau, cari cara untuk mengurangi penggunaan vCPU dengan mengubah kode pipeline atau workload. Anda dapat menggunakan cloud profiler untuk mencari peluang pengoptimalan.

Penggunaan vCPU tinggi, menunggu peningkatan skala

Tugas memiliki penggunaan vCPU yang tinggi, tetapi ada ruang untuk meningkatkan skala. Kondisi ini kemungkinan bersifat sementara hingga peningkatan skala dapat terjadi. Anda dapat memantau penskalaan otomatis untuk melihat keputusan penskalaan otomatis. Jika kondisi ini berlanjut dalam waktu lama atau sering terjadi, Anda mungkin perlu mengubah konfigurasi penskalaan otomatis dengan menetapkan petunjuk penggunaan pekerja yang berbeda agar tugas dapat meningkatkan skala secara lebih proaktif.

Beban vCPU yang tidak seimbang menyebabkan bottleneck pada beberapa pekerja outlier

Tugas memiliki vCPU pekerja yang cukup, tetapi beberapa pekerja menunjukkan penggunaan vCPU yang sangat tinggi. Hal ini sering kali disebabkan oleh distribusi kerja yang tidak merata. Kemungkinan penyebabnya mencakup partisi sumber yang dimuat secara tidak merata atau hot key.

Untuk mengatasi masalah ini, coba langkah-langkah berikut:

  • Tentukan penyebab pemuatan yang tidak merata dan coba perbaiki. Misalnya, pastikan partisi sumber didistribusikan secara merata.
  • Jika memperbaiki beban yang tidak merata tidak memungkinkan, pertimbangkan untuk mengubah bentuk VM pekerja guna meningkatkan vCPU per pekerja untuk menurunkan penggunaan puncak. Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi vCPU per pekerja, lihat Mengonfigurasi VM pekerja Dataflow.
Masalah saat berkomunikasi dengan pekerja

Dataflow tidak dapat berkomunikasi dengan semua VM pekerja. Periksa status VM pekerja tugas. Kemungkinan penyebabnya meliputi:

  • Ada masalah saat menyediakan VM pekerja.
  • Kumpulan VM pekerja dihapus saat tugas berjalan.
  • Masalah jaringan.
Sumber Pub/Sub mengalami error pull.

Terjadi error saat melakukan pull dari sumber Pub/Sub. Pastikan topik dan langganan yang diperlukan ada, lalu verifikasi kuota dan konfigurasi. Anda juga dapat memeriksa log untuk mengetahui error.

Sumber Pub/Sub tidak memiliki paralelisme yang cukup

Komputasi sumber Pub/Sub tidak memiliki jumlah kunci Pub/Sub yang cukup. Untuk meningkatkan jumlah kunci, tetapkan opsi layanan num_pubsub_keys. Untuk mengetahui informasi selengkapnya, lihat Paralelisme sumber Pub/Sub.

Sumber Pub/Sub dibatasi karena alasan yang tidak diketahui

Komputasi sumber Pub/Sub dibatasi saat membaca dari Pub/Sub, karena alasan yang tidak diketahui. Masalah ini mungkin bersifat sementara. Periksa masalah konfigurasi Pub/Sub, izin IAM yang tidak ada, atau batas kuota. Namun, jika tidak ada area sebelumnya yang menjadi penyebab utama dan masalah berlanjut, hubungi dukungan.

Sink Pub/Sub memublikasikan secara lambat atau macet

Komputasi sink Pub/Sub lambat atau macet. Masalah ini mungkin disebabkan oleh masalah konfigurasi atau batas kuota.

Waktu antrean kerja yang tinggi

Usia kerja yang memenuhi syarat paling lama tinggi, karena jumlah kunci yang besar dan kecepatan pemrosesan kunci. Dalam situasi ini, setiap operasi mungkin tidak terlalu lama, tetapi penundaan antrean secara keseluruhan tinggi.

Dataflow menggunakan satu thread pemrosesan per kunci sharding, dan jumlah thread pemrosesan terbatas. Penundaan antrean kira-kira sama dengan rasio kunci terhadap thread, dikalikan dengan latensi dalam thread untuk setiap paket pemrosesan untuk kunci:

(key count / total harness threads) * latency per bundle

Coba perbaikan berikut:

  • Tingkatkan jumlah pekerja. Lihat Penskalaan otomatis streaming.
  • Tingkatkan jumlah thread harness pekerja. Tetapkan opsi pipeline numberOfWorkerHarnessThreads / number_of_worker_harness_threads .
  • Kurangi jumlah kunci.
  • Kurangi latensi operasi.
Masalah sementara dengan backend Streaming Engine

Ada masalah konfigurasi atau operasional dengan backend Streaming Engine. Masalah ini mungkin bersifat sementara. Jika masalah berlanjut, hubungi dukungan.

Penyebab yang tidak dapat ditentukan

Penyebab backlog tidak dapat ditentukan dengan pasti. Masalah ini mungkin bersifat sementara. Jika masalah berlanjut, hubungi dukungan.

Metrik bottleneck

Metrik tugas berikut memberikan informasi tentang bottleneck:

Langkah berikutnya