HDInsight üzerinde Apache Hadoop için Java MapReduce programları geliştirme
Java tabanlı bir MapReduce uygulaması oluşturmak için Apache Maven'ı kullanmayı ve ardından Azure HDInsight'ta Apache Hadoop ile çalıştırmayı öğrenin.
Önkoşullar
Apache Maven, Apache'ye göre düzgün bir şekilde yüklendi . Maven, Java projeleri için bir proje derleme sistemidir.
Geliştirme ortamını yapılandırma
Bu makale için kullanılan ortam, Windows 10 çalıştıran bir bilgisayardı. Komutlar bir komut isteminde yürütüldü ve çeşitli dosyalar Not Defteri ile düzenlendi. Ortamınız için uygun şekilde değiştirin.
Bir komut isteminden aşağıdaki komutları girerek bir çalışma ortamı oluşturun:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Maven projesi oluşturma
Wordcountjava adlı bir Maven projesi oluşturmak için aşağıdaki komutu girin:
mvn archetype:generate -DgroupId=org.apache.hadoop.examples -DartifactId=wordcountjava -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Bu komut parametresi tarafından
artifactID
belirtilen ada sahip bir dizin oluşturur (bu örnekte wordcountjava .) Bu dizin aşağıdaki öğeleri içerir:-
pom.xml
- Projeyi oluşturmak için kullanılan bilgileri ve yapılandırma ayrıntılarını içeren Proje Nesne Modeli (POM ). - src\main\java\org\apache\hadoop\examples: Uygulama kodunuzu içerir.
- src\test\java\org\apache\hadoop\examples: Uygulamanız için testler içerir.
-
Oluşturulan örnek kodu kaldırın. Oluşturulan test ve uygulama dosyalarını
AppTest.java
silin veApp.java
aşağıdaki komutları girin:cd wordcountjava DEL src\main\java\org\apache\hadoop\examples\App.java DEL src\test\java\org\apache\hadoop\examples\AppTest.java
Proje Nesne Modelini Güncelleştirme
pom.xml dosyasının tam başvurusu için bkz https://maven.apache.org/pom.html. . Aşağıdaki komutu girerek açın pom.xml
:
notepad pom.xml
Bağımlılık ekleme
içinde pom.xml
bölümüne aşağıdaki metni <dependencies>
ekleyin:
<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>
Bu, belirli bir sürüme (sürüm> içinde listelenmiştir) sahip gerekli kitaplıkları (artifactId> içinde <<listelenir) tanımlar. Derleme zamanında bu bağımlılıklar varsayılan Maven deposundan indirilir. Daha fazlasını görüntülemek için Maven depo aramasını kullanabilirsiniz.
Maven'a <scope>provided</scope>
, çalışma zamanında HDInsight kümesi tarafından sağlandığı için bu bağımlılıkların uygulamayla paketlenmemesi gerektiğini söyler.
Önemli
Kullanılan sürüm, kümenizde bulunan Hadoop sürümüyle eşleşmelidir. Sürümler hakkında daha fazla bilgi için HDInsight bileşeni sürüm oluşturma belgesine bakın.
Yapı yapılandırması
Maven eklentileri, projenin derleme aşamalarını özelleştirmenize olanak sağlar. Bu bölüm eklentiler, kaynaklar ve diğer derleme yapılandırma seçeneklerini eklemek için kullanılır.
Aşağıdaki kodu dosyaya pom.xml
ekleyin ve dosyayı kaydedip kapatın. Bu metin dosyadaki etiketlerin <project>...</project>
içinde olmalıdır; örneğin, ile </project>
arasında</dependencies>
.
<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>
Bu bölümde Apache Maven Derleyici Eklentisi ve Apache Maven Shade Eklentisi yapılandırılır. Derleyici eklentisi topolojiyi derlemek için kullanılır. Gölge eklentisi, Maven tarafından oluşturulan JAR paketinde lisans yinelemesini önlemek için kullanılır. Bu eklenti, HDInsight kümesinde çalışma zamanında "yinelenen lisans dosyaları" hatasını önlemek için kullanılır. Maven-shade-plugin'in ApacheLicenseResourceTransformer
uygulamayla birlikte kullanılması hatayı önler.
Maven-shade-plugin ayrıca uygulamanın gerektirdiği tüm bağımlılıkları içeren bir uber jar dosyası üretir.
pom.xml
dosyasını kaydedin.
MapReduce uygulamasını oluşturma
Yeni bir dosya
WordCount.java
oluşturmak ve açmak için aşağıdaki komutu girin. Yeni bir dosya oluşturmak için istemde Evet'i seçin.notepad src\main\java\org\apache\hadoop\examples\WordCount.java
Ardından aşağıdaki Java kodunu kopyalayıp yeni dosyaya yapıştırın. Ardından dosyayı kapatın.
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); } }
Paket adının ve sınıf adının olduğuna
org.apache.hadoop.examples
WordCount
dikkat edin. MapReduce işini gönderirken bu adları kullanırsınız.
Uygulamayı derleme ve paketleme
Dizinden wordcountjava
, uygulamayı içeren bir JAR dosyası oluşturmak için aşağıdaki komutu kullanın:
mvn clean package
Bu komut önceki derleme yapıtlarını temizler, henüz yüklenmemiş bağımlılıkları indirir ve ardından uygulamayı derleyip paketler.
Komut tamamlandıktan wordcountjava/target
sonra dizin adlı wordcountjava-1.0-SNAPSHOT.jar
bir dosya içerir.
Not
Dosya wordcountjava-1.0-SNAPSHOT.jar
, yalnızca WordCount işini değil, aynı zamanda çalışma zamanında işin gerektirdiği bağımlılıkları da içeren bir uberjar dosyasıdır.
JAR'ı karşıya yükleme ve işleri çalıştırma (SSH)
Aşağıdaki adımlar, JAR'ı HDInsight kümesindeki Apache HBase'inizin birincil baş düğümüne kopyalamak için kullanılır scp
. Ardından ssh
komutu kümeye bağlanmak ve örneği doğrudan baş düğümde çalıştırmak için kullanılır.
Jar dosyasını kümeye yükleyin. değerini HDInsight kümenizin adıyla değiştirin
CLUSTERNAME
ve aşağıdaki komutu girin:scp target/wordcountjava-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
Kümeye bağlanın. değerini HDInsight kümenizin adıyla değiştirin
CLUSTERNAME
ve aşağıdaki komutu girin:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
SSH oturumunda aşağıdaki komutu kullanarak MapReduce uygulamasını çalıştırın:
yarn jar wordcountjava-1.0-SNAPSHOT.jar org.apache.hadoop.examples.WordCount /example/data/gutenberg/davinci.txt /example/data/wordcountout
Bu komut WordCount MapReduce uygulamasını başlatır. Giriş dosyası ,
/example/data/gutenberg/davinci.txt
çıkış dizini ise şeklindedir/example/data/wordcountout
. Hem giriş dosyası hem de çıkış, küme için varsayılan depolamada depolanır.İş tamamlandıktan sonra sonuçları görüntülemek için aşağıdaki komutu kullanın:
hdfs dfs -cat /example/data/wordcountout/*
Aşağıdaki metne benzer değerler içeren bir sözcük ve sayı listesi almalısınız:
zeal 1 zelus 1 zenith 2
Sonraki adımlar
Bu belgede Java MapReduce işi geliştirmeyi öğrendiniz. HDInsight ile çalışmanın diğer yolları için aşağıdaki belgelere bakın.