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

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

  1. 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.
  2. Oluşturulan örnek kodu kaldırın. Oluşturulan test ve uygulama dosyalarını AppTest.javasilin ve App.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.xmlbö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

  1. Yeni bir dosya WordCount.javaoluş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
    
  2. 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.examplesWordCountdikkat 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.jarbir 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.

  1. 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:
    
  2. 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
    
  3. 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.

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