Mengembangkan program Java MapReduce untuk Apache Hadoop di HDInsight

Pelajari cara menggunakan Apache Maven untuk membuat aplikasi MapReduce berbasis Java, lalu jalankan dengan Apache Hadoop di Azure HDInsight.

Prasyarat

Mengonfigurasi lingkungan pengembangan

Lingkungan yang digunakan dalam artikel ini adalah komputer yang menjalankan Windows 10. Perintah dijalankan dalam perintah dan berbagai file diedit dengan Notepad. Mengubah sesuai lingkungan Anda.

Dari perintah, masukkan perintah berikut untuk membuat lingkungan kerja:

IF NOT EXIST C:\HDI MKDIR C:\HDI
cd C:\HDI

Membuat proyek Maven

  1. Masukkan perintah berikut untuk membuat proyek Maven bernama wordcountjava:

    mvn archetype:generate -DgroupId=org.apache.hadoop.examples -DartifactId=wordcountjava -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    

    Perintah ini membuat direktori dengan nama yang ditentukan oleh parameter artifactID (dalam contoh ini wordcountjava.) Direktori ini berisi item berikut:

    • pom.xml - Project Object Model (POM) yang berisi informasi dan detail konfigurasi yang digunakan untuk membuat proyek.
    • src\main\java\org\apache\hadoop\examples: Berisi kode aplikasi Anda.
    • src\test\java\org\apache\hadoop\examples: Berisi kode aplikasi Anda.
  2. Hapus kode contoh yang dihasilkan. Hapus file pengujian dan aplikasi yang dihasilkan AppTest.java, dan App.java dengan memasukkan perintah di bawah:

    cd wordcountjava
    DEL src\main\java\org\apache\hadoop\examples\App.java
    DEL src\test\java\org\apache\hadoop\examples\AppTest.java
    

Memperbarui Model Objek Proyek

Untuk referensi lengkap file pom.xml, lihat https://maven.apache.org/pom.html. Buka pom.xml dengan memasukkan perintah berikut:

notepad pom.xml

Menambahkan dependensi

Di pom.xml, tambahkan teks berikut di bagian <dependencies>:

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

Hal ini menentukan pustaka yang diperlukan (tercantum dalam <artifactId>) dengan versi tertentu (tercantum dalam <versi>). Pada waktu kompilasi, dependensi ini diunduh dari repositori Maven default. Anda dapat menggunakan pencarian repositori Maven untuk melihat selengkapnya.

<scope>provided</scope> memberi tahu Maven bahwa dependensi ini tidak boleh dikemas dengan aplikasi, karena disediakan oleh kluster HDInsight pada saat run-time.

Penting

Versi yang digunakan harus cocok dengan versi Hadoop yang ada di kluster Anda. Untuk informasi selengkapnya tentang versi, lihat dokumen penerapan versi komponen HDInsight.

Konfigurasi build

Plug-in Maven memungkinkan Anda menyesuaikan tahap pembangunan (build) proyek. Bagian ini digunakan untuk menambahkan plug-in, sumber daya, dan opsi konfigurasi build lainnya.

Tambahkan kode berikut ke file pom.xml, lalu simpan dan tutup file. Teks ini harus berada di dalam tag <project>...</project> di file, misalnya, antara </dependencies> dan </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>

Bagian ini mengonfigurasi Plugin Apache Maven Compiler dan Plugin Apache Maven Shade. Plug-in pengompilasi digunakan untuk mengompilasi topologi. Plug-in bayangan digunakan untuk mencegah duplikasi lisensi dalam paket JAR yang dibuat oleh Maven. Plugin ini digunakan untuk mencegah kesalahan "file lisensi duplikat" pada durasi di kluster HDInsight. Menggunakan plugin-bayangan-maven dengan implementasi ApacheLicenseResourceTransformer mencegah kesalahan.

Maven-shade-plugin juga menghasilkan uber jar yang berisi semua dependensi yang diperlukan oleh aplikasi.

Simpan file pom.xml.

Membuat aplikasi MapReduce

  1. Masukkan perintah di bawah untuk membuat dan membuka file baru WordCount.java. Pilih Ya di perintah untuk membuat file baru.

    notepad src\main\java\org\apache\hadoop\examples\WordCount.java
    
  2. Kemudian salin dan tempel kode Java di bawah ini ke file baru. Lalu tutup file.

    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);
        }
    }
    

    Perhatikan nama paket adalah org.apache.hadoop.examples nama kelas adalah WordCount. Anda menggunakan nama-nama ini saat Anda mengirim pekerjaan MapReduce.

Buat dan kemas aplikasi

Dari direktori wordcountjava, gunakan perintah berikut untuk membuat file JAR yang berisi aplikasi:

mvn clean package

Perintah ini membersihkan artefak build sebelumnya, mengunduh dependensi apa pun yang belum diinstal, lalu membuat dan mengemas aplikasi.

Setelah perintah selesai, direktori wordcountjava/target berisi file bernama wordcountjava-1.0-SNAPSHOT.jar.

Catatan

File wordcountjava-1.0-SNAPSHOT.jar adalah uberjar, yang tidak hanya berisi pekerjaan WordCount, tetapi juga dependensi yang dibutuhkan pekerjaan saat runtime.

Mengunggah JAR dan menjalankan pekerjaan (SSH)

Langkah berikut menggunakan scp untuk menyalin JAR ke headnode utama Apache HBase Anda di kluster HDInsight. Perintah ssh kemudian digunakan untuk terhubung ke kluster dan menjalankan contoh langsung pada headnode.

  1. Unggah jar ke kluster. Ganti CLUSTERNAME dengan nama kluster HDInsight, lalu masukkan perintah berikut:

    scp target/wordcountjava-1.0-SNAPSHOT.jar sshuser@CLUSTERNAME-ssh.azurehdinsight.net:
    
  2. Hubungkan ke kluster. Ganti CLUSTERNAME dengan nama kluster HDInsight, lalu masukkan perintah berikut:

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  3. Dari sesi SSH, gunakan perintah berikut untuk menjalankan aplikasi MapReduce:

    yarn jar wordcountjava-1.0-SNAPSHOT.jar org.apache.hadoop.examples.WordCount /example/data/gutenberg/davinci.txt /example/data/wordcountout
    

    Perintah ini memulai aplikasi WordCount MapReduce. File inputnya adalah /example/data/gutenberg/davinci.txt, dan direktori outputnya adalah /example/data/wordcountout. File input dan file output disimpan ke penyimpanan default untuk kluster.

  4. Setelah pekerjaan selesai, gunakan perintah berikut untuk melihat hasil:

    hdfs dfs -cat /example/data/wordcountout/*
    

    Anda harus menerima daftar kata dan jumlah, dengan nilai yang sama dengan teks berikut:

    zeal    1
    zelus   1
    zenith  2
    

Langkah berikutnya

Dalam dokumen ini, Anda telah mempelajari cara mengembangkan pekerjaan Java MapReduce. Lihat dokumen berikut untuk cara lain untuk bekerja dengan HDInsight.