Friday, January 25, 2013

Menjalankan Aplikasi Hadoop MapReduce dengan Eclipse Java SE


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.cgi dengan 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 :

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 <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, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(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.




17 comments:

karafuruworld said...

Salam. Mas Wjaya, saya saat ini sedang mencoba membuat mapreduce di platform windows, dengan step by step sesuai dengan yang ada di tulisan mas.

Pada bagian Install hadoop di Eclipse, saya melakukan seperti yang disebutkan dengan catatan:

1. di hadoop.apache.org (tepatnya pada http://mirror.symnds.com/software/Apache/hadoop/common/), saya tidak menemukan file hadoop-0.20.2.tar.gz sehingga saya menggunakan yang terbaru yaitu hadoop-2.4.1/
2. Saya sudah mengganti code xml dengan terlebih dahulu memodifikasi penamaan hadoop menjadi seri 2.4.1

Mengapa meski setelah dimodifikasi, tetap error? Apa saja yang mungkin menjadi permassalahannya?

Terima kasih

Vijjam Wjaya said...

karafuruworld, terima kasih kunjungannya. Versi terakhir dari Hadoop yg pernah saya coba jalankan di Windows (Eclipse) adalah Hadoop 1.4 dan tidak berhasil (sekitar akhir 2013).

Setelah sy telusuri, akhirnya sy temukan ada satu (mungkin beberapa) elemen Hadoop yg tidak compatible dgn Windows (sy gunakan windows 7 64bit). Kemudian sy temukan juga dokumentasi yg menyatakan bahwa memang tidak memungkinkan unjuk menjalankan Hadoop 1.4 dengan Windows Eclipse (saat itu versi stabil yg bisa dijalankan dgn Windows Eclipse hanya Hadoop 0.20.2).

Solusi saya: Sejak saat itu akhirnya saya gunakan Eclipse dgn OS Linux (CentOS 6.2) untuk menjalankan Hadoop dan tak pernah lagi menggunakan Eclipse di Windows.

Demikian jawaban dari saya, mohon maaf informasi ini belum sempat sy muat di blog.

Ipink Nusantara said...

Mas, Sy sdh sukses instalasi Hadoop di Eclipse, tp saat
Menjalankan Program WordCount, berhenti di langkah:

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

sy cari kok tdk ada tab Environment? kenapa ya kira2.
thanks

Vijjam Wjaya said...

Untuk eclipse versi kepler enterprise edition, tab environment ada di:
Run Configuration>Java Application

Ananda Putri Valentina Lukitasari said...

Oh iya mas, mau nanya itu programnya bisa tahu kalau harus mencari filenya di folder input dari codingan yang sebelah mananya ya?

Vijjam Wjaya said...

Ada di point 6 step "Menjalankan Program Wordcount":
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.

bobobo said...

buat "training and real study case pak, nanti saya daftar jadi pesertanya

Vijjam Wjaya said...

Makasi saran & minatnya,
Kita liat sikon dulu mas, berhubung konsep Big Data dan sgala teknologi pendukungnya kan masih termasuk barang baru di negeri kita. Moga2 sih peminatnya makin berkembang, bukan hanya di kalangan akademisi / peneliti, tp bisa bner2 diaplikasikan di perusahaan2 / instansi dalam negeri. Sy pernah dapat info, katanya BI sdh mulai terapkan konsep Big Data analysis ini.

Ananda Putri Valentina Lukitasari said...

kalu Hadoop MapReduce Mode Fully/Pseudo Distributed yang di windows tidak memungkin kah mas? saya cari blog mas ndak ketemu. Atau memang stepnya sama namun cara konfigurasinya ada yg beda (konfigurasi SSH dll mungkin)

Vijjam Wjaya said...

Saya blum pernah mencobanya, tp mengingat Hadoop memang dikembangkan dengan basis Linux, saya kira usaha Anda akan terlalu mubazir jika hendak install Hadoop Pseudo / Fully Distributed di Windows.

Jika Anda tetap bersikeras ingin pake Windows, saya sarankan utk instal Virtual Machine dgn OS Linux di PC Windows Anda, kemudian membuat virtual network antar sesama linux virtual machine tsb. Anda bisa pake VMWare atau VirtualBox.

Fakhria Nur Shabrina said...

Salam pak, saya sangat baru dalam dunia big data ini, saya ingin mencoba menganalisis big data dengan salah satu algoritma clustering. Apakah bapak pernah mencoba? Kira kira situs mana saja yang menyediakan dataset tersebut? Sebelumnya ada artikel yang menyarankan membuka situs UCI Machine Learning, hanya saja saya belum mengetahui cara mengambil data (terdiri dari beberapa file) dan menginputnya ke java untuk di analisis. Kira kira bapak bisa memberi bimbingan atau rekomendasi situs yang bisa saya pelajari?
Terimakasih

Vijjam Wjaya said...

Salam Mba Fakhria,
terima kasih atas kunjungannya.

Saya belum pernah menerapkan algoritma clustering dalam analysis big data, tapi saya pernah menerapkan beberapa algorithma machine learning untuk data mining. Berkaitan dengan situs yang menyediakan data set untuk machine learning, saya kira UCI Machine Learning sudah menyediakan cukup banyak data. Datanya ada yg dapat didownload dalam format text file, sperti pada url ini: https://archive.ics.uci.edu/ml/machine-learning-databases/bag-of-words/
Sbg tahap awal dlm analisis big data, mungkin bisa dimulai dengan analisa sederhana dulu seperti pengelompokan / klasifikasi artikel / essay berdasarkan jumlah kata (frekwensi kemunculan) kata tertentu dalam essay / artikel tersebut. Bisa memulainya dengan algorithma yang mudah dulu seperti algorithma wordcount menggunakan MapReduce seperti pada artikel di blog saya ini.
Selain UCI Machine Learning, Common Crawl (https://commoncrawl.org/what-you-can-do/) juga menyediakan data yang dapat didownload secara gratis.
Selamat mencoba…!

Ariel said...

salam pak, kenapa yah hasil output dari wordcount selalu part-r-00000 ?

Vijjam Wjaya said...
This comment has been removed by the author.
Vijjam Wjaya said...

@Ariel:
Salam mas,

Format output file MapReduce by default adalah part-x-yyyyy
dalam hal ini:
x adalah 'm' atau 'r', bergantung pada job yang telah diselesaikan, apakah berupa job Map saja (m), atau Reduce (r).
y adalah nomor task Mapper atau Reducer (zero based).

Misal, jika suatu job MapReduce memiliki 16 Reducers, maka nama output filenya adalah dari part-r-00000 s.d. part-r-00015 (satu untuk tiap task Reducer).
Jadi, output dari wordcount yang hanya terdiri atas part-r-00000 artinya Job MapReduce tersebut hanya terdiri atas satu task reducer.

erna karina said...

selamat sore Mas, Saya sudah sukses instalasi Hadoop di Eclipse, tp saat
Menjalankan Program WordCount, berhenti di langkah:

b. Tambahkan hadoop-0.20.2/hadoop-0.20.2/lib/commons-cli-1.2.jar pada tab Libraries.
di saya engga ada file commons-cli nya kenapa ya?
apa karea saya pake hadoop yang-2.7.3.

terimaksih sebelumnya

erna karina said...

maaf mas saya mau tanya lagi kalau install hadoop pas bagian di cmd yang "hdfs namenode -format" pas di enter "Error: Could not find or load main class 18"
kenapa ya?