أباتشي فلينك هو محرك معالجة تيارات البيانات في الوقت الحقيقي. معظم تطبيقات معالجة التيارات هي ‘تحتوي على حالة.’ وهذا يعني أن الحالة تُخزن وتُستخدم للمعالجة اللاحقة. في أباتشي فلينك، يتم إدارة الحالة من خلال خلفية حالة مُكونة. يدعم فلينك اثنين من خلفيات الحالة في الإنتاج. الأول هو HashMapStateBackend
، والآخر هو EmbeddedRocksDBStateBackend
.
لمنع فقدان البيانات وتحقيق التحمل من الأخطاء، يمكن لفلينك أن يحتفظ بنسخ احتياطية من الحالة إلى تخزين دائم. يمكن تكوين فلينك لأخذ لقطات احتياطية إما للحالة بأكملها في موقع دائم أو للفرق منذ آخر لقطة. الأولى تُسمى بالتحقق النقطي بالكامل، والثانية تُعرف باسم التحقق النقطي التدريجي.
في هذا المقال، سنقوم بمقارنة HashMapStateBackend
مع التحقق الكامل وEmbeddedRocksDBStateBackend
مع التحقق التدريجي. يفترض هذا المقال أن الجمهور يمتلك إما معرفة عملية أو نظرية بـ أباتشي فلينك.
نظرة عامة على خلفية حالة فلينك
لفهم خلفية حالة فلينك، من المهم معرفة الفرق بين حالة الطيران و لقطات الحالة.
ال حالة الطيران تُعرف باسم الحالة العاملة في فلينك وتُخزن محليًا. بناءً على تكوين الخلفية، فإنها إما في ذاكرة الهردسك أو خارج الذاكرة، مع احتمال تجاوز إلى القرص المحلي.
على الجانب الآخر، يتم تخزين لقطات الحالة (نقطة فحص أو نقطة حفظ) في موقع بعيد متين. تُستخدم هذه اللقطات لإعادة بناء حالة وظيفة Flink في حالة فشل الوظيفة.
يمكن أن يتم فقدان الحالة التي تم فيها العمل إذا فشلت الوظيفة. هذا لا يؤثر على استرداد الوظيفة إذا تم تمكين النقطة الفرعية في الوظيفة. عندما يتم تكوين النقطة الفرعية، يتم استرداد الحالة من التخزين المتين في وقت الاسترداد.
أي خلفية حالة يجب اختيارها للإنتاج يعتمد على متطلبات التطبيق للإنتاجية والكفاءة الزمنية والتوسعية.
هناك خلفيتان لحالة يدعمهما Apache Flink في الإنتاج.
1. HashMapStateBackend
هي خلفية حالة خفيفة الوزن في Flink لإدارة الحالة المترتبة وحالة المشغل أثناء معالجة التدفق. يتم تخزين الحالة في الذاكرة الافتراضية باستخدام هيكل بيانات HashMap. نظرًا لأنه يتم تخزينه في الذاكرة، فإن القيد الرئيسي هنا هو أن الحجم الأقصى للحالة محدود بحجم الذاكرة الافتراضية لـ Java. لا يوجد تسلسل متضمن في كتابة الحالة أو قراءتها من الحالة. لذا، هذا مناسب لتطبيقات الكفاءة الزمنية المنخفضة، والإنتاجية العالية، والحالات غير الكبيرة.
2. EmbeddedRocksDBStateBackend
يخزن ذاكرة التخزين الخلفية هذه البيانات التي تم نقلها في ذاكرة قاعدة بيانات RocksDB. بشكل افتراضي، تخزن RocksDB البيانات في القرص المحلي لمدير المهام. يتم تسلسل البيانات وتخزينها في ذاكرة خارج الحدود ويتم تفريغها إلى قرص محلي مرتبط بمدير المهام. تعتمد تنسيق التسلسل على مسلسل النوع الذي تم تكوينه في التطبيق.
مع هذه ذاكرة التخزين الخلفية، يكون حجم الحالة التي يمكن تخزينها محدودًا فقط بمساحة القرص المرتبط بمدير المهام. إذا كان للتطبيق حالة ضخمة ولا يمكن تضمينها في ذاكرة الكومة، فهذه هي ذاكرة التخزين الخلفية المناسبة. نظرًا لضمن البيانات، سيكون للتطبيق تأخير أعلى وإنتاجية أقل مقارنة بـ ذاكرة حالة HashMapStateBackend
.
نظرة عامة على حالة اللقطة
اللقطة تمثل الحالة العامة لوظيفة Flink. تتكون من مؤشر لكل مصدر بيانات وحالة جميع المشغلات التي تحتوي على حالة Flink بعد معالجة حتى تلك المؤشرات من المصادر. عملية عمليات الفحص في Apache Flink هي آلية لتحقيق التحمل من الأخطاء من خلال حفظ الحالة بانتظام في تخزين عن بُعد دائم.
في حالة فشل الوظيفة، يستعيد Flink الحالة المخزنة من التخزين عن بُعد الدائم ويبدأ في معالجة بيانات البث من حيث توقف. يستخدم Flink عملية لقط الحواجز غير المتزامنة. إنها نسخة من خوارزمية Chandy-Lamport.
يدعم Flink نوعين من عمليات الفحص.
1. عمليات فحص كاملة
النقطة الكاملة هي حيث يتم التقاط وتخزين الحالة الكاملة لوظيفة Flink في تخزين عن بُعد متين. في حالة فشل الوظيفة، تستعيد الوظيفة من الحالة المخزنة مسبقًا. متطلبات مساحة التخزين والوقت اللازم لعملية الفحص النقطي تعتمد بالكامل على حالة التطبيق. النقطة الكاملة تعمل مع كل من HashMapStateBackend
و RocksDBStateBackend
。
2. الفحص النقطي التدريجي
الفحص النقطي التدريجي هو نهج محسن. بدلاً من التقاط الحالة بأكملها، يحفظ Flink فقط “التغيرات” التي تم إجراؤها على الحالة منذ الفحص النقطي الأخير. يقلل هذا من العبء على الشبكة وبالتالي الوقت المستغرق في الفحص النقطي. الفحص النقطي يحدث بشكل كامل غير متزامن في هذه الحالة.
يدعم فقط RocksDBStateBackend
الفحص النقطي التدريجي. يستفيد Flink من آلية RocksDB الداخلية لهذا الغرض. على الرغم من أن الفحص النقطي يستغرق وقتًا أقل من النقطة الكاملة، في حالة فشل الوظيفة، يعتمد وقت الاستعادة على عوامل عدة. إذا كانت الشبكة عائقًا، يمكن أن يكون وقت الاستعادة أطول من الاستعادة من النقطة الكاملة.
التحليل
تفاصيل الخط الأنابيب: تشغيل خط الأنابيب Apache Beam على محرك Flink بنافذة ثابتة تبلغ 10 دقائق وتم تكوين الفحص النقطي لتشغيله كل 3 دقائق. نوع التسلسل المكون هو AVRO.
- نوع العنقودة: “m5dn.4xlarge”
- تخزين النقطة النهائي: S3
- عدد المفاتيح الفريدة: 2K
Input rate 10k/s (~ 7.8 MB/s) | |||||||||
---|---|---|---|---|---|---|---|---|---|
نوع | لا: من TM |
التوازي | تخصيص الذاكرة لكل TM |
استخدام الذاكرة لكل TM |
استخدام ذاكرة البود لكل TM |
استخدام وحدة المعالجة المركزية لكل TM |
نقطة التحقق الحجم |
نقطة التحقق المدة |
ذاكرة مُدارة من Flink |
HashMapState مع نقطة تحقق كاملة |
1 | 1 | 10GB | 8.5GB | 11.1GB | 1.2 | 4GB | 50 ثانية | 0 |
RocksDBState مع نقطة تحقق تزايدية مع AVRO |
1 | 1 | 3GB | 1.82GB | 4.63GB | 1.5 | 207MB | 3 ثواني | 3GB |
Input rate 20k/s (~15.6 MB/s) | |||||||||
---|---|---|---|---|---|---|---|---|---|
نوع | لا: من TM |
التوازي | تخصيص الذاكرة لكل TM |
استخدام الذاكرة لكل TM |
استخدام البود لكل TM |
استخدام وحدة المعالجة المركزية لكل TM |
نقطة التحقق الحجم |
نقطة التحقق المدة |
ذاكرة مُدارة من Flink |
HashMapState مع نقطة تحقق كاملة |
2 | 2 | 10GB | 8.69GB | 11.2GB | 1.3 | 8.39GB | 50 ثانية | 0 |
حالة RocksDB مع نقطة تحقق تصاعدية نقطة تحقق مع AVRO |
2 | 2 | 3 جيجابايت | 1.87 جيجابايت | 4.71 جيجابايت | 1.4 | 404 ميجابايت | 3 ثواني | 3 جيجابايت |
input rate 30k/s (~23.5 MB/s) | |||||||||
---|---|---|---|---|---|---|---|---|---|
النوع | لا: من TM |
التوازي | تخصيص الذاكرة لكل TM |
استخدام الذاكرة لكل TM |
استخدام البود لكل TM |
استخدام المعالج لكل TM |
نقطة تحقق الحجم |
نقطة تحقق المدة |
الذاكرة المدارة بواسطة Flink |
حالة HashMap مع نقطة تحقق كاملة |
3 | 3 | 10 جيجابايت | 9.74 جيجابايت | 11.2 جيجابايت | 1.2 | 11.8 جيجابايت | 65 ثانية | 0 |
حالة RocksDB مع نقطة تحقق تصاعدية نقطة تحقق مع AVRO |
3 | 3 | 3 جيجابايت | 1.72 جيجابايت | 3.75 جيجابايت | 1.4 | 576 ميجابايت | 5 ثواني | 3 جيجابايت |
كما ترى من التجربة أعلاه، فإن مدة نقطة التحقق تنخفض مع استخدام نقاط التحقق التصاعدية. وهذا يمكن أن يساعد بشكل كبير في أداء التطبيق.
الملخص
فيما يلي ملخص التجربة.
خلفية حالة HashMap مع نقطة تحقق كاملة | حالة RocksDBStateBackend مع النقطة التفاضلية | |
تأخر التطبيق | تأخر منخفض لأن البيانات تُخزن ككائنات Java في الذاكرة. قراءة وكتابة لا تنطوي على أي تسلسل. | نظرًا لأن التسلسل مشمول في كل عملية قراءة أو كتابة، ستكون التأخر أعلى. |
قابلية التوسع | أقل قابلية للتوسع للوظائف ذات الحالة الكبيرة | قابلية توسع عالية للوظائف ذات الحالة الكبيرة والحالات التي تتغير ببطء |
مقاومة الأخطاء | مقاومة الأخطاء عالية | مقاومة الأخطاء عالية |
مدة النقطة التفاضلية | مدة النقطة التفاضلية عالية لأن التصوير الفوري يحدث لمجموعة البيانات بأكملها في كل مرة. | مدة النقطة التفاضلية أقل لأنه يتم حفظ الفرق منذ آخر نقطة تفضيلية. |
تعقيد الاسترداد | الاسترداد سهل لأن يتعين تحميل مشهد واحد فقط. | الاسترداد معقد لأن يتعين على RocksDB بناء الحالة من عدة نقاط تفضيلية وكثير يعتمد على سرعة الشبكة. |
متطلبات التخزين | مدعومة من كل من HashMapStateBackend و RocksDBStatebackend. | مدعومة فقط من RocksDBStatebackend. |
لقطة الحالة | تحفظ الحالة بأكملها في كل نقطة تفضيلية. | تحفظ فقط الفرق منذ آخر نقطة تفضيلية ناجحة. |
حجم الذاكرة | نظرًا لأن الحالة تُخزن في الذاكرة قبل التصوير، فإن متطلبات الذاكرة العشوائية عالية، ومن المتوقع المزيد من دورات GC. | يتم تخزين الحالات في الذاكرة خارج الكومة وربما على القرص المحلي، مما يعني استخدام أقل لمساحة الكومة وأقل دورات GC. |
حجم الخلفية الحالية | محدود بالحد الأقصى للذاكرة المخصصة لل JVM. | حجم خلفية الحالة RocksDB لا يقتصر بحدود ذاكرة الكومة لـ JVM ولكن يقتصر فقط بالمساحة المتاحة على القرص. |
تأثير الأداء | تأثير أعلى على عملية المعالجة لأنها لقطة كاملة. | تأثير أقل على عملية المعالجة لأنه يتم تسجيل الفارق فقط. |
وحدة المعالجة المركزية | يتم استخدام وحدة المعالجة المركزية فقط للمعالجة و GC. لا يشمل تسلسل خلفية الحالة. | استخدام وحدة المعالجة المركزية أعلى مقارنة بالنقطة التفتيشية الكاملة لنفس معدل بيانات الإدخال.
يمكن تحسين استخدام وحدة المعالجة المركزية عن طريق تطبيق آلية تسلسل صحيحة. قمنا بتجربة مع Avro وحصلنا على نتائج أفضل بكثير مقارنة بـ Kryo. |
أفضل حالة استخدام | جيد لحجم خلفية حالة أصغر وحالة تتغير بانتظام. | جيد لخلفية حالة أعلى وتحديث الحالة ببطء. |
Source:
https://dzone.com/articles/apache-flink-full-checkpoint-vs-incremental-checkpoint