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
Apache Mavendipasang dengan benar menurut Apache. Maven merupakan sistem build proyek untuk proyek Java.
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
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.
-
Hapus kode contoh yang dihasilkan. Hapus file pengujian dan aplikasi yang dihasilkan
AppTest.java
, danApp.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
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
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 adalahWordCount
. 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.
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:
Hubungkan ke kluster. Ganti
CLUSTERNAME
dengan nama kluster HDInsight, lalu masukkan perintah berikut:ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
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.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.