بُنى تدفق البيانات: دراسة حالة
- 9 دقائق
الآن وقد رأينا كيف تطورت بُنى للتدفق، يمكننا أن ننظر في إطار عمل واحد محدد هو Apache Samza.
أباتشي سامزا
تم تطوير مشروع Samza في LinkedIn كإطار عمل للمعالجة المتدفقة الموزع. وهو يحول تدفق إدخال الرسائل إلى تدفق إخراج مُعَدّل، استنادًا إلى المعالجة ذات الحالة أو عديمة الحالة. تم تطوير Samza جنبًا إلى جنب مع Kafka (الذي نُوقِشَ سابقًا)، والذي كان عبارة عن نظام مراسلة موزعة بزمن انتقال منخفض. مَكّن Samza معالجة رسائل Kafka هذه في الوقت الحقيقي.
وينقسم Samza إلى ثلاث طبقات:
- طبقة تدفق تُقدِّم تدفقات مقسمة ومنسوخة ودائمة
- طبقة تنفيذ تقوم بجدولة المهام وتنسيقها على نظام مجموعة
- طبقة معالجة تحول تدفق الإدخال وتُولِّد تدفق إخراج جديد، وتغير قواعد البيانات، وتُشغل الأحداث، وبشكل عام، تتفاعل مع رسائل الإدخال
الشكل 9: الطبقات الثلاث لتطبيق Samza
تعد طبقات التدفق والتنفيذ قابلة للتوصيل. يستخدم تنفيذ افتراضي Kafka كوسيط للرسائل المتدفقة. تدفقات الإدخال والإخراج هي تسلسلات رسائل غير قابلة للتغيير، والتي يمكن تقسيمها عبر العقد. وداخل القسم، يتم ترتيب الرسائل بشكل عام ويمكن التعرف عليها بشكل فريد من خلال الإزاحة داخل التدفق. تستخدم طبقة التنفيذ الافتراضية YARN، على الرغم من أن Mesos مدير موارد شائع آخر يمكن استخدامه. يجعل استخدام YARN من السهل على تطبيق Samza ضمان التسامح مع الأخطاء، وتبسيط عملية التوزيع، واستخدام ميزات التسجيل وعزل الموارد المضمنة. يتيح استخدام YARN مع HDFS أيضًا لـ Samza الاستفادة من منطقة البيانات.
يستخدم Samza أيضًا cgroups لمعالجة حاويات المعالج المفرد التي تُشغِّل JVM لتنفيذ مهمة واحدة أو مهام متعددة في مهمة واحدة. Cgroups هي إحدى ميزات نواة Linux التي تتيح لمجموعة من العمليات أن يكون لها ارتباط جماعي بوحدة المعالجة المركزية والذاكرة والوصول إلى نظام الملفات. في Samza، يتم تنفيذ كل حاوية بشكل منطقي بمحادثة نصية واحدة عند معالجة رسالة، بمعنى أن مهمة واحدة فقط داخل حاوية يتم تنفيذها في أي وقت. تتم المعالجة بواسطة تعليمات برمجية مخصصة مكتوبة باستخدام واجهة برمجة التطبيقات Samza.
وللحصول على المزيد من التوازي، فإن Samza ببساطة يولد المزيد من الحاويات. ولهذا السبب، لا نشجع المطورين على استخدام مؤشرات ترابط متعددة ضمن التعليمات البرمجية لوظيفتهم. يستخدم Samza مؤشرات ترابط متعددة داخليًا للاتصالات والمعالجة؛ ومع ذلك، يتم تشغيل مؤشر ترابط واحد كتكرار حدث يعالج رسالة الإدخال/الإخراج ونقاط التحقق والنوافذ ومقاييس التفريغ.
الشكل 10: تدفقات الإدخال والإخراج في مهمة Samza
يبدأ عملاء Samza وظائف Samza في YARN. تمتلك Samza تطبيقها الرئيسي الذي يتفاوض للحصول على الموارد مع مدير موارد YARN. يتحدث مدير موارد YARN إلى مختلف مديري العقد لتخصيص الموارد إلى تطبيق Samza. يُولِّد YARN SamzaContainers (مشغلات المهام) التي تُشغِّل تعليمات برمجية مخصصة تنفذ واجهة برمجة تطبيقات StreamTask Samza. وغالبًا ما تكون هذه في موقع مشترك مع الحاويات لوسطاء Kafka من أجل تحقيق الاستفادة من منطقة البيانات.
الشكل 11: يتم تقسيم مهمة Samza إلى مهام، والتي يمكن تجميعها داخل حاوية. وبما أن هناك مؤشر ترابط واحدًا فقط لكل حاوية، يتم تنشيط مهمة واحدة فقط في أي وقت.
تعتمد Samza على التحجيم الأفقي لتحسين الأداء. ويتم ذلك عن طريق زيادة عدد المهام في أي مهمة. وتعمل كل مهمة على قسم واحد من تدفقات الإدخال الخاصة بالمهمة. ومن ثم، لكي تتمكن من تشغيل المزيد من المهام المتوازية، يجب تقسيم أي تدفق إلى عدد أكبر من الأقسام. وقد تم وصف هذا في الموضوع السابق عن Kafka. لكل موضوع إدخال، هناك مثيل StreamTask واحد على الأقل يتم تهيئته لكل قسم. تعمل كل مهمة تدفق بشكل مستقل على معالجة قسم واحد.
الشكل 12: تعمل تطبيقات Samza على YARN في حاويات معزولة
وبالطبع، فإن مثال التدفق الموضح أعلاه يحول تدفقًا واردًا إلى إخراج. هناك العديد من تطبيقات المعالجة المتدفقة حيث يكون الحساب الذي يتم تنفيذه على أي رسالة إدخالاً مستقلاً عن جميع الرسائل الأخرى. ومن الأمثلة على ذلك تصفية البيانات استنادًا إلى قواعد أو تعديلات بسيطة تستند إلى الوقت.
ومع ذلك، تتطلب حالات الاستخدام الأكثر أهمية للمعالجة المتدفقة توصيل تدفقات متعددة أو تنفيذ تجميع الرسائل أو اتخاذ القرارات بناءً على نافذة بيانات. وتتطلب جميع هذه السيناريوهات تخزين معلومات الحالة. يُنفِّذ Samza القدرة على الصمود باستخدام تجريد KeyValueStore. يُخزِّن كل مثيل StreamTask الحالة على مخزن بيانات مضمن منفصل على نفس الجهاز. وبشكل افتراضي، فإن Samza يستخدم RocksDB، الذي يوفر زمن الوصول المنخفض ومعدل النقل المرتفع والمُحَسّن من حيث الكتابة. يؤدي استخدام قاعدة بيانات مضمنة إلى تقليل النفقات العامة للاعتماد على مكالمات الشبكة باهظة الثمن للاستعلام عن البيانات.
الشكل 13: ضمان القدرة على الصمود للحالة المحلية للمهمة باستخدام مخزن بيانات مضمن
يمكن النظر إلى هذا التنفيذ باعتباره تجزئة لقاعدة بيانات بعيدة وتحديد موقع كل مقطع مع قسم بيانات فريد. وللتأكد من أن حالات الفشل لا تؤدي إلى فقدان حالة، يتم إرسال أي تعديل على قاعدة بيانات محلية باستخدام تدفق سجل تغيير منفصل، وهو موضوع Kafka منفصل. تقوم عملية خلفية منفصلة بتشغيل ضغط السجل لتقليل كمية البيانات في سجل التغيير.
الشكل 14: تُكتب كل قاعدة بيانات محلية مضمنة إلى تدفق إخراج سجل التغيير
ومن ثم، يمكن بسهولة تحجيم المهام بإطلاق حاوية جديدة مع قاعدة البيانات الخاصة بها والكتابة إلى تدفق آخر موازٍ لسجل التغيير. في حالة حدوث أي فشل، يمكن إطلاق حاوية جديدة واستعادتها إلى حالة متسقة من خلال الاستهلاك من سجل التغيير الناتج للقسم الفاشل.
الشكل 15: استرداد الفشل في Samza
اختبر معلوماتك
الملاحظات
هل كانت هذه الصفحة مفيدة؟
لا
هل تحتاج إلى مساعدة مع هذا الموضوع؟
هل تريد محاولة استخدام Ask Learn لتوضيح هذا الموضوع أو إرشادك خلاله؟