Hadoop MapReduce الانضمام والمكافحة مع المثال

⚡ ملخص ذكي

تجمع عمليات الربط في MapReduce مجموعتين كبيرتين من البيانات على مفتاح مشترك، إما داخل المابير أو داخل المخفض، بينما تجمع عدادات MapReduce إحصائيات حول المهمة بحيث يمكن قياس السجلات السيئة بدلاً من تخمينها.

  • 🔘 أساسيات الانضمام: يتم توزيع مجموعة البيانات الأصغر من بين المجموعتين على كل عقدة بيانات واستخدامها كجانب بحث.
  • ☑️ الربط من جانب الخريطة: يتطلب ذلك تقسيم كل مدخل، وتقسيمه بالتساوي، وفرزه حسب مفتاح الربط قبل تشغيل وظيفة الخريطة.
  • ✅ وصلة من جانب التخفيض: لا يحتاج إلى تقسيم، لأن كل مجموعة تشترك في مفتاح الربط تقع في نفس المُختزل.
  • 🧪 مثال عملي: يتم نسخ ملفي DeptName.txt و DeptStrength.txt إلى نظام ملفات HDFS وربطهما على Dept_ID بواسطة ملف jar مُجمّع.
  • 🛠️ أنواع العدادات: تأتي كل مهمة مزودة بخمس مجموعات عدادات مدمجة، ويتم تعريف العدادات التي يحددها المستخدم على النحو التالي: Java enum.
  • ⚠️ الاستخدام المضاد: يؤدي زيادة عداد على كل سجل مفقود أو غير صالح إلى تحويل مشاكل جودة البيانات إلى رقم في تقرير المهمة.

شرحٌ عمليٌّ لعملية الربط والعدّ في Hadoop MapReduce مع مثالٍ تطبيقيّ.

ما هو الربط (Join) في MapReduce؟

تُستخدم عملية الربط في MapReduce لدمج مجموعتي بيانات كبيرتين. مع ذلك، تتطلب هذه العملية كتابة الكثير من التعليمات البرمجية لتنفيذ عملية الربط الفعلية. يبدأ ربط مجموعتي البيانات بمقارنة حجم كل منهما. إذا كانت إحدى المجموعتين أصغر من الأخرى، تُوزّع المجموعة الأصغر على جميع عُقد البيانات في المجموعة.

بمجرد الانضمام مابريديوس في حالة التوزيع، يستخدم كل من Mapper أو Reducer مجموعة البيانات الأصغر لإجراء بحث عن السجلات المطابقة من مجموعة البيانات الكبيرة ثم يجمع تلك السجلات لتشكيل سجلات الإخراج.

أنواع الانضمام

اعتمادًا على المكان الذي يتم فيه إجراء الربط الفعلي، يتم تصنيف عمليات الربط في Hadoop إلى نوعين.

  1. الانضمام من جانب الخريطة عندما تُجرى عملية الربط بواسطة دالة الخريطة، تُسمى هذه العملية ربطًا من جانب الخريطة. في هذا النوع، يُجرى الربط قبل أن تستهلك دالة الخريطة البيانات فعليًا. من الضروري أن يكون مُدخل كل خريطة على شكل قسم وأن يكون مُرتبًا. كما يجب أن يكون عدد الأقسام متساويًا وأن تكون مُرتبة حسب مفتاح الربط.
  2. وصلة جانبية مخفضة عندما يُجري المُختزِل عملية الربط، يُطلق عليها اسم الربط من جانب المُختزِل. لا يشترط في هذا النوع من الربط وجود مجموعة بيانات مُهيكلة (أو مُقسّمة). هنا، تُصدر معالجة جانب الخريطة مفتاح الربط والصفوف المُقابلة من كلا الجدولين. ونتيجةً لهذه المعالجة، تقع جميع الصفوف التي تحمل مفتاح الربط نفسه في نفس المُختزِل، الذي يقوم بدوره بربط السجلات التي تحمل مفتاح الربط نفسه.

يتم توضيح التدفق الشامل للعملية للصلات في Hadoop في الرسم البياني أدناه.

مخطط تدفق العمليات الذي يقارن بين عملية الربط من جانب الخريطة وعملية الربط من جانب الاختزال في هادوب
أنواع الصلات في Hadoop MapReduce

بعد توضيح المتغيرين، يشرح القسم التالي عملية دمج جانب الاختزال على ملفين صغيرين تابعين لقسمين.

كيفية الانضمام إلى مجموعتي بيانات: مثال MapReduce

يوجد مجموعتان من البيانات في ملفين مختلفين (كما هو موضح أدناه). المفتاح Dept_ID مشترك بين الملفين. الهدف هو استخدام MapReduce Join لدمج هذين الملفين.

ملف الإدخال الأول الذي يحتوي على معرفات الأقسام إلى جانب أسماء الأقسام

ملف 1
ملف إدخال ثانٍ يسرد معرفات الأقسام إلى جانب قيم قوة كل قسم

ملف 2

الإدخال: مجموعة بيانات الإدخال عبارة عن ملف نصي، DeptName.txt و DeptStrength.txt

تحميل ملفات الإدخال من هنا

تأكد لديك Hadoop تم التثبيت. قبل البدء في عملية MapReduce Join الفعلية، قم بتغيير المستخدم إلى 'hduser' (المعرف المستخدم أثناء تكوين Hadoop، يمكنك التبديل إلى معرف المستخدم المستخدم أثناء تكوين Hadoop الخاص بك).

su - hduser_

تتغير التعليمات إلى حساب Hadoop، كما هو موضح أدناه.

بعد التبديل إلى حساب المستخدم hduser باستخدام الأمر su، يتم فتح الطرفية

الخطوة 1) انسخ الملف المضغوط إلى الموقع الذي تختاره

تم تنزيل ملف MapReduceJoin ووضعه في دليل العمل المحدد.

الخطوة 2) قم بفك ضغط الملف المضغوط

sudo tar -xvf MapReduceJoin.tar.gz

السابقtracتظهر أسماء ملفات ted بشكل متتابع أثناء قيام برنامج tar بفك ضغط الأرشيف.

عرض قائمة الملفات في وحدة التحكم (مثال)tracted من MapReduceJoin.tar.gz

الخطوة 3) انتقل إلى الدليل MapReduceJoin/

cd MapReduceJoin/

موجه الأوامر بعد الانتقال إلى دليل MapReduceJoin

الخطوة 4) ابدأ هادوب

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

كلا النصين البرمجيين يطبعان البرامج الخفية التي يقومان بتشغيلها.

رسائل بدء التشغيل من برامج HDFS و YARN

الخطوة 5) DeptStrength.txt وDeptName.txt هما ملفا الإدخال المستخدمان لبرنامج مثال MapReduce Join هذا.

يجب نسخ هذه الملفات إلى HDFS باستخدام الأمر التالي-

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /

تم نسخ كلا ملفي النص المدخلين إلى الدليل الجذر لنظام ملفات HDFS

الخطوة 6) قم بتشغيل البرنامج باستخدام الأمر أدناه-

$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin

يتم عرض الأمر أولاً، ثم يقوم البرنامج بالإبلاغ عن تقدمه على وحدة التحكم.

تشغيل ملف MapReduceJoin jar المعبأ عبر سطر الأوامر

إخراج وحدة التحكم tracملك تقدم وظيفة الانضمام إلى MapReduce

الخطوة 7) بعد التنفيذ، سيتم تخزين ملف الإخراج (المسمى 'part-00000') في الدليل /output_mapreducejoin على نظام ملفات Hadoop الموزع (HDFS).

ويمكن رؤية النتائج باستخدام واجهة سطر الأوامر

$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000

تم دمج سجلات القسم المطبوعة من نظام ملفات Hadoop الموزع (HDFS) باستخدام أمر cat.

يمكن أيضًا رؤية النتائج عبر واجهة الويب كما يلي:

صفحة واجهة الويب الخاصة بـ Hadoop تُستخدم للوصول إلى متصفح نظام الملفات

الآن حدد "استعراض نظام الملفات" وانتقل إلى /output_mapreducejoin

تصفح عرض نظام ملفات HDFS إلى دليل output_mapreducejoin

افتح الجزء-ر-00000

تحديد ملف الإخراج part-r-00000 داخل عرض المتصفح

يتم عرض النتائج

تم عرض صفوف اسم القسم المدمج وقوة القسم في المتصفح

NOTE: يرجى ملاحظة أنه قبل تشغيل هذا البرنامج للمرة القادمة، سوف تحتاج إلى حذف دليل الإخراج /output_mapreducejoin

$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin

البديل هو استخدام اسم مختلف لدليل الإخراج.

توضح لك عمليات الربط شكل البيانات. أما العدادات، التي سنتناولها لاحقاً، فتوضح لك كيفية عمل المهمة التي أنتجتها.

ما هو العداد في MapReduce؟

العداد في MapReduce هو آلية تُستخدم لجمع وقياس المعلومات الإحصائية حول مهام وأحداث MapReduce. يحتفظ العداد بـ tracتُستخدم عدادات البيانات في MapReduce لتشخيص المشكلات، مثل عدد العمليات التي تمت وتقدمها.

تشبه عدادات Hadoop وضع رسالة سجل في كود الخريطة أو تقليلها. قد تكون هذه المعلومات مفيدة لتشخيص مشكلة في معالجة مهمة MapReduce.

عادةً، تُعرَّف هذه العدادات في هادوب ضمن برنامج (خريطة أو اختزال) ويتم زيادتها أثناء التنفيذ عند حدوث حدث أو شرط معين (خاص بهذا العداد). ومن التطبيقات الجيدة جدًا لعدادات هادوب ما يلي: track من السجلات الصالحة وغير الصالحة من مجموعة بيانات الإدخال.

أنواع عدادات MapReduce

يوجد نوعان أساسيان من عدادات MapReduce

  1. عدادات هادوب المدمجة: هناك بعض عدادات Hadoop المضمنة والتي توجد لكل وظيفة. فيما يلي مجموعات العداد المضمنة-
    • MapReduce عدادات المهام — يقوم بجمع معلومات خاصة بالمهمة (مثل عدد سجلات الإدخال) أثناء وقت تنفيذها.
    • عدادات نظام الملفات — يجمع معلومات مثل عدد البايتات التي تمت قراءتها أو كتابتها بواسطة مهمة ما.
    • عدادات FileInputFormat — يجمع معلومات عن عدد من البايتات المقروءة من خلال FileInputFormat.
    • عدادات FileOutputFormat — يجمع معلومات عن عدد من البايتات المكتوبة من خلال FileOutputFormat.
    • مكاتب التوظيف — تسجل هذه العدادات إحصائيات على مستوى الوظيفة مثل عدد المهام التي تم إطلاقها لوظيفة معينة.
  2. عدادات مُعرّفة من قِبل المستخدم: بالإضافة إلى العدادات المدمجة، يمكن للمستخدم تعريف عداداته الخاصة باستخدام وظائف مماثلة توفرها لغات البرمجة. على سبيل المثال، في Java، يتم استخدام "العدد" لتعريف العدادات التي يحددها المستخدم.

💡 ملاحظة حول الإصدار: تم الاحتفاظ بعدادات الوظائف بواسطة قسم الوظائفTracker تحت MRv1. في YARN ينتمي هذا الدور إلى MapReduce ApplicationMaster، لذلك تبقى أسماء العدادات ولكن المكون الذي يبلغ عنها قد تغير.

لا يمكن للوظيفة أن تعلن عن عدد غير محدود من العدادات. mapreduce.job.counters.max يحدد الإعداد الحد الأقصى الإجمالي لكل مهمة عند 120 افتراضيًا، وتفشل المهمة التي تُعلن عن عدد أكبر من ذلك. LimitExceededExceptionلذا فإن العدادات مخصصة لعدد قليل من الإشارات المجمعة بدلاً من الإحصاءات لكل مفتاح.

مثال العدادات

مثال على فئة الخريطة (MapClass) مع عدادات لحساب عدد القيم المفقودة وغير الصالحة. ملف بيانات الإدخال المستخدم في هذا البرنامج التعليمي هو ملف CSV باسم SalesJan2009.csv.

public static class MapClass
            extends MapReduceBase
            implements Mapper<LongWritable, Text, Text, Text>
{
    static enum SalesCounters { MISSING, INVALID };
    public void map ( LongWritable key, Text value,
                 OutputCollector<Text, Text> output,
                 Reporter reporter) throws IOException
    {
        
        //Input string is split using ',' and stored in 'fields' array
        String fields[] = value.toString().split(",", -20);
        //Value at 4th index is country. It is stored in 'country' variable
        String country = fields[4];
        
        //Value at 8th index is sales data. It is stored in 'sales' variable
        String sales = fields[8];
      
        if (country.length() == 0) {
            reporter.incrCounter(SalesCounters.MISSING, 1);
        } else if (sales.startsWith("\"")) {
            reporter.incrCounter(SalesCounters.INVALID, 1);
        } else {
            output.collect(new Text(country), new Text(sales + ",1"));
        }
    }
}

يُظهر مقتطف الشفرة أعلاه مثالاً على تطبيق العدادات في Hadoop MapReduce.

هنا، عدادات المبيعات هو عداد مُعرَّف باستخدام 'التعداد'. يتم استخدامه لحساب سجلات الإدخال المفقودة وغير الصالحة.

في مقتطف الشفرة، إذا 'البلدإذا كان طول الحقل صفرًا، فإن قيمته تكون مفقودة، وبالتالي يتم زيادة العداد المقابل SalesCounters.MISSING.

ثم، إذاالأملاحإذا بدأ الحقل بعلامة "، فإن السجل يُعتبر غير صالح. ويُشار إلى ذلك بزيادة عداد SalesCounters.INVALID.

💡 ملاحظة حول واجهة برمجة التطبيقات (API): يستخدم المقتطف أعلاه النص الأصلي org.apache.hadoop.mapred واجهة برمجة التطبيقات (API)، حيث MapReduceBaseأطلقت حملة Mapper جهة تعامل، OutputCollector و Reporter تظهر بشكل منفصل. الكود الحالي مكتوب مقابل org.apache.hadoop.mapreduce، حيث واحد Context يستبدل الجامع والمُبلِّغ، ويتم زيادة العداد مع context.getCounter(SalesCounters.MISSING).increment(1)مفهوم العداد متطابق في كليهما.

الأسئلة الشائعة

اختر صيغة المُوزِّع (mapper) عندما يكون أحد الجانبين صغيرًا بما يكفي ليتم تخزينه في الذاكرة على كل عقدة، لأنه يتجاوز عملية التوزيع (shuffle) تمامًا. اختر صيغة المُختزل (reducer) عندما يكون كلا الجانبين كبيرين أو غير مُرتبين، وتقبَّل تكلفة الشبكة الإضافية.

تتعلم النماذج من سجلات العمليات السابقة للتنبؤ بوقت التشغيل، وتوصي بأحجام التقسيم وعدد وحدات الاختزال، وتكتشف الانحرافات من قيم العدادات. كما أنها تُشير إلى العمليات التي تنحرف عدادات السجلات المفقودة أو المهام الفاشلة فيها عن النطاق الطبيعي لتلك السلسلة.

يُنتج Copilot هياكل برمجية معقولة للدالة mapper والدالة reducer، ولكنه يخلط بشكل عشوائي بين حزمة mapred القديمة وحزمة mapreduce الأحدث في فئة واحدة، مما سيؤدي إلى عدم إمكانية تجميع البرنامج. لذا، يُرجى إصلاح عمليات الاستيراد وتوقيعات الدوال قبل الاعتماد على هذا المنطق.

هي الآلية التي تُرسل الملف الأصغر إلى كل عقدة قبل بدء المهام. ثم يقوم كل مُعالج بتحميل تلك النسخة في خريطة تجزئة ويبحث عن التطابقات محليًا، وهو ما يجعل عملية الربط من جانب المُعالج ممكنة.

يتم طباعتها في ملخص وحدة التحكم عند اكتمال المهمة، وعرضها في سجل المهمة وصفحات الويب الخاصة بمدير الموارد، ويمكن قراءتها برمجيًا من كائن المهمة، بحيث يمكن لبرنامج التشغيل التحقق منها وإيقاف التشغيل السيئ.

كائن سياق واحد. يحمل هذا الكائن العمل الذي كان يقوم به كل من OutputCollector و Reporter لتقسيمه بينهما، لذلك تتم كتابة المخرجات وزيادة العدادات من خلال نفس المقبض الذي تم تمريره إلى دالة map.

بالنسبة لمعظم أعمال إعداد التقارير، لا. أ انضمام HiveQL يمكن اختصارها إلى نفس نمط الخلط والدمج في بضعة أسطر. تُعدّ المهام المكتوبة يدويًا مجدية عندما لا يتوافق منطق الدمج مع شرط SQL.

يرفض هادوب الكتابة في مجلد إخراج موجود مسبقًا، مما يحمي النتائج النهائية من الكتابة فوقها. احذف المجلد بشكل متكرر أولًا، أو مرر مسار إخراج مختلفًا في التشغيل التالي.

تلخيص هذه التدوينة بـ: