Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dowiedz się, jak za pomocą narzędzia Apache Maven utworzyć aplikację MapReduce opartą na języku Java, a następnie uruchomić ją przy użyciu platformy Apache Hadoop w usłudze Azure HDInsight.
Wymagania wstępne
Narzędzie Apache Maven poprawnie zainstalowane zgodnie z apache. Maven to system kompilacji projektu dla projektów Java.
Konfigurowanie środowiska programowania
Środowisko używane w tym artykule było komputerem z systemem Windows 10. Polecenia zostały wykonane w wierszu polecenia, a różne pliki zostały edytowane za pomocą Notatnika. Dostosuj odpowiednio do swojego środowiska.
W wierszu polecenia wprowadź poniższe polecenia, aby utworzyć środowisko robocze:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Tworzenie projektu Maven
Wprowadź następujące polecenie, aby utworzyć projekt Maven o nazwie wordcountjava:
mvn archetype:generate -DgroupId=org.apache.hadoop.examples -DartifactId=wordcountjava -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
To polecenie tworzy katalog o nazwie określonej przez
artifactID
parametr (wordcountjava w tym przykładzie). Ten katalog zawiera następujące elementy:-
pom.xml
— Model obiektów projektu (POM), który zawiera informacje i szczegóły konfiguracji używane do kompilowania projektu. - src\main\java\org\apache\hadoop\examples: Zawiera kod aplikacji.
- src\test\java\org\apache\hadoop\examples: zawiera testy dla aplikacji.
-
Usuń wygenerowany przykładowy kod. Usuń wygenerowane pliki testów i aplikacji
AppTest.java
orazApp.java
, a następnie wprowadź poniższe polecenia:cd wordcountjava DEL src\main\java\org\apache\hadoop\examples\App.java DEL src\test\java\org\apache\hadoop\examples\AppTest.java
Aktualizowanie modelu obiektów projektu
Aby uzyskać kompletne odniesienie do pliku pom.xml, zobacz https://maven.apache.org/pom.html. Otwórz plik pom.xml
, wprowadzając poniższe polecenie:
notepad pom.xml
Dodawanie zależności
W pom.xml
, dodaj następujący tekst w <dependencies>
sekcji:
<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>
Definiuje wymagane biblioteki (wymienione w <artifactId>) z określoną wersją (wymienioną w <version>). W czasie kompilacji te zależności są pobierane z domyślnego repozytorium Maven. Możesz użyć wyszukiwania repozytorium Maven, aby wyświetlić więcej.
Polecenie <scope>provided</scope>
informuje narzędzie Maven, że te zależności nie powinny być pakowane z aplikacją, ponieważ są one udostępniane przez klaster usługi HDInsight w czasie wykonywania.
Ważne
Używana wersja powinna odpowiadać wersji usługi Hadoop obecnej w klastrze. Aby uzyskać więcej informacji na temat wersji, zobacz dokument dotyczący przechowywania wersji składników usługi HDInsight .
Konfiguracja kompilacji
Wtyczki Maven umożliwiają dostosowanie etapów kompilacji projektu. Ta sekcja służy do dodawania wtyczek, zasobów i innych opcji konfiguracji kompilacji.
Dodaj następujący kod do pom.xml
pliku, a następnie zapisz i zamknij plik. Ten tekst musi znajdować się wewnątrz <project>...</project>
tagów w pliku, na przykład między </dependencies>
i </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>
Ta sekcja umożliwia skonfigurowanie wtyczki kompilatora Apache Maven i wtyczki Apache Maven Shade. Wtyczka kompilatora służy do kompilowania topologii. Wtyczka cieniowania służy do zapobiegania duplikowaniu licencji w pakiecie JAR utworzonym przez narzędzie Maven. Ta wtyczka służy do zapobiegania błędu dotyczącego zduplikowanych plików licencji podczas działania w klastrze usługi HDInsight. Użycie wtyczki maven-shade-plugin wraz z implementacją ApacheLicenseResourceTransformer
zapobiega wystąpieniu błędu.
Wtyczka "maven-shade-plugin" tworzy plik Uber JAR zawierający wszystkie zależności wymagane przez aplikację.
Zapisz plik pom.xml
.
Tworzenie aplikacji MapReduce
Wprowadź poniższe polecenie, aby utworzyć i otworzyć nowy plik
WordCount.java
. Wybierz pozycję Tak po wyświetleniu monitu, aby utworzyć nowy plik.notepad src\main\java\org\apache\hadoop\examples\WordCount.java
Następnie skopiuj i wklej poniższy kod Java do nowego pliku. Następnie zamknij plik.
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); } }
Zwróć uwagę, że nazwa pakietu to
org.apache.hadoop.examples
, a nazwa klasy toWordCount
. Te nazwy są używane podczas przesyłania zadania MapReduce.
Kompilowanie i pakowanie aplikacji
Używając następującego polecenia w katalogu wordcountjava
, zbuduj plik JAR zawierający aplikację:
mvn clean package
To polecenie czyści wszystkie poprzednie artefakty kompilacji, pobiera wszelkie zależności, które nie zostały jeszcze zainstalowane, a następnie kompiluje i pakuje aplikację.
Po zakończeniu wordcountjava/target
polecenia katalog zawiera plik o nazwie wordcountjava-1.0-SNAPSHOT.jar
.
Uwaga
Plik wordcountjava-1.0-SNAPSHOT.jar
jest uberjar, który zawiera nie tylko zadanie WordCount, ale także zależności, których zadanie wymaga w czasie wykonywania.
Przekazywanie pliku JAR i uruchamianie zadań (SSH)
Poniższe kroki umożliwiają użycie scp
do skopiowania pliku JAR do podstawowego węzła głównego Apache HBase w klastrze HDInsight. Polecenie ssh
jest następnie używane do nawiązywania połączenia z klastrem i uruchamiania przykładu bezpośrednio w węźle głównym.
Przekaż plik jar do klastra. Zastąp
CLUSTERNAME
ciąg nazwą klastra usługi HDInsight, a następnie wprowadź następujące polecenie:scp target/wordcountjava-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
Połącz się z klastrem. Zastąp
CLUSTERNAME
nazwą klastra usługi HDInsight, a następnie wprowadź polecenie:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
W sesji SSH użyj następującego polecenia, aby uruchomić aplikację MapReduce:
yarn jar wordcountjava-1.0-SNAPSHOT.jar org.apache.hadoop.examples.WordCount /example/data/gutenberg/davinci.txt /example/data/wordcountout
To polecenie uruchamia aplikację MapReduce WordCount. Plik wejściowy to
/example/data/gutenberg/davinci.txt
, a katalog wyjściowy to/example/data/wordcountout
. Zarówno plik wejściowy, jak i dane wyjściowe są przechowywane w domyślnym magazynie klastra.Po zakończeniu zadania użyj następującego polecenia, aby wyświetlić wyniki:
hdfs dfs -cat /example/data/wordcountout/*
Powinna zostać wyświetlona lista wyrazów i liczb z wartościami podobnymi do następującego tekstu:
zeal 1 zelus 1 zenith 2
Następne kroki
W tym dokumencie nauczyłeś się, jak rozwijać zadanie MapReduce w języku Java. Zapoznaj się z następującymi dokumentami, aby zapoznać się z innymi sposobami pracy z usługą HDInsight.