Aracılığıyla paylaş


HDInsight üzerinde Apache Hadoop için Java MapReduce programları geliştirme

Java tabanlı 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, çalışma ortamı oluşturmak için aşağıdaki komutları girin:

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 referansı 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

pom.xml içinde, <dependencies> bölümüne aşağıdaki metni 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, gerekli kitaplıkları (artifactId < içinde > listelenir) ve belirli bir sürümü (version < 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> bu bağımlılıkların çalışma zamanında HDInsight kümesi tarafından sağlandığından uygulamayla birlikte paketlenmemesi gerektiğini bildirir.

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

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

Dosyaya pom.xml aşağıdaki kodu ekleyin ve dosyayı kaydedip kapatın. Bu metin dosyada, örneğin </dependencies> ve </project> arasında olduğu gibi, <project>...</project> etiketinin içinde olmalıdır.

<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 Gölge 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'i ApacheLicenseResourceTransformer uygulamasıyla kullanmak hatayı önler.

Maven-shade-plugin ayrıca uygulamanın gerektirdiği tüm bağımlılıkları içeren bir uber jar dosyası oluşturur.

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 aşağıdaki komutu kullanarak uygulamayı içeren bir JAR dosyası oluşturun:

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 sonra dizin wordcountjava/target adlı wordcountjava-1.0-SNAPSHOT.jarbir dosya içerir.

Uyarı

Dosya wordcountjava-1.0-SNAPSHOT.jar , yalnızca WordCount işini değil, aynı zamanda işin çalışma zamanında gerektirdiği bağımlılıkları da içeren bir uberjar dosyasıdır.

JAR'ı yükle ve işleri başlat (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. CLUSTERNAME değerini HDInsight kümenizin adıyla değiştirin ve ardından aşağıdaki komutu girin:

    scp target/wordcountjava-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
    
  2. Kümeye bağlanın. CLUSTERNAME etiketini kendi HDInsight kümenizin adıyla değiştirin ve ardından 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şlemi geliştirmeyi öğrendiniz. HDInsight ile çalışmanın diğer yolları için aşağıdaki belgelere bakın.