سجل الحقيقة والداتا المشتقة
المكان اللي الداتا بتتكتب فيه أول مرة. لو فيه تعارض، هو الصح. غالبًا normalized.
نتيجة تحويل: 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، وده الفصل الجاي.