ملاحظة
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تعلم كيفية استخدام Apache Maven لإنشاء تطبيق MapReduce يستند إلى Java، وتشغيله مع Hadoop على Azure HDInsight.
المتطلبات الأساسية
Apache Mavenتم تثبيته بشكل صحيح وفقاً لـ Apache. Maven هو نظام بناء مشروع لمشاريع Java.
يكون بيئة التطوير
كانت البيئة المستخدمة لهذه المقالة هي جهاز كمبيوتر يعمل بنظام التشغيل Windows 10. تم تنفيذ الأوامر في موجّه الأوامر، وتم تحرير الملفات المختلفة باستخدام برنامج "المفكرة". قم بالتعديل وفقاً لبيئتك.
من موجه الأوامر، أدخل الأوامر أدناه لإنشاء بيئة عمل:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
إنشاء مشروع Maven
أدخل الأمر التالي لإنشاء مشروع Maven يسمى WordCountjava:
mvn archetype:generate -DgroupId=org.apache.hadoop.examples -DartifactId=wordcountjava -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
ينشئ هذا الأمر دليل باسم محدد بواسطة
artifactID
المعلمة (wordcountjava في هذا المثال.) يحتوي هذا الدليل على العناصر التالية:-
pom.xml
- نموذج عنصر المشروع الذي يحتوي على معلومات وتفاصيل التكوين المستخدمة لبناء المشروع. - src\main\java\org\apache\hadoop\أمثلة: يحتوي على رمز تطبيق خاص بك.
- src\main\java\org\apache\hadoop\أمثلة: يحتوي على اختبارت التطبيق الخاص بك.
-
إزالة التعليمات البرمجية للمثال الذي أنشئ. احذف ملفات الاختبار والتطبيق التي تم إنشاؤها
AppTest.java
، وApp.java
بإدخال الأوامر أدناه:cd wordcountjava DEL src\main\java\org\apache\hadoop\examples\App.java DEL src\test\java\org\apache\hadoop\examples\AppTest.java
قم بتحديث نموذج عنصر المشروع
للحصول على مرجع كامل لملف pom.xml، راجع https://maven.apache.org/pom.html. افتح pom.xml
بإدخال الأمر أدناه:
notepad pom.xml
إضافة تبعيات
في pom.xml
، أضف النص التالي في <dependencies>
قسم:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-examples</artifactId>
<version>2.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
<version>2.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3</version>
<scope>provided</scope>
</dependency>
هذا يعرف المكتبات المطلوبة (المدرجة ضمن <artifactId>) مع إصدار معين (المدرجة في <الإصدار>). في وقت التحويل البرمجي، تُحمل هذه التبعيات من مستودع Maven الافتراضي. يمكنك استخدام بحث مستودع Maven لعرض المزيد.
يقول <scope>provided</scope>
Maven أن هذه التبعيات لا ينبغي تعبئتها مع التطبيق، كما يتم توفيرها من قبل مجموعة HDInsight في وقت التشغيل.
هام
يجب أن يتطابق الإصدار المستخدم مع إصدار Hadoop الموجود في نظام المجموعة. لمزيد من المعلومات حول الإصدارات راجع مستند إصدار مكون HDInsight.
ضبط البنية
تسمح لك المكونات الإضافية لـ Maven بتخصيص مراحل بناء المشروع. يستخدم هذا القسم لإضافة المكونات الإضافية والموارد وخيارات تكوين الإنشاء الأخرى.
أضف التعليمات البرمجية التالية إلى ملف pom.xml
، ثم احفظ وأغلق الملف. يجب أن يكون هذا النص داخل العلامات <project>...</project>
في الملف، على سبيل المثال، بين </dependencies>
و</project>
.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
يعمل هذا القسم على تكوين المكون الإضافي المحول البرمجي لـ Apache Maven والمكون الإضافي ظل Apache Maven Shade. يتم استخدام المكون الإضافي للمترجم لتجميع الهيكل. يتم استخدام المكون الإضافي للظل لمنع تكرار الترخيص في حزمة JAR التي تم إنشاؤها بواسطة Maven. يتم استخدام هذا المكون الإضافي لمنع خطأ "ملفات الترخيص المكررة" في وقت التشغيل على مجموعة HDInsight. يؤدي استخدام maven-shade-plugin مع تنفيذ ApacheLicenseResourceTransformer
إلى منع حدوث الخطأ.
وينتج أيضًا إضافة ظل Maven uber jar التي تحتوي على جميع التبعيات المطلوبة من قبل التطبيق.
احفظ الملف pom.xml
.
إنشاء تطبيق MapReduce
أدخل الأمر أدناه لإنشاء ملف جديد وفتحه
WordCount.java
. حدد Yes عند المطالبة لإنشاء ملف جديد.notepad src\main\java\org\apache\hadoop\examples\WordCount.java
ثم انسخ والصق تعليمة Java البرمجية أدناه في الملف الجديد. ثم أغلق الملف.
package org.apache.hadoop.examples; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job = new Job(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
لاحظ اسم الحزمة
org.apache.hadoop.examples
واسم الفئة هوWordCount
. يمكنك استخدام هذه الأسماء عند إرسال وظيفة MapReduce.
إنشاء التطبيق وتعبئته
من wordcountjava
الدليل، استخدم الأمر التالي لبناء ملف JAR الذي يحتوي على التطبيق:
mvn clean package
هذا الأمر ينظف أية بناء أي قطع أثرية سابقة، بتحميل أي تبعيات التي لم تُثبت مسبقًا ومن ثم إنشاء حزمة التطبيق.
بمجرد انتهاء الأمر، wordcountjava/target
يحتوي الدليل على ملف مسمى wordcountjava-1.0-SNAPSHOT.jar
.
ملاحظة
wordcountjava-1.0-SNAPSHOT.jar
الملف هو uberjar، الذي يحتوي ليس فقط على وظيفة WordCount، لكن أيضًا التبعيات التي تتطلبها الوظيفة في وقت التشغيل.
تحميل JAR وتشغيل الوظائف (SSH)
تستخدم الخطوات التالية scp
لنسخ JAR إلى عقدة الرأس الأساسية في Apache HBase على مجموعة HDInsight. ثم يتم استخدام الأمر ssh
للاتصال بالمجموعة وتشغيل المثال مباشرة على العقدة الرئيسية.
قم بتحميل الجرة على النظام مجموعة. استبدال
CLUSTERNAME
مع اسم المجموعة HDInsight الخاص بك ثم أدخل الأمر التالي:scp target/wordcountjava-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
الاتصال بنظام المجموعة. استبدال
CLUSTERNAME
مع اسم المجموعة HDInsight الخاص بك ثم أدخل الأمر التالي:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
من جلسة عمل SSH استخدم الأمر التالي لبدء تشغيل تطبيق MapReduce:
yarn jar wordcountjava-1.0-SNAPSHOT.jar org.apache.hadoop.examples.WordCount /example/data/gutenberg/davinci.txt /example/data/wordcountout
يبدأ هذا الأمر بتطبيق WordCount MapReduce. ملف الإدخال هو
/example/data/gutenberg/davinci.txt
، ودليل إخراج هو/example/data/wordcountout
. يُخزن ملف الإدخال وأية ملفات الإخراج في وحدة التخزين الافتراضي لنظام المجموعة.بمجرد اكتمال الوظيفة، استخدم الأمر التالي لعرض المخرجات التي تم إنشاؤها:
hdfs dfs -cat /example/data/wordcountout/*
يجب أن تتلقى قائمة بعدد الكلمات والأعداد، مع قيم مشابهة للنص التالي:
zeal 1 zelus 1 zenith 2
الخطوات التالية
في هذه الوثيقة، قد تعلمت كيفية تطوير وظيفة Java MapReduce. راجع المستندات التالية للحصول على وسائل أخرى للعمل مع HDInsight.