يمكنك استخدام مثال بسيط لتوضيح ماهية MapReduce:
نريد حساب عدد المرات التي تظهر فيها كل كلمة في ملف كبير. لأن الملف كبير جدا. نقوم بتقسيم هذا الملف إلى ملفات صغيرة ثم نرتب العديد من الأشخاص للعد. هذه العملية هي "الخريطة". ثم دمج الأرقام التي يحسبها كل شخص ، وهذا "تقليل".
إذا قمت بالمثال أعلاه في MapReduce ، فأنت بحاجة إلى إنشاء مهمة مهمة ، والتي تقسم الملف إلى عدة كتل بيانات مستقلة وتوزيعه في عقد الجهاز المختلفة. ثم قم بمعالجةها بطريقة متوازية تمامًا من خلال مهام الخريطة المنتشرة في عقد مختلفة. ستقوم MapReduce بجمع خطوط الإخراج للخريطة ، ثم إرسال إخراج النتيجة لتقليل الخطوة التالية للمعالجة.
بالنسبة لعملية التنفيذ المحددة للمهمة ، ستكون هناك عملية تسمى "Jobtracker" المسؤولة عن تنسيق جميع المهام في عملية تنفيذ MapReduce. يتم استخدام العديد من عمليات TaskTracker لتشغيل مهام خريطة منفصلة والإبلاغ عن تنفيذ المهمة إلى Jobtracker في أي وقت. إذا أبلغت TaskTracker عن مهمة أو فشل في الإبلاغ عن مهمتها الخاصة لفترة طويلة ، فسيبدأ Jobtracker TaskTracker آخر لإعادة تنفيذ مهمة خريطة منفصلة.
(1) قم بإنشاء مشروع Maven ذي صلة تحت Eclipse ، بالاعتماد على حزمة JAR على النحو التالي (يمكنك أيضًا الرجوع إلى تكوين POM لمشروع Hadoop-Mapreduce-Examples ضمن حزمة رمز مصدر Hadoop)
ملاحظة: لتكوين مكون مافن مافن-جار-بلوجين وحدد mainclass
<Rependencies> <Rependency> <roupiD> junit </rougiD> <StifactId> Junit </stifactid> <sored> 4.11 </version> </sependency> <reperency> <roupiD> org.apache.hadoop </rougiD> <StifactId> hadoop-mapreduce-core-core </artifactid> <roughId> org.apache.hadoop </rougiD> <StifactId> hadoop-common </suntifactid> <الإصدار> 2.5.2 </version> </respensive> </enependencies> <build> <clupins> <clupin> <roupiD> org.apache.maven.plugins </rougeid> <Archive> <Mansest> <MainClass> com.xxx.demo.hadoop.wordcount.wordcount </mainclass> </mansest> </harchive> </ispicturation> </plugin> </plugins> </build>
(2) وفقًا لآلية تشغيل MapReduce ، يجب أن تكتب الوظيفة ثلاثة فصول على الأقل لإكمال الأشياء الثلاثة: MAP Logic ، وتقليل المنطق ، وجدولة الوظائف.
يمكن أن يرث رمز الخريطة org.apache.hadoop.mapreduce.mapper فئة
يمتد TokenizerMapper من الفئة الثابتة العامة mapper <كائن ، نص ، نص ، مقصود>} كلمة نص خاصة = نص جديد () ؛ // بما أن هذا المثال لا يستخدم المعلمة الرئيسية ، يتم تحديد نوع المفتاح ببساطة ككائن خريطة باطلة عامة (مفتاح الكائن ، قيمة النص ، سياق السياق) يلقي ioException ، InterruptedException {StringTokenizer ITR = new StringTokenizer (value.toString ()) ؛ بينما (itr.hasmoretokens ()) {word.set (itr.nextToken ()) ؛ context.write (كلمة ، واحد) ؛ }}}يمكن أن يرث رمز التخفيض org.apache.hadoop.mapreduce.reducer فئة
الطبقة العامة intsumreducer يمتد المخفض <النص ، والمنصوص ، والنص ، والمنافسة> {private confulable result = new Intwritable () ؛ الفراغ العام تقليل (مفتاح النص ، قيم <fintrable> ، سياق السياق) يلقي ioException ، interruptedException {int sum = 0 ؛ لـ (val infertwrity al: base) {sum += val.get () ؛ } result.set (sum) ؛ context.write (المفتاح ، النتيجة) ؛ }}اكتب الطريقة الرئيسية لجدولة الوظائف
static static void main (string [] args) يلقي الاستثناء {configuration conf = configuration () ؛ Job Job = Job.getInstance (conf ، "عدد الكلمات") ؛ Job.setJarByClass (WordCount.Class) ؛ Job.setMapperClass (tokenizermapper.class) ؛ job.setCombinerClass (intsumreducer.class) ؛ Job.SetReducerClass (intsumreducer.class) ؛ Job.SetOutputKeyClass (text.class) ؛ job.setOutputValueClass (confulable.class) ؛ FileInputFormat.adDinputPath (Job ، مسار جديد (args [0])) ؛ fileOutputFormat.setoutputpath (Job ، مسار جديد (args [1])) ؛ Job.WaitforCompletion (true) ؛ //system.exit(job.waitforCompletion(true)؟ 0: 1) ؛ }قم بتنفيذ تثبيت MVN لكتابة المشروع في ملف JAR وتحميله على بيئة Linux Cluster. استخدم الأمر HDFS DFS -MKDIR لإنشاء الأمر المقابل في نظام ملف HDFS. استخدم HDFS DFS -PUT لتحميل ملفات البيانات التي تحتاج إلى معالجتها إلى نظام HDFS. مثال: HDFS DFS -PUT $ {Linux_Path/Data File} $ {HDFS_PATH}
قم بتنفيذ الأمر في بيئة الكتلة: Hadoop jar $ {linux_path}/wordcount.jar $ {hdfs_input_path} $ {hdfs_output_path}
HDFS DFS -CAT $ {HDFS_OUTPUT_PATH}/اسم ملف الإخراج
يتم تشغيل الطريقة أعلاه في الوضع المحلي عندما لا يتم تشغيل بيئة كتلة Hadoop. في هذا الوقت ، لا يعمل HDFs ولا غزل. ما يلي هو العمل الذي تحتاج إلى القيام به عند تنفيذ وظيفة MapReduce في الوضع الموزع الزائفة. أولاً ، اقتصر الخطوات المدرجة على الموقع الرسمي:
تكوين اسم المضيف
# vi /etc/sysconfig/network
على سبيل المثال:
الشبكات = yeshostname = mastervi /etc /hosts
املأ المحتوى التالي
127.0.0.1 localhost
تكوين SSH بدون كلمة مرور التواصل
ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
قم بتكوين ملف core-site.xml (الموجود على $ {hadoop_home}/etc/hadoop/
<iscturation> <property> <ame> fs.defaultfs </same> <value> hdfs: // localhost: 9000 </value> </spleneration> </ispult>
تكوين ملف hdfs-.xml
<iscturation> <property> <name> dfs.replication </mame> <value> 1 </value> </surrent> </configuration>
يمكن للأمر التالي تشغيل وظيفة MapReduce في وضع التوزيع الزائف المستقل
1.Format نظام الملفات:
$ bin/hdfs namenode -format
2. بدء تشغيل Namenode Daemon و Datanode Daemon:
$ SBIN/Start-DFS.SH
3. يتم كتابة إخراج سجل الخفي Hadoop إلى دليل $ hadoop_log_dir (الافتراضيات إلى $ hadoop_home/logs).4.Browse واجهة الويب لـ namenode ؛ بشكل افتراضي ، يتوفر على:
namenode - http: // localhost: 50070/
اجعل أدلة HDFS مطلوبة لتنفيذ وظائف MapReduce:
$ bin /hdfs dfs -mkdir /user
$ bin/HDFS DFS -MKDIR/user/<username>
5. قم بتوصيل ملفات الإدخال في نظام الملفات الموزع:
$ bin/hdfs dfs -put etc/hadoop
6. قم ببعض الأمثلة المقدمة:
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar grep output 'dfs [az.]+'
7.Examine ملفات الإخراج:
انسخ ملفات الإخراج من نظام الملفات الموزع إلى نظام الملفات المحلي وفحصها:$ bin/hdfs dfs -get الإخراج
$ cat output/*
أوعرض ملفات الإخراج على نظام الملفات الموزع:
$ bin/HDFS DFS -CAT Output/*
8. عندما تنتهي ، توقف عن الشياطين مع:
$ sbin/stop-dfs.sh
ما سبق هو المحتوى الكامل لرمز مثيل WordCount في هذه المقالة ، آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!