Vývoj programů Java MapReduce pro Apache Hadoop ve službě HDInsight
Zjistěte, jak pomocí Apache Mavenu vytvořit aplikaci MapReduce založenou na javě a pak ji spustit pomocí Apache Hadoopu ve službě Azure HDInsight.
Požadavky
Apache Maven je správně nainstalovaný podle Apache. Maven je systém sestavení projektu pro projekty Java.
Konfigurace vývojového prostředí
Prostředím použitým v tomto článku byl počítač se systémem Windows 10. Příkazy se spustily na příkazovém řádku a různé soubory se upravovaly pomocí Poznámkového bloku. Upravte odpovídajícím způsobem pro vaše prostředí.
Zadáním následujících příkazů z příkazového řádku vytvořte pracovní prostředí:
IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI
Vytvoření projektu Maven
Zadáním následujícího příkazu vytvořte projekt Maven s názvem wordcountjava:
mvn archetype:generate -DgroupId=org.apache.hadoop.examples -DartifactId=wordcountjava -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Tento příkaz vytvoří adresář s názvem určeným parametrem (v tomto příkladu
artifactID
wordcountjava). Tento adresář obsahuje následující položky:-
pom.xml
– Objektový model projektu (POM), který obsahuje informace a podrobnosti konfigurace použité k sestavení projektu. - src\main\java\org\apache\hadoop\examples: Obsahuje kód vaší aplikace.
- src\test\java\org\apache\hadoop\examples: Obsahuje testy pro vaši aplikaci.
-
Odeberte vygenerovaný ukázkový kód. Odstraňte vygenerované testovací soubory a soubory
AppTest.java
aplikací aApp.java
zadáním následujících příkazů:cd wordcountjava DEL src\main\java\org\apache\hadoop\examples\App.java DEL src\test\java\org\apache\hadoop\examples\AppTest.java
Aktualizace objektového modelu projektu
Úplný odkaz na soubor pom.xml najdete v tématu https://maven.apache.org/pom.html. Otevřete pom.xml
zadáním následujícího příkazu:
notepad pom.xml
Přidání závislostí
V pom.xml
souboru přidejte do oddílu <dependencies>
následující text:
<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>
Tím se definují požadované knihovny (uvedené v rámci <artifactId>) s konkrétní verzí (uvedenou ve <verzi>). V době kompilace se tyto závislosti stáhnou z výchozího úložiště Maven. K zobrazení dalších informací můžete použít vyhledávání v úložišti Maven .
Sděluje <scope>provided</scope>
Mavenu, že tyto závislosti by neměly být zabalené s aplikací, protože jsou poskytovány clusterem HDInsight za běhu.
Důležité
Použitá verze by se měla shodovat s verzí Systému Hadoop, která je ve vašem clusteru. Další informace o verzích najdete v dokumentu správa verzí komponent HDInsight .
Konfigurace sestavení
Moduly plug-in Maven umožňují přizpůsobit fáze sestavení projektu. Tato část slouží k přidání modulů plug-in, prostředků a dalších možností konfigurace sestavení.
Přidejte do pom.xml
souboru následující kód a pak soubor uložte a zavřete. Tento text musí být uvnitř <project>...</project>
značek v souboru, například mezi </dependencies>
a </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>
Tato část konfiguruje modul plug-in kompilátoru Apache Maven a modul plug-in Stínování Apache Mavenu. Modul plug-in kompilátoru se používá ke kompilaci topologie. Stínovací modul plug-in se používá k zabránění duplikaci licencí v balíčku JAR vytvořeném mavenem. Tento modul plug-in se používá k zabránění chybě "duplicitních souborů licencí" za běhu v clusteru HDInsight. Použití modulu plug-in maven shade s implementací ApacheLicenseResourceTransformer
zabrání chybě.
Modul plug-in maven-shade také vytvoří soubor JAR, který obsahuje všechny závislosti vyžadované aplikací.
Uložte soubor pom.xml
.
Vytvoření aplikace MapReduce
Zadáním následujícího příkazu vytvořte a otevřete nový soubor
WordCount.java
. Po zobrazení výzvy vyberte Ano a vytvořte nový soubor.notepad src\main\java\org\apache\hadoop\examples\WordCount.java
Pak zkopírujte níže uvedený kód Java a vložte ho do nového souboru. Pak soubor zavřete.
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); } }
Všimněte si, že název balíčku je
org.apache.hadoop.examples
a název třídy jeWordCount
. Tyto názvy se používají při odesílání úlohy MapReduce.
Sestavení a zabalení aplikace
V adresáři wordcountjava
pomocí následujícího příkazu sestavte soubor JAR, který obsahuje aplikaci:
mvn clean package
Tento příkaz vyčistí všechny předchozí artefakty sestavení, stáhne všechny závislosti, které ještě nejsou nainstalované, a pak sestaví a zabalí aplikaci.
Po dokončení wordcountjava/target
příkazu bude adresář obsahovat soubor s názvem wordcountjava-1.0-SNAPSHOT.jar
.
Poznámka
Soubor wordcountjava-1.0-SNAPSHOT.jar
je uberjar, který obsahuje nejen úlohu WordCount, ale také závislosti, které úloha vyžaduje za běhu.
Nahrání souboru JAR a spuštění úloh (SSH)
Následující kroky slouží scp
ke zkopírování souboru JAR do primárního hlavního uzlu vašeho Apache HBase v clusteru HDInsight. Příkaz ssh
se pak použije k připojení ke clusteru a spuštění příkladu přímo na hlavním uzlu.
Nahrajte soubor JAR do clusteru. Nahraďte
CLUSTERNAME
názvem clusteru HDInsight a zadejte následující příkaz:scp target/wordcountjava-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
Připojte se ke clusteru. Nahraďte
CLUSTERNAME
názvem clusteru HDInsight a zadejte následující příkaz:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
V relaci SSH pomocí následujícího příkazu spusťte aplikaci MapReduce:
yarn jar wordcountjava-1.0-SNAPSHOT.jar org.apache.hadoop.examples.WordCount /example/data/gutenberg/davinci.txt /example/data/wordcountout
Tento příkaz spustí aplikaci WordCount MapReduce. Vstupní soubor je
/example/data/gutenberg/davinci.txt
a výstupní adresář je/example/data/wordcountout
. Vstupní soubor i výstup se ukládají do výchozího úložiště pro cluster.Po dokončení úlohy pomocí následujícího příkazu zobrazte výsledky:
hdfs dfs -cat /example/data/wordcountout/*
Měl by se zobrazit seznam slov a počtů s hodnotami podobnými následujícímu textu:
zeal 1 zelus 1 zenith 2
Další kroky
V tomto dokumentu jste se dozvěděli, jak vyvinout úlohu MapReduce v Javě. Další způsoby práce se službou HDInsight najdete v následujících dokumentech.