Apa perbedaan utama antara Flink dan Storm?

140

Flink telah dibandingkan dengan Spark , yang, menurut saya, merupakan perbandingan yang salah karena Flink membandingkan sistem pemrosesan peristiwa berjendela dengan micro-batching; Demikian pula, tidak masuk akal bagi saya untuk membandingkan Flink dengan Samza. Dalam kedua kasus, ini membandingkan real-time vs. strategi pemrosesan peristiwa bertumpuk, bahkan jika pada "skala" yang lebih kecil dalam kasus Samza. Tapi saya ingin tahu bagaimana Flink dibandingkan dengan Storm, yang secara konseptual tampak jauh lebih mirip dengannya.

Saya telah menemukan ini (Slide # 4) yang mendokumentasikan perbedaan utama sebagai "latensi yang dapat disesuaikan" untuk Flink. Petunjuk lain tampaknya adalah artikel oleh Slicon Angle yang menyarankan bahwa Flink lebih terintegrasi ke dalam dunia Spark atau HadoopMR, tetapi tidak ada detail aktual yang disebutkan atau dirujuk. Terakhir, Fabian Hueske sendiri mencatat dalam sebuah wawancara bahwa "Dibandingkan dengan Apache Storm, fungsionalitas analisis aliran Flink menawarkan API tingkat tinggi dan menggunakan strategi toleransi kesalahan yang lebih ringan untuk memberikan jaminan pemrosesan yang tepat sekali."

Semua itu agak jarang bagi saya dan saya tidak mengerti maksudnya. Adakah yang bisa menjelaskan masalah apa dengan pemrosesan streaming di Storm yang sebenarnya diselesaikan oleh Flink? Apa yang dimaksud Hueske dengan masalah API dan "strategi toleransi kesalahan yang lebih ringan"?

fnl
sumber
2
Perhatikan bahwa Apache Spark (fokus pertanyaan terkait) tidak sama dengan Apache Storm (pertanyaan ini di sini) - jadi, tidak, ini sama sekali bukan duplikat.
fnl

Jawaban:

215

Penafian : Saya adalah komiter Apache Flink dan anggota PMC dan hanya akrab dengan desain tingkat tinggi Storm, bukan internal.

Apache Flink adalah kerangka kerja untuk aliran terpadu dan pemrosesan batch. Runtime Flink secara native mendukung kedua domain karena transfer data pipelined antara tugas paralel yang mencakup pengacakan pipelined. Rekaman segera dikirim dari tugas produksi ke tugas penerimaan (setelah dikumpulkan dalam buffer untuk transfer jaringan). Pekerjaan batch dapat dijalankan secara opsional menggunakan pemblokiran transfer data.

Apache Spark adalah kerangka kerja yang juga mendukung pemrosesan batch dan aliran. API batch Flink terlihat sangat mirip dan menangani kasus penggunaan yang mirip seperti Spark tetapi berbeda di internal. Untuk streaming, kedua sistem mengikuti pendekatan yang sangat berbeda (mini-batch vs. streaming) yang membuatnya cocok untuk berbagai jenis aplikasi. Saya akan mengatakan membandingkan Spark dan Flink adalah valid dan berguna, namun, Spark bukanlah mesin pemroses aliran yang paling mirip dengan Flink.

Datang ke pertanyaan awal, Apache Storm adalah prosesor aliran data tanpa kemampuan batch. Faktanya, mesin pipelined Flink secara internal terlihat agak mirip dengan Storm, yaitu, antarmuka tugas paralel Flink mirip dengan baut Storm. Storm dan Flink memiliki kesamaan yaitu mereka bertujuan untuk pemrosesan aliran latensi rendah dengan transfer data pipelined. Namun, Flink menawarkan API level yang lebih tinggi dibandingkan dengan Storm. Alih-alih mengimplementasikan fungsionalitas baut dengan satu atau lebih pembaca dan kolektor, Flink DataStream API menyediakan fungsi seperti Map, GroupBy, Window, dan Join. Banyak dari fungsi ini harus diimplementasikan secara manual saat menggunakan Storm. Perbedaan lainnya adalah memproses semantik. Storm menjamin setidaknya sekali pemrosesan sementara Flink menyediakan tepat sekali. Implementasi yang memberikan jaminan pemrosesan ini sedikit berbeda. Sementara Storm menggunakan pengakuan tingkat rekor, Flink menggunakan varian dari algoritma Chandy-Lamport. Singkatnya, sumber data secara berkala memasukkan penanda ke dalam aliran data. Setiap kali operator menerima penanda seperti itu, ia memeriksa status internalnya. Saat marker diterima oleh semua data sink, marker (dan semua record yang telah diproses sebelumnya) dikomit. Jika terjadi kegagalan, semua operator sumber disetel ulang ke status mereka saat mereka melihat penanda terakhir yang dilakukan dan pemrosesan dilanjutkan. Pendekatan marker-checkpoint ini lebih ringan daripada pengakuan level rekor Storm. Ini sumber data secara berkala memasukkan penanda ke dalam aliran data. Setiap kali operator menerima penanda seperti itu, ia memeriksa status internalnya. Saat marker diterima oleh semua data sink, marker (dan semua record yang telah diproses sebelumnya) dikomit. Jika terjadi kegagalan, semua operator sumber disetel ulang ke status mereka saat mereka melihat penanda terakhir yang dilakukan dan pemrosesan dilanjutkan. Pendekatan marker-checkpoint ini lebih ringan daripada pengakuan level rekor Storm. Ini sumber data secara berkala memasukkan penanda ke dalam aliran data. Setiap kali operator menerima penanda seperti itu, ia memeriksa status internalnya. Saat marker diterima oleh semua data sink, marker (dan semua record yang telah diproses sebelumnya) dikomit. Jika terjadi kegagalan, semua operator sumber disetel ulang ke status mereka saat mereka melihat penanda terakhir yang dilakukan dan pemrosesan dilanjutkan. Pendekatan marker-checkpoint ini lebih ringan daripada pengakuan level rekor Storm. Ini semua operator sumber disetel ulang ke status mereka saat mereka melihat penanda terakhir yang dilakukan dan pemrosesan dilanjutkan. Pendekatan marker-checkpoint ini lebih ringan daripada pengakuan level rekor Storm. Ini semua operator sumber disetel ulang ke status mereka saat mereka melihat penanda terakhir yang berkomitmen dan pemrosesan dilanjutkan. Pendekatan marker-checkpoint ini lebih ringan daripada pengakuan level rekor Storm. Iniset slide dan pembicaraan terkait membahas pendekatan pemrosesan streaming Flink termasuk toleransi kesalahan, checkpointing, dan penanganan status.

Storm juga menawarkan API tingkat tinggi yang tepat sekali yang disebut Trident. Namun, Trident didasarkan pada mini-batch dan karenanya lebih mirip dengan Spark daripada Flink.

Latensi Flink yang dapat disesuaikan mengacu pada cara Flink mengirimkan catatan dari satu tugas ke tugas lainnya. Saya katakan sebelumnya, bahwa Flink menggunakan transfer data pipelined dan meneruskan catatan segera setelah diproduksi. Untuk efisiensi, record ini dikumpulkan dalam buffer yang dikirim melalui jaringan setelah penuh atau ambang waktu tertentu terpenuhi. Ambang batas ini mengontrol latensi rekaman karena ini menentukan jumlah waktu maksimum rekaman akan tetap berada di buffer tanpa dikirim ke tugas berikutnya. Namun, ini tidak dapat digunakan untuk memberikan jaminan pasti tentang waktu yang dibutuhkan untuk rekaman dari memasuki hingga keluar dari program karena ini juga tergantung pada waktu pemrosesan dalam tugas dan jumlah transfer jaringan di antara hal-hal lainnya.

Fabian Hueske
sumber
2
Terima kasih sekali! Mungkin ada satu hal yang terbuka, jika saya dapat mengganggu Anda sekali lagi: Tentang apakah masalah "latensi yang dapat disesuaikan" ini? Sepertinya ini bisa sangat relevan mengingat domain aplikasi yang berbeda akan memiliki persyaratan yang berbeda dalam hal ini. Bisakah Anda menjelaskan apa artinya, setidaknya dalam istilah Flink?
fnl
6
Tentu, saya memperpanjang jawaban saya dan membahas latensi yang dapat disesuaikan. Beri tahu saya jika Anda memiliki pertanyaan lebih lanjut.
Fabian Hueske
Apakah Flink mengizinkan perubahan "panas" ke alur kerja DAG, seperti yang dapat diterapkan, misalnya, menggunakan Erlang? YAITU. Bisakah seseorang mengubah DAG selama runtime?
Thomas Browne
1
Pertukaran kode panas tidak dimungkinkan. Namun, Anda dapat mempertahankan status aplikasi sebagai savepoint. Savepoint dapat digunakan untuk memulai aplikasi yang dimodifikasi. Ini dapat dilakukan saat aplikasi asli masih berjalan sehingga keluarannya dapat dibalik di beberapa titik. Perhatikan bahwa aplikasi tidak dapat dimodifikasi secara sewenang-wenang saat melanjutkan dari savepoint yang ada.
Fabian Hueske
1
Keuntungan menarik dan besar dari Flink adalah kemampuan menjalankan Apache Beam dengan API tingkat yang lebih tinggi. Ini salah satu pelari paling kaya dan lengkap untuk Beam.
Piotr Gwiazda
50

Menambah jawaban dari Fabian Hueske:

Flink meningkat pada Storm juga dengan cara berikut:

  • Backpressure: Runtime streaming Flink berperilaku baik ketika operator yang berbeda berjalan pada kecepatan yang berbeda, karena operator downstream memberikan tekanan balik kepada operator upstream dengan sangat baik meskipun lapisan jaringan mengelola kumpulan buffer.

  • Status yang ditentukan pengguna: Flink memungkinkan program mempertahankan status kustom di operator Anda. Status itu sebenarnya dapat berpartisipasi dalam pemeriksaan untuk toleransi kesalahan, memberikan jaminan tepat satu kali untuk status kustom yang ditentukan pengguna. Lihat contoh mesin status yang ditentukan pengguna di dalam operator, yang secara konsisten checkpoint bersama dengan aliran data.

  • Streaming Windows: Jendela aliran dan agregasi jendela adalah blok bangunan penting untuk menganalisis aliran data. Flink hadir dengan sistem jendela yang cukup kuat yang mendukung banyak jenis jendela.

Stephan Ewen
sumber
2
Mengenai poin pertama Anda, Storm berperilaku baik di bawah tekanan balik mulai 1.0 (dirilis pada April 2016)
Colin Nichols
Tekanan balik badai dapat dikurangi menggunakan properti "spout_max_pending". Ini menetapkan ambang batas untuk tupel maks yang dapat hadir di cerat yang menunggu pengakuan. Cerat tidak akan mengkonsumsi tupel lagi ke depan sampai terjadi ack.
Aman Garg
5

Penafian: Saya adalah karyawan Cloudera, pendukung utama Storm dan (segera) Flink.

Fungsional

Banyak poin teknis bagus telah disajikan. Ringkasan sorotan yang sangat singkat:

  • Baik Flink dan Storm dapat melakukan pemrosesan per acara
  • Storm tampaknya tidak mendukung event-time di luar kotak
  • Storm belum mengangkat dukungan SQL dari tahap eksperimental

Non-Fungsional

  • Banyak pelanggan merasa Storm (terlalu) sulit digunakan
  • Adopsi Storm melambat, dan komunitas Flink sekarang tampaknya lebih aktif daripada Storm
  • Flink masih memiliki beberapa hal yang harus dilakukan (mis. Contoh-contoh yang didokumentasikan), tetapi secara keseluruhan itu telah berhasil di hampir setiap area yang mungkin Anda pikirkan

Kesimpulan

Cloudera baru-baru ini mengumumkan penghentian Storm (dalam HDP). Dan secara bersamaan Flink diumumkan sebagai penggantinya.

Jadi, jika Anda memiliki kasus penggunaan di badai, mereka tentu saja akan terus bekerja. Tetapi untuk kasus penggunaan baru, saya akan melihat Flink atau mesin streaming lainnya.

Dennis Jaheruddin
sumber
3

Berdasarkan pengalaman saya tentang Storm dan Flink. Saya merasa alat ini dapat menyelesaikan masalah yang sama dengan pendekatan yang berbeda. Setiap fitur Flink yang disebutkan oleh @Stephan Ewen dapat dicocokkan oleh Storm dengan API internal (mis., Spolts dan baut ) dan API Trident sekarang. Seseorang mengklaim bahwa Trident adalah gaya batch mini sementara saya pikir sebagian besar aplikasi kompleks dengan terkait negara atau agregasi hanya dapat bergantung pada pemrosesan batch dengan gaya jendela. Jadi saya hanya membuat daftar beberapa perbedaan utama di sini tanpa mengatakan mana yang lebih baik.

  • Gaya pengembangan . berorientasi komputasi (mis., operator yang dapat dirantai) di Flink vs. berorientasi aliran data (mis., addSpolt()/addBolt()) di Storm.
  • API tingkat tinggi . Fungsi (mis., Peta, Jendela, Bergabung di tingkat Streaming) di Flink vs. Jendela Asli dan Trident di Storm.
  • Pemrosesan pesan terjamin (GMP. Yaitu, tepat-sekali ) . Checkpoint dengan Two-Phase Commit Connector (mis., KafkaConsumer) di Flink vs. Tuple-tree dengan mesin status eksternal atau Trident di Storm.
  • Toleransi kesalahan . Marker-checkpoint di Flink vs. ACK level rekor di Storm.
  • Arsitektur internal . Abstraksi sederhana dan paralelisme relatif (misalnya, slot untuk setiap utas yang dipertimbangkan dengan inti CPU) di Abstraksi Flink vs. Multi-layer (misalnya, slot untuk setiap JVM sebagai pekerja di supervisor dan setiap supervisor dapat memiliki banyak pekerja) di Storm.
LeoZhang
sumber