Hadoop MapReduce الانضمام والمكافحة مع المثال
⚡ ملخص ذكي
تجمع عمليات الربط في MapReduce مجموعتين كبيرتين من البيانات على مفتاح مشترك، إما داخل المابير أو داخل المخفض، بينما تجمع عدادات MapReduce إحصائيات حول المهمة بحيث يمكن قياس السجلات السيئة بدلاً من تخمينها.
ما هو الربط (Join) في MapReduce؟
تُستخدم عملية الربط في MapReduce لدمج مجموعتي بيانات كبيرتين. مع ذلك، تتطلب هذه العملية كتابة الكثير من التعليمات البرمجية لتنفيذ عملية الربط الفعلية. يبدأ ربط مجموعتي البيانات بمقارنة حجم كل منهما. إذا كانت إحدى المجموعتين أصغر من الأخرى، تُوزّع المجموعة الأصغر على جميع عُقد البيانات في المجموعة.
بمجرد الانضمام مابريديوس في حالة التوزيع، يستخدم كل من Mapper أو Reducer مجموعة البيانات الأصغر لإجراء بحث عن السجلات المطابقة من مجموعة البيانات الكبيرة ثم يجمع تلك السجلات لتشكيل سجلات الإخراج.
أنواع الانضمام
اعتمادًا على المكان الذي يتم فيه إجراء الربط الفعلي، يتم تصنيف عمليات الربط في Hadoop إلى نوعين.
- الانضمام من جانب الخريطة عندما تُجرى عملية الربط بواسطة دالة الخريطة، تُسمى هذه العملية ربطًا من جانب الخريطة. في هذا النوع، يُجرى الربط قبل أن تستهلك دالة الخريطة البيانات فعليًا. من الضروري أن يكون مُدخل كل خريطة على شكل قسم وأن يكون مُرتبًا. كما يجب أن يكون عدد الأقسام متساويًا وأن تكون مُرتبة حسب مفتاح الربط.
- وصلة جانبية مخفضة عندما يُجري المُختزِل عملية الربط، يُطلق عليها اسم الربط من جانب المُختزِل. لا يشترط في هذا النوع من الربط وجود مجموعة بيانات مُهيكلة (أو مُقسّمة). هنا، تُصدر معالجة جانب الخريطة مفتاح الربط والصفوف المُقابلة من كلا الجدولين. ونتيجةً لهذه المعالجة، تقع جميع الصفوف التي تحمل مفتاح الربط نفسه في نفس المُختزِل، الذي يقوم بدوره بربط السجلات التي تحمل مفتاح الربط نفسه.
يتم توضيح التدفق الشامل للعملية للصلات في Hadoop في الرسم البياني أدناه.

بعد توضيح المتغيرين، يشرح القسم التالي عملية دمج جانب الاختزال على ملفين صغيرين تابعين لقسمين.
كيفية الانضمام إلى مجموعتي بيانات: مثال MapReduce
يوجد مجموعتان من البيانات في ملفين مختلفين (كما هو موضح أدناه). المفتاح Dept_ID مشترك بين الملفين. الهدف هو استخدام MapReduce Join لدمج هذين الملفين.
الإدخال: مجموعة بيانات الإدخال عبارة عن ملف نصي، DeptName.txt و DeptStrength.txt
تأكد لديك Hadoop تم التثبيت. قبل البدء في عملية MapReduce Join الفعلية، قم بتغيير المستخدم إلى 'hduser' (المعرف المستخدم أثناء تكوين Hadoop، يمكنك التبديل إلى معرف المستخدم المستخدم أثناء تكوين Hadoop الخاص بك).
su - hduser_
تتغير التعليمات إلى حساب Hadoop، كما هو موضح أدناه.
الخطوة 1) انسخ الملف المضغوط إلى الموقع الذي تختاره
الخطوة 2) قم بفك ضغط الملف المضغوط
sudo tar -xvf MapReduceJoin.tar.gz
السابقtracتظهر أسماء ملفات ted بشكل متتابع أثناء قيام برنامج tar بفك ضغط الأرشيف.
الخطوة 3) انتقل إلى الدليل MapReduceJoin/
cd MapReduceJoin/
الخطوة 4) ابدأ هادوب
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
كلا النصين البرمجيين يطبعان البرامج الخفية التي يقومان بتشغيلها.
الخطوة 5) DeptStrength.txt وDeptName.txt هما ملفا الإدخال المستخدمان لبرنامج مثال MapReduce Join هذا.
يجب نسخ هذه الملفات إلى HDFS باستخدام الأمر التالي-
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
الخطوة 6) قم بتشغيل البرنامج باستخدام الأمر أدناه-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
يتم عرض الأمر أولاً، ثم يقوم البرنامج بالإبلاغ عن تقدمه على وحدة التحكم.
الخطوة 7) بعد التنفيذ، سيتم تخزين ملف الإخراج (المسمى 'part-00000') في الدليل /output_mapreducejoin على نظام ملفات Hadoop الموزع (HDFS).
ويمكن رؤية النتائج باستخدام واجهة سطر الأوامر
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
يمكن أيضًا رؤية النتائج عبر واجهة الويب كما يلي:
الآن حدد "استعراض نظام الملفات" وانتقل إلى /output_mapreducejoin
افتح الجزء-ر-00000
يتم عرض النتائج
NOTE: يرجى ملاحظة أنه قبل تشغيل هذا البرنامج للمرة القادمة، سوف تحتاج إلى حذف دليل الإخراج /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
البديل هو استخدام اسم مختلف لدليل الإخراج.
توضح لك عمليات الربط شكل البيانات. أما العدادات، التي سنتناولها لاحقاً، فتوضح لك كيفية عمل المهمة التي أنتجتها.
ما هو العداد في MapReduce؟
العداد في MapReduce هو آلية تُستخدم لجمع وقياس المعلومات الإحصائية حول مهام وأحداث MapReduce. يحتفظ العداد بـ tracتُستخدم عدادات البيانات في MapReduce لتشخيص المشكلات، مثل عدد العمليات التي تمت وتقدمها.
تشبه عدادات Hadoop وضع رسالة سجل في كود الخريطة أو تقليلها. قد تكون هذه المعلومات مفيدة لتشخيص مشكلة في معالجة مهمة MapReduce.
عادةً، تُعرَّف هذه العدادات في هادوب ضمن برنامج (خريطة أو اختزال) ويتم زيادتها أثناء التنفيذ عند حدوث حدث أو شرط معين (خاص بهذا العداد). ومن التطبيقات الجيدة جدًا لعدادات هادوب ما يلي: track من السجلات الصالحة وغير الصالحة من مجموعة بيانات الإدخال.
أنواع عدادات MapReduce
يوجد نوعان أساسيان من عدادات MapReduce
- عدادات هادوب المدمجة: هناك بعض عدادات Hadoop المضمنة والتي توجد لكل وظيفة. فيما يلي مجموعات العداد المضمنة-
- MapReduce عدادات المهام — يقوم بجمع معلومات خاصة بالمهمة (مثل عدد سجلات الإدخال) أثناء وقت تنفيذها.
- عدادات نظام الملفات — يجمع معلومات مثل عدد البايتات التي تمت قراءتها أو كتابتها بواسطة مهمة ما.
- عدادات FileInputFormat — يجمع معلومات عن عدد من البايتات المقروءة من خلال FileInputFormat.
- عدادات FileOutputFormat — يجمع معلومات عن عدد من البايتات المكتوبة من خلال FileOutputFormat.
- مكاتب التوظيف — تسجل هذه العدادات إحصائيات على مستوى الوظيفة مثل عدد المهام التي تم إطلاقها لوظيفة معينة.
- عدادات مُعرّفة من قِبل المستخدم: بالإضافة إلى العدادات المدمجة، يمكن للمستخدم تعريف عداداته الخاصة باستخدام وظائف مماثلة توفرها لغات البرمجة. على سبيل المثال، في 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)مفهوم العداد متطابق في كليهما.











