المشتقة · فصل ١٠

الـ Batch: حوّل الداتا وهي نايمة

Derived data · Unix pipes · MapReduce · joins
🎯 الهدف: تبني indexes وتقارير من الداتا الأصلية من غير ما تلمس سيستم الحقيقة وقت الشغل.

سجل الحقيقة والداتا المشتقة

📕 System of record

المكان اللي الداتا بتتكتب فيه أول مرة. لو فيه تعارض، هو الصح. غالبًا normalized.

📗 Derived data

نتيجة تحويل: cache، index، materialized view، توصيات. لو ضاعت تقدر تعيد بناءها. غالبًا متكررة عشان القراءة تبقى سريعة.

الفرق مش في الأداة، في طريقة استخدامها. والخدمات الأونلاين بترد على ريكوست. الـ batch بياخد داتا كبيرة معروفة الحجم ويطلع output. الـ stream بيشتغل على الأحداث أول بأول.

فلسفة Unix

سطر واحد يطلّع أكتر ٥ صفحات اتزارت:

cat access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -5

sort بيعمل spill للديسك و merge (زي SSTables) ويستخدم كل الـ cores، فيعدي داتا أكبر من الرام. الفلسفة: كل برنامج حاجة واحدة، الـ output يبقى input لبرنامج لسه ماتعرفوش، الواجهة موحدة (بايتات)، والمدخلات immutable فتقدر تعيد التشغيل. العيب: ماكينة واحدة. وهنا ييجي Hadoop.

MapReduce

MapReduce أداة Unix موزعة. بدل stdin يقرا ويكتب في HDFS: ديسكات عادية على آلاف الماكينات، والـ blocks متكررة، و NameNode عارف كل block فين. أرخص بكتير من storage مخصص.

الـ map يطلع أزواج مفتاح وقيمة. الـ shuffle يجمع نفس المفتاح في مكان واحد. الـ reduce يطلّع الناتج. الملفات الناتجة immutable، فالشغل اللي خلّص مبيتعيدش لو ماكينة وقعت في النص. ده ليه الـ batch يقدر يعيد المحاولة بأمان.

الـ joins في الـ batch يا sort-merge (ترتّب الطرفين وتدمج)، يا broadcast للجدول الصغير على كل الماكينات، يا partitioned hash join. نفس أفكار الداتابيز بس على ملفات.

Spark و Flink خدوا نفس الفكرة وسابوا كتابة كل خطوة على الديسك: الشغل يفضل في الرام بين المراحل، فالدورة أقصر، والـ API أقرب لكود عادي من ما تكتب mapper و reducer.

الـ input بتاع الـ batch معروف الحجم (bounded). أول ما الداتا متخلّصش، تبقى stream، وده الفصل الجاي.

Checklist الـ batch

🧠 اختبر نفسك
١) الكاش ضاع. ترجع الداتا منين؟
من الـ system of record. الكاش derived ويتبنى تاني.
٢) ليه ملفات الـ MapReduce مش بتتعدل في مكانها؟
عشان لو الشغل وقع في النص تعيد المرحلة. الناتج القديم يفضل سليم لحد ما الجديد يخلص.
٣) جدول صغير وجدول بمليار صف. أنهي join؟
Broadcast: ابعت الصغير لكل الماكينات، ومترتّبش الكبير عشان تلحقه.
٤) إيه الفرق بين batch و stream من ناحية الدخل؟
الـ batch دخله bounded ومعروف الحجم. الـ stream مالوش نهاية.