العديد من المبتدئين Hadoop ربما هم نفسه. نظرًا لعدم وجود كمية كافية من موارد الماكينة ، لا يمكنني سوى إنشاء توزيع زائف لـ Hadoop مثبت في الجهاز الظاهري. ثم أستخدم فكرة Eclipse أو Intellij في Win7 لكتابة اختبارات الكود. لذا فإن السؤال هو كيفية إرسال مهام الخريطة/تقليل الخريطة عن بُعد إلى Hadoop و Prepoint في WIN7؟
1. التحضير
1.1 في Win7 ، ابحث عن دليل وقم بإلغاء الضغط على Hadoop-2.6.0. في هذه المقالة ، d: /yangjm/code/study/hadoop/hadoop-2.6.0 (ما يلي ممثل $ hadoop_home)
1.2 إضافة العديد من متغيرات البيئة في Win7
hadoop_home = d: /yangjm/code/study/hadoop/hadoop-2.6.0
hadoop_bin_path = ٪ hadoop_home ٪/bin
hadoop_prefix = d: /yangjm/code/study/hadoop/hadoop-2.6.0
بالإضافة إلى ذلك ، يتم إلحاق متغير المسار في النهاية ؛ ٪ hadoop_home ٪/bin
2. Eclipse عن بعد تصحيح الأخطاء
1.1 قم بتنزيل البرنامج المساعد Hadoop-Eclipse-Plugin
Hadoop-Eclipse-Plugin هو مكون إضافي Hadoop يستخدم خصيصًا لـ Eclipse ، والذي يمكنه عرض محتوى الدليل والملف لـ HDFs مباشرة في بيئة IDE. يتم استضافة رمز المصدر الخاص به على Github ، وعنوان الموقع الرسمي هو https://github.com/winghc/hadoop2x-eclipse-plugin
إذا كنت مهتمًا ، فيمكنك تنزيل الكود المصدري وتجميعه بنفسك. ستأخذ Baidu الكثير من المقالات ، ولكن إذا كنت تستخدم فقط https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release٪20 ، يتم توفير الإصدارات المترجمة المختلفة هنا. فقط استخدمه مباشرة. انسخ hadoop-eclipse-plugin-2.6.0.jar إلى دليل Eclipse/Plugins ، ثم أعد تشغيل Eclipse. كل شيء تم.
1.2 قم بتنزيل حزمة المكونات الإضافية Hadoop2.6 لنظام التشغيل Windows64-Bit (Hadoop.dll ، WinUtils.exe)
تحت Hadoop-Common-Project/Hadoop-Common/SRC/Main/WinUtils في رمز المصدر Hadoop2.6.0 ، يوجد مشروع Vs.Net. يمكن لتجميع هذا المشروع الحصول على مجموعة من الملفات وملفات الإخراج.
Hadoop.dll و WinUtils.exe هي الأكثر فائدة. نسخ winUtils.exe إلى دليل $ hadoop_home/bin ، ونسخ hadoop.dll إلى دليل ٪ windir ٪/system32 (أساسا لمنع الإضافات من الإبلاغ عن أخطاء مختلفة لا يمكن تفسيرها ، مثل مراجع الكائنات الفارغة).
ملاحظة: إذا كنت لا ترغب في التجميع ، فيمكنك تنزيل الملف المترجم Hadoop2.6 (x64) v0.2.rar مباشرة
1.3 تكوين البرنامج المساعد Hadoop-Eclipse-Plugin
ابدأ Eclipse ، Windows-> عرض العرض-> آخر
Window-> تفضيلات-> خريطة Hadoop/تقليل تحديد دليل الجذر لـ Hadoop على Win7 (أي: $ hadoop_home)
ثم في لوحة المواقع الخريطة/تقليل ، انقر فوق أيقونة الطفل فيل
إضافة موقع
هذه الواجهة مهمة جدا. سأشرح عدة معلمات:
اسم الموقع مجرد اسم ، فقط اتصل به
MAP/LETER (V2) Master Host هنا هو عنوان IP المقابل لسيادة Hadoop في الجهاز الظاهري. يتوافق المنفذ أدناه مع المنفذ المحدد بواسطة سمة dfs.datanode.ipc.address في hdfs-site.xml
منفذ DFS Master: يتوافق المنفذ هنا مع المنفذ المحدد بواسطة FS.DefaultFS في core-site.xml
يجب أن يكون اسم المستخدم الأخير هو نفسه اسم المستخدم الذي يعمل Hadoop في الجهاز الظاهري. لقد قمت بتثبيت وركضت Hadoop 2.6.0 مع Hadoop ، لذا املأ Hadoop هنا. إذا قمت بتثبيته بالجذر ، قم بتغييره إلى الجذر وفقًا لذلك.
بعد تحديد هذه المعلمات ، انقر فوق "إنهاء" و "Eclipse" لمعرفة كيفية الاتصال بـ Hadoop. إذا سارت الأمور على ما يرام ، يمكنك رؤية الدلائل والملفات في HDFS في لوحة Explorer Project.
يمكنك النقر بزر الماوس الأيمن على الملف وتحديد حذف للمحاولة. عادةً ما تكون المرة الأولى غير ناجحة ، وسيكون هناك الكثير من الأشياء. الفكرة العامة هي أن هناك أذونات كافية. والسبب هو أن مستخدم تسجيل الدخول الحالي لـ Win7 ليس مستخدم Hadoop في الجهاز الظاهري. هناك العديد من الحلول. على سبيل المثال ، يمكنك إنشاء مستخدم جديد لـ Hadoop على Win7 ، ثم قم بالتبديل إلى Hadoop لتسجيل الدخول إلى Win7 ، ثم استخدام Eclipse لتطويره. ومع ذلك ، هذا أمر مزعج للغاية ، أسهل طريقة:
تمت إضافة في HDFS-site.xml
<property> <name> dfs.permissions </same> <value> false </value> </spurnal>
ثم في الجهاز الظاهري ، قم بتشغيل إجازة Hadoop Dfsadmin -safemode
لتكون آمنة ، Hadoop FS -Chmod 777 /
باختصار ، يتم إيقاف تشغيل الكشف الأمني لـ Hadoop تمامًا (ليست هناك حاجة لذلك في مرحلة التعلم ، لا تفعل ذلك عند إنتاجها رسميًا) ، وأخيراً أعد تشغيل Hadoop ، ثم انتقل إلى Eclipse ، وكرر عملية الحذف الآن فقط ، ويجب أن يكون جيدًا.
1.4 إنشاء مشروع عينة WoldCount
قم بإنشاء مشروع جديد واختيار الخريطة/خفض المشروع
فقط ضع التالي على wodcount.java ، الرمز كما يلي:
package yjmyzz ؛ import java.io.ioException ؛ import java.util.stringTokenizer ؛ import org.apache.hadoop.conf.configuration ؛ import org.apache.hadoop.fs.path org.apache.hadoop.mapreduce.mapper ؛ import org.apache.hadoop.mapreduce.reducer ؛ import org.apache.hadoop.mapreduce.lib.input.fileinputformat org.apache.hadoop.util.genericoptionsparser ؛ الفئة العامة WordCount {public static class romeizermapper يمتد mapper <object ، النص ، النص ، intwrable> {private static static intwithable واحد = جديد قابلة للمنافسة (1) ؛ كلمة نص خاصة = نص جديد () ؛ خريطة باطلة عامة (مفتاح الكائن ، قيمة النص ، سياق السياق) يلقي ioException ، interruptedException {StringTokenizer ITR = new StringTokenizer (value.toString ()) ؛ بينما (itr.hasmoretokens ()) {word.set (itr.nextToken ()) ؛ context.write (كلمة ، واحد) ؛ }}} الفئة الثابتة العامة intsumreducer يمتد المخفض <النص ، غير مقصود ، نص ، مقصود> {private confernited result = new Intwritable () ؛ الفراغ العام تقليل (مفتاح النص ، قيم <fintrable> ، سياق السياق) يلقي ioException ، interruptedException {int sum = 0 ؛ لـ (val infertwrity al: base) {sum += val.get () ؛ } result.set (sum) ؛ context.write (المفتاح ، النتيجة) ؛ }} public static void main (string [] args) يلقي الاستثناء {configuration conf = configuration () ؛ String [] otherArgs = new GenericOptionSparser (conf ، args) .getRemainingArgs () ؛ if (otherargs.length <2) {system.err.println ("use: wordCount <in> [<in> ...] <out>") ؛ System.exit (2) ؛ } 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) ؛ لـ (int i = 0 ؛ i <otherargs.length - 1 ؛ ++ i) {fileInputFormat.adDinputPath (Job ، New Path (OtherArgs [i])) ؛ } fileOutputFormat.setoutputpath (Job ، مسار جديد (OtherArgs [otherargs.length - 1])) ؛ System.exit (Job.WaitforCompletion (true)؟ 0: 1) ؛ }}ثم ضع log4j.properties ، المحتوى كما يلي: (من أجل راحة التشغيل ، تحقق من المخرجات المختلفة)
log4j.Rootlogger = معلومات ، stdout#log4j.logger.org.springframework = info#log4j.logger.org.apache.activemq = info#log4j.logger.org.apache. ActiveMq.Spring = Warn#log4j.logger.org.apache.activemq.store.journal = info#log4j.logger.org.apache.activemq.or G.Actionio.journal = infolog4j.appender.stdout = org.apache.log4j.consoleAppenderlog4j.appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.appender.stdout.layout.conversionpattern = ٪ d {aboxt} ٪ -5.5p | ٪ -16.16T | ٪ -32.32c {1} | ٪ -32.32c ٪ 4L | ٪ م ٪ نهيكل الدليل النهائي على النحو التالي:
بعد ذلك ، يمكنك تشغيله ، بالطبع لن ينجح ، لأنه لا يتم إدخال أي معلمات لـ WordCount ، راجع الشكل التالي:
1.5 تعيين معلمات العملية
لأن WordCount يجب إدخال ملف لحساب الكلمات ثم الإخراج إلى مجلد آخر ، لذلك أعط معلمتين ، راجع الشكل أعلاه ، أدخل في وسيط البرنامج
HDFS: //172.28.20.xxx: 9000/jimmy/input/readMe.txt
HDFS: //172.28.20.xxx: 9000/Jimmy/Output/
يرجى الرجوع إلى هذا لتغييره (استبدال IP بشكل أساسي بـ IP في الجهاز الظاهري). لاحظ أنه إذا لم يكن ملف الإدخال/readm.txt ، فيرجى تحميله يدويًا أولاً ، ثم/يجب/يجب أن يكون موجودًا. خلاف ذلك ، إذا تم تشغيل البرنامج حتى النهاية ووجد أن الدليل المستهدف موجود ، فسيتم الإبلاغ عن خطأ. بعد ذلك ، يمكنك تعيين نقطة توقف في الموضع المناسب ويمكنك أخيرًا تصحيحه:
3. Intellij IDEA
3.1 إنشاء مشروع Maven WordCount
ملف POM كما يلي:
<؟ XSI: schemalocation = "http://maven.apache.org/pom/4.0.0 <soph> 1.0-snapshot </version> <ependencies> <reperence> <roupiD> org.apache.hadoop </rougeid> <StifactId> hadoop-common </shintifactid> <sored> 2.6.0 </version> </spension> <StifactId> hadoop-mapreduce-client-jobclient </stifactid> <الإصدار> 2.6.0 </version> </repreadency> <reperency> <roupled> commons-cli </roucidid> <srintifactid> commons-cli </shintifactid> <NinalName> $ {project.artifactid} </finalName> </buy> </soploy>هيكل المشروع كما يلي:
انقر بزر الماوس الأيمن على المشروع -> فتح إعدادات الوحدة النمطية أو اضغط على F12 لفتح خصائص الوحدة النمطية
إضافة مراجع libary التبعية
ثم استيراد جميع الحزم المقابلة تحت $ hadoop_home
يمكن تسمية libary المستوردة ، مثل Hadoop2.6
3.2 تعيين معلمات العملية
لاحظ مكانين :
1 هي أنظمة البرامج ، والتي تشبه الكسوف ، وتحديد ملفات الإدخال ومجلدات الإخراج
2 هو دليل العمل ، أي دليل العمل ، المحدد كدليل حيث يوجد $ hadoop_home
ثم يمكنك تصحيح
الشيء الوحيد غير السعيد في ظل Intellij هو أنه لا يوجد مكون إضافي Hadoop مشابه لـ Eclipse. في كل مرة تقوم فيها بتشغيل WordCount ، يمكنك فقط حذف دليل الإخراج في سطر الأوامر ثم تصحيح الأخطاء. لحل هذه المشكلة ، يمكنك تحسين رمز WordCount وحذف دليل الإخراج قبل التشغيل ، راجع الكود التالي:
package yjmyzz ؛ import java.io.ioException ؛ import java.util.stringTokenizer ؛ import org.apache.hadoop.conf.configuration ؛ import org.apache.hadoop.fs.filesystem ؛ import org.apache.hadoop.fs.path ؛ org.apache.hadoop.mapreduce.job ؛ استيراد org.apache.hadoop.mapreduce.mapper ؛ استيراد org.apache.hadoop.mapreduce.reducer ؛ import org.apache.hadoop.mapreduce.lib.inpt.fileInputFormat ؛ impith.hadoup.mapeduped org.apache.hadoop.util.genericoptionsparser ؛ الفئة العامة WordCount {public static class romeizermapper يمتد mapper <object ، النص ، النص ، intwrable> {private static static intwithable واحد = جديد قابلة للمنافسة (1) ؛ كلمة نص خاصة = نص جديد () ؛ خريطة باطلة عامة (مفتاح الكائن ، قيمة النص ، سياق السياق) يلقي ioException ، interruptedException {StringTokenizer ITR = new StringTokenizer (value.toString ()) ؛ بينما (itr.hasmoretokens ()) {word.set (itr.nextToken ()) ؛ context.write (كلمة ، واحد) ؛ }}} الفئة الثابتة العامة intsumreducer يمتد المخفض <النص ، غير مقصود ، نص ، مقصود> {private confernited result = new Intwritable () ؛ الفراغ العام تقليل (مفتاح النص ، قيم <fintrable> ، سياق السياق) يلقي ioException ، interruptedException {int sum = 0 ؛ لـ (val infertwrity al: base) {sum += val.get () ؛ } result.set (sum) ؛ context.write (المفتاح ، النتيجة) ؛ }} / ** * حذف الدليل المحدد * * param conf * param dirpath * throws ioException * / private static void deletedir (configuration conf ، string dirpath) يلقي ioException {fileystem fs = fileystem.get (conf) ؛ Path TargetPath = مسار جديد (DirPath) ؛ if (fs.exists (targetPath)) {boolean delresult = fs.delete (targetpath ، true) ؛ إذا تم حذف (delresult) {system.out.println (TargetPath + "تم حذفه الناجح.") ؛ } آخر {system.out.println (TargetPath + "فشل الحذف.") ؛ }}} public static void main (string [] args) يلقي الاستثناء {configuration conf = configuration () ؛ String [] otherArgs = new GenericOptionSparser (conf ، args) .getRemainingArgs () ؛ if (otherargs.length <2) {system.err.println ("use: wordCount <in> [<in> ...] <out>") ؛ System.exit (2) ؛ } // حذف دليل الإخراج الأول deletedir (conf ، otherargs [otherargs.length - 1]) ؛ 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) ؛ لـ (int i = 0 ؛ i <otherargs.length - 1 ؛ ++ i) {fileInputFormat.adDinputPath (Job ، New Path (OtherArgs [i])) ؛ } fileOutputFormat.setoutputpath (Job ، مسار جديد (OtherArgs [otherargs.length - 1])) ؛ System.exit (Job.WaitforCompletion (true)؟ 0: 1) ؛ }} لكن هذا لا يكفي. عند التشغيل في بيئة IDE ، تحتاج IDE إلى معرفة مثيل HDFS الذي يجب الاتصال به (كما هو الحال في تطوير DB ، تحتاج إلى تحديد مصدر البيانات في التكوين XML) ، ونسخ الموقع الأساسي.
المحتويات كما يلي:
<؟
ما عليك سوى استبدال IP أعلاه بـ IP في الجهاز الظاهري.