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

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

  1. 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 artifactIDwordcountjava). Tento adresář obsahuje následující položky:

    • pom.xmlObjektový 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.
  2. Odeberte vygenerovaný ukázkový kód. Odstraňte vygenerované testovací soubory a soubory AppTest.javaaplikací a App.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.xmlsouboru 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

  1. 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
    
  2. 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 je WordCount. 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.

  1. 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:
    
  2. 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
    
  3. 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.txta výstupní adresář je /example/data/wordcountout. Vstupní soubor i výstup se ukládají do výchozího úložiště pro cluster.

  4. 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.