Menjalankan Aplikasi Hadoop MapReduce dengan Eclipse Java SE

TUTORIAL INI SUDAH DIPERBAHARUI DI "Membuat dan Menjalankan Aplikasi Hadoop MapReduce dengan Intellij IDEA pada OS Windows"

Untuk menjalankan suatu aplikasi MapReduce pada Hadoop, kita mesti membuat file jar (namaAplikasi.jar) dari aplikasi tersebut. Sudah tentu source code dari aplikasi yang akan kita jalankan itu harus di compile dulu, class file hasil compilasi itulah yang dikompres dalam satu jar file.

Bila aplikasi yang kita jalankan masih dalam tahap pengembangan/percobaan, tentu akan cukup merepotkan jika harus membuat jar file tiap kali aplikasi tersebut akan dijalankan.
Oleh karena itu, penggunaan Eclipse dalam proses pengembangan aplikasi MapReduce dapat dijadikan sebagai satu alternatif yang cukup praktis dan feseable. Proses pengembangan aplikasi jadi lebih mudah.

Tool yang dibutuhkan:
1. Eclipse IDE for Java Developer, dapat didownload dari http://www.eclipse.org/downloads/
2. Cygwin, dapat didownlaod dari http://cygwin.com/install.html
3. Hadoop-0.20.2.tar.gz file, dapat di-download dari http://hadoop.apache.org/
4. Ant Library (ant.jar), dapat di-download dari http://ant.apache.org/bindownload.cgidengan nama file apache-ant-1.8.4-bin.zip(pilih versi yang terbaru).

Instal Hadoop di Eclipse
Setelah tools yang dibutuhkan lengkap dan terinstal dengan normal, selanjutnya ikuti langkah-langkah berikut meng-instal / mengimpor Hadoop ke Eclipse :

1. Buat New Java Project pada Eclipse dan beri nama hadoop-0.20.2
2. Import hadoop-0.20.2.tar.gz yang telah di-download ke project hadoop-0.20.2 yang baru dibuat. Caranya : Klik menu File > Import > General > Archieve File dan pilih file hadoop-0.20.2.tar.gz (lihat Gambar 1.01)


3. Copy ant.jar dari file apache-ant-1.8.4-bin.zip yang telah di-extract, dan paste pada folder lib dari project hadoop-0.20.2 (hadoop-0.20.2/hadoop-0.20.2/lib/).
4. Buka file hadoop-0.20.2/.classpath dan ganti isinya dengan code xml dibawah ini : (Hal ini dilakukan untuk menambahkan semua source folders dan libraries yang dibutuhkan ke project hadoop-0.20.2 yang telah dibuat.)

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
        <classpathentry kind="src" path="hadoop-0.20.2/src/core"/>
        <classpathentry kind="src" path="hadoop-0.20.2/src/mapred"/>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/commons-logging-1.0.4.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/xmlenc-0.52.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/commons-net-1.4.1.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/kfs-0.2.2.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/jets3t-0.6.1.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/servlet-api-2.5-6.1.14.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/jetty-6.1.14.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/jetty-util-6.1.14.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/commons-codec-1.3.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/log4j-1.2.15.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/commons-cli-1.2.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/ant.jar"/>
        <classpathentry kind="lib" path="hadoop-0.20.2/lib/commons-httpclient-3.0.1.jar"/>
        <classpathentry kind="output" path="bin"/>
</classpath>

5. Refresh project hadoop-0.20.2. Caranya : klik kanan pada project hadoop-0.20.2 dan pilih “Refresh”.
Proses instal Hadoop Standalone pada Eclipse telah selesai dan Hadoop telah siap untuk menjalankan aplikasi MapReduce. Sekarang kita sudah bisa membuat aplikasi MapReduce dan menjalankannya dengan Eclipse.

Menjalankan Program WordCount
Selanjutnya kita coba menjalankan satu aplikasi MapReduce sederhana yang dinamakan WordCount. Aplikasi WordCount ini sesuai dengan namanya berfungsi untuk menghitung jumlah tiap kata dalam satu atau sekumpulan text file yang terdapat dalam folder input.

1. Buat New Java Project dengan nama WordCount. Klik Next (jangan klik Finish dulu) pada New Java Project dialog  dan lakukan setting sbb (Gambar 1.02 ) :


       a. Tambahkan project hadoop-0.20.2 pada tab Projects.
       b. Tambahkan hadoop-0.20.2/hadoop-0.20.2/lib/commons-cli-1.2.jar pada tab Libraries.

Jika sudah terlanjur klik Finish, tak perlu khawatir. Lakukan setting sbb  :
       c. Klik kanan pada project WordCount >Properties.
      d. Pada dialog WordCount Properties klik Java Build Path. Kemudian lakukan setting seperti pada point a. dan b. diatas.
2. Lakukan setting pada Run Configuration dengan langkah-langkah sbb:
        a. Klik Run pada menu utama dan pilih Run Configuration.
        b. Pada dialong Run Configuration klik tab Environment > New
       c. Pada dialog New Environment Variable, set Name = Path, Value = c:\cygwin\bin  terus klik OK. Pastikan Path sudah tertera pada kolom Variable dan c:\cygwin\bin pada kolom Value.
3. Buat file baru dengan nama log4j.properties dan taruh di folder src pada project WordCount (WordCount/src/log4j.properties). File ini berfungsi untuk menampilkan logs Hadoop pada console Eclipse. Copy dan Paste code berikut pada log4j.properties.

log4j.rootLogger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

4. Buat Class baru dengan nama WordCount.java dan simpan di folder src pada project WordCount (WordCount/src/WordCount.java). Selanjutnya, Copy and Paste java source code dibawah ini :

importjava.io.IOException;
importjava.util.StringTokenizer;

importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.Mapper;
importorg.apache.hadoop.mapreduce.Reducer;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
importorg.apache.hadoop.util.GenericOptionsParser;

public class WordCount {

  public static classTokenizerMapper
       extendsMapper<Object, Text, Text, IntWritable>{
   
    private final staticIntWritable one = newIntWritable(1);
    private Text word = new Text();
     
    public voidmap(Object key, Text value, Context context
                    ) throwsIOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while(itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }
 
  public static classIntSumReducer
       extendsReducer<Text,IntWritable,Text,IntWritable> {
    privateIntWritable result = newIntWritable();

    public voidreduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throwsIOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  public static voidmain(String[] args) throws Exception {
    Configuration conf = newConfiguration();
    String[] otherArgs = newGenericOptionsParser(conf, args).getRemainingArgs();
    if(otherArgs.length != 2) {
      System.err.println("Usage: wordcount <input> <output>");
      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, newPath(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, newPath(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

5. Buat folder baru pada project WordCount dengan nama input (WordCount/input) dan tempatkan satu atau beberapa text file yang akan diproses dengan program MapReduce WordCount.java.
6. Klik menu Run pada main menu Eclipse, dan pilih Run Configurations. Pada dialog Run Configurasions klik tab Arguments dan tambahkan: input output pada Program Arguments(A) dan klik Apply. Kemudian klik Run.
7. Jika berhasil / tak ada error, maka aplikasi MapReduce WordCount.java akan menampilkan logs sebagai berikut pada console Eclipse :

13/01/25 12:06:58 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
13/01/25 12:06:58 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
13/01/25 12:06:58 INFO input.FileInputFormat: Total input paths to process : 1
13/01/25 12:06:59 INFO mapred.JobClient: Running job: job_local_0001
13/01/25 12:06:59 INFO input.FileInputFormat: Total input paths to process : 1
13/01/25 12:06:59 INFO mapred.MapTask: io.sort.mb = 100
13/01/25 12:06:59 INFO mapred.MapTask: data buffer = 79691776/99614720
13/01/25 12:06:59 INFO mapred.MapTask: record buffer = 262144/327680
13/01/25 12:06:59 INFO mapred.MapTask: Starting flush of map output
13/01/25 12:06:59 INFO mapred.MapTask: Finished spill 0
13/01/25 12:06:59 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
13/01/25 12:06:59 INFO mapred.LocalJobRunner:
13/01/25 12:06:59 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
13/01/25 12:06:59 INFO mapred.LocalJobRunner:
13/01/25 12:06:59 INFO mapred.Merger: Merging 1 sorted segments
13/01/25 12:06:59 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 24735 bytes
13/01/25 12:06:59 INFO mapred.LocalJobRunner:
13/01/25 12:06:59 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
13/01/25 12:06:59 INFO mapred.LocalJobRunner:
13/01/25 12:06:59 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now
13/01/25 12:06:59 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to out
13/01/25 12:06:59 INFO mapred.LocalJobRunner: reduce > reduce
13/01/25 12:06:59 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
13/01/25 12:07:00 INFO mapred.JobClient:  map 100% reduce 100%
13/01/25 12:07:00 INFO mapred.JobClient: Job complete: job_local_0001
13/01/25 12:07:00 INFO mapred.JobClient: Counters: 12
13/01/25 12:07:00 INFO mapred.JobClient:   FileSystemCounters
13/01/25 12:07:00 INFO mapred.JobClient:     FILE_BYTES_READ=117145
13/01/25 12:07:00 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=121371
13/01/25 12:07:00 INFO mapred.JobClient:   Map-Reduce Framework
13/01/25 12:07:00 INFO mapred.JobClient:     Reduce input groups=1823
13/01/25 12:07:00 INFO mapred.JobClient:     Combine output records=1823
13/01/25 12:07:00 INFO mapred.JobClient:     Map input records=855
13/01/25 12:07:00 INFO mapred.JobClient:     Reduce shuffle bytes=0
13/01/25 12:07:00 INFO mapred.JobClient:     Reduce output records=1823
13/01/25 12:07:00 INFO mapred.JobClient:     Spilled Records=3646
13/01/25 12:07:00 INFO mapred.JobClient:     Map output bytes=45926
13/01/25 12:07:00 INFO mapred.JobClient:     Combine input records=3946
13/01/25 12:07:00 INFO mapred.JobClient:     Map output records=3946
13/01/25 12:07:00 INFO mapred.JobClient:     Reduce input records=1823

8. Hasilnya akan disimpan di folder output pada project WordCount (WordCount/output/part-r-00000). Jika folder output belum muncul, klik kanan pada project WordCount dan pilih Refresh.  Dapat dipastikan folder output akan muncul dan berisi file yang dihasilkan oleh WordCount.java.
Demikian, selamat mencoba.

Referensi :
1. http://shuyo.wordpress.com/2011/03/08/hadoop-development-environment-with-eclipse/
2. "パターンでわかるHadoop MapReduce ", 三木 大知, SHOEISHA 2011.




Komentar

Postingan populer dari blog ini

Metode Analisis PIECES

Aritmetika Bilangan Jam dan Operasi Hitungnya

Kerajaan Singasari