Monday, January 28, 2013

Menjalankan Hadoop MapReduce Mode Pseudo-distributed dengan Linux


Pada artikel sebelumnya (Menjalankan Hadoop MapReduce dengan Eclipse Java SE) telah dijelaskan bagaimana cara instal Hadoop dan menjalankan aplikasi MapReduce mode standalone dengan menggunakan Eclipse Java SE yang diinstal di Windows.

Kali ini saya akan menjelaskan langkah-langkah untuk menginstal Hadoop mode pseudo-distributed di Linux dan menjalankan contoh aplikasi MapReduce.

Tools yang perlukan :
Hadoop-0.20.2.tar.gz file, dapat di-download dari http://hadoop.apache.org/
Setelah Hadoop-0.20.2.tar.gz di-ekstrak, simpanlah di home diterctory atau directory lain yang dikehendaki, kemudian ikutilah langkah-langkah berikut :

1. Konfigurasi Hadoop
Didalam directory Hadoop-0.20.2 terdapat directory conf yang berisi file-file konfigurasi untuk Hadoop. Buka directory Hadoop-0.20.2/conf , kemudian edit isi file core-site.xml, hdfs-site.xm. dan mapred-site.xml seperti sbb:

Setting pada core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- core-site.xml -->

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost/</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/temp</value>
    <final>true</final>
  </property>
</configuration>

Setting pada hdfs-site.xml 
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- hdfs-site.xml -->

<configuration>
  <property>
    <name>dfs.name.dir</name>
    <value>${hadoop.tmp.dir}/dfs/name</value>
    <final>true</final>
  </property>

  <property>
    <name>dfs.data.dir</name>
    <value>${hadoop.tmp.dir}/dfs/data</value>
    <final>true</final>
  </property>

  <property>
    <name>fs.checkpoint.dir</name>
    <value>${hadoop.tmp.dir}</value>
    <final>true</final>
  </property>

  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

Setting pada mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- mapred-site.xml -->

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:8021</value>
    <final>true</final>
  </property>

  <property>
    <name>mapred.local.dir</name>
    <value>${hadoop.tmp.dir}/mapred/local</value>
    <final>true</final>
  </property>

  <property>
    <name>mapred.system.dir</name>
    <value>${hadoop.tmp.dir}/mapred/system</value>
    <final>true</final>
  </property>

  <property>
    <name>mapred.tasktracker.map.tasks.maximum</name>
    <value>2</value>
    <final>true</final>
  </property>

  <property>
    <name>mapred.tasktracker.reduce.tasks.maximum</name>
    <value>2</value>
    <final>true</final>
  </property>

  <property>
    <name>mapred.child.java.opts</name>
    <value>-Xmx200m</value>
    <!-- Not marked as final so jobs can include JVM debugging options -->
  </property>
</configuration>

2. Konfigurasi SSH
Pada mode psudo-distributed, Hadoop akan menjalankan beberapa daemons. Oleh karena itu SSH harus diinstal dan di-setting agar Hadoop bisa masuk dengan SSH ke localhost tanpa harus memasukkan password.
Pertama, cek apakah SSH sudah terinstal atau belum dengan command berikut:
              % sudo apt-get install ssh
Kemudian ijinkan login SSH ke localhost tanpa menggunakan password:
              % ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
              % cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Test setting dengan command berikut:
              % ssh localhost
Jika sukses, maka anda akan bisa login dengan SSH tanpa menggunakan password.

3. Format HDFS
Seperti halnya hardisk pada PC yang sebelum digunakan harus diformat dulu dengan filesystem yang akan digunakan (FAT32, NTFS dsb), HDFS pun demikian. Sebelum Hadoop bisa digunakan, HDFS harus diformat dulu. Buka directory hadoop-0.20.2 dan dari directory ini execute command berikut untuk men-format HDFS:

              % bin/hadoop namenode -format

Setelah diformat, Hadoop sudah siap dijalankan dengan men-start daemons HDFS dan MapReduce dengan command berikut:

              % bin/start-dfs.sh
              % bin/start-mapred.sh

Setelah Hadoop di-start, kita bisa memastikan apakah daemons Hadoop tersebut sudah berjalan atau tidak dengan menggunakan browser internet (Internet Explorer, Firefox, Google Chrome dsb). Masukkan URL berikut ke address bar browser yang digunakan.

              http://localhost:50030/        --url jobtracker
              http://localhost:50070/        --url namenode

Untuk menghentikan daemons Hadoop, gunakan command berikut:

              % bin/stop-mapred.sh
              % bin/stop-dfs.sh

Bila langkah-langkah diatas berjalan normal, brarti instal Hadoop mode pseudo-distributed telah sukses dan Hadoop telah siap menjalankan aplikasi MapReduce. Berikutnya kita akan mencoba menjalankan contoh aplikasi MapReduce yang dinamai WordCount, sama seperti aplikasi yang dijalankan pada Hadoop mode standalone pada artikel sebelumnya (MenjalankanAplikasi MapReduce dengan Eclipse Java SE). Silakan download / copy source code aplikasi WordCount.java dari artikel tersebut.

3. Menjalankan aplikasi WordCount
Untuk menjalankan contoh aplikasi WordCount, silakan ikuti langkah-langkah sbb:

              a. Buat directory baru pada home directory dan beri nama wordcount (atau nama yang sesuai selera masing2). Buat file baru dengan nama WordCount.java dan paste source code WordCount.java pada artikel Menjalankan Aplikasi MapReduce dengan Eclipse java SE.
              b. Compile program WordCount.java dengan command berikut (saya asumsikan kita berada di directory hadoop-0.20.2):

             % javac -classpath hadoop-0.20.2-core.jar:lib/commons-cli-1.2.jar /home/wordcount/WordCount.java

Bila compile sukses, maka akan dihasilkan tiga class file :     
             
              WordCount.class
              WordCount$TokenizerMapper.class
              WordCount$IntSumReducer.class

Buat directory baru dengan nama classes, dan pindahkan ketiga class file tsb ke dalam directory classes.
              c. Buat WordCount.jar dengan mengeksekusi command berikut dari directory wordcount:

              % jar -cvf WordCount.jar -C classes/ .

Bila sukses, maka akan dihasilkan file WordCount.jar
              d. Buat directory input pada HDFS dengan command berikut (saya asumsikan kita berada di directory hadoop-0.20.2)

              % bin/hadoop dfs -mkdir /user/input
              % bin/hadoop dfs -ls /user

              e. Copy text file yang akan diproses dengan menggunakan aplikasi WordCount ke directory input pada HDFS dengan command berikut:

              % bin/hadoop dfs -copyFromLocal /home/contoh.txt /user/input
              % bin/hadoop dfs -ls /user/input

              f. Setelah itu kita jalankan program WordCount dengan command berikut:
              bin/hadoop jar /home/wordcount/WordCount.jar WordCount /user/input /user/output
              bila sukses akan muncul text berikut pada console:

              13/01/28 10:58:09 INFO input.FileInputFormat: Total input paths to process : 1
              13/01/28 10:58:09 INFO mapred.JobClient: Running job: job_201301150937_0002
              13/01/28 10:58:10 INFO mapred.JobClient:  map 0% reduce 0%
              13/01/28 10:58:17 INFO mapred.JobClient:  map 100% reduce 0%
              13/01/28 10:58:29 INFO mapred.JobClient:  map 100% reduce 100%
              13/01/28 10:58:31 INFO mapred.JobClient: Job complete: job_201301150937_0002
              13/01/28 10:58:31 INFO mapred.JobClient: Counters: 17
              13/01/28 10:58:31 INFO mapred.JobClient:   Job Counters
              13/01/28 10:58:31 INFO mapred.JobClient:     Launched reduce tasks=1
              13/01/28 10:58:31 INFO mapred.JobClient:     Rack-local map tasks=1
              13/01/28 10:58:31 INFO mapred.JobClient:     Launched map tasks=1
              13/01/28 10:58:31 INFO mapred.JobClient:   FileSystemCounters
              13/01/28 10:58:31 INFO mapred.JobClient:     FILE_BYTES_READ=27105
              13/01/28 10:58:31 INFO mapred.JobClient:     HDFS_BYTES_READ=19099
              13/01/28 10:58:31 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=54242
              13/01/28 10:58:31 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=20699
              13/01/28 10:58:31 INFO mapred.JobClient:   Map-Reduce Framework
              13/01/28 10:58:31 INFO mapred.JobClient:     Reduce input groups=1600
              13/01/28 10:58:31 INFO mapred.JobClient:     Combine output records=1600
              13/01/28 10:58:31 INFO mapred.JobClient:     Map input records=1600
              13/01/28 10:58:31 INFO mapred.JobClient:     Reduce shuffle bytes=0
              13/01/28 10:58:31 INFO mapred.JobClient:     Reduce output records=1600
              13/01/28 10:58:31 INFO mapred.JobClient:     Spilled Records=3200
              13/01/28 10:58:31 INFO mapred.JobClient:     Map output bytes=23899
              13/01/28 10:58:31 INFO mapred.JobClient:     Combine input records=1600
              13/01/28 10:58:31 INFO mapred.JobClient:     Map output records=1600
              13/01/28 10:58:31 INFO mapred.JobClient:     Reduce input records=1600

              g. Buka directory /uer/output pada HDFS dan cek hasilnya:

              % bin/hadoop dfs -ls /user/output
              % bin/hadoop dfs -cat /user/output/part-r-00000

              Hasil eksekusi aplikasi WordCount juga dapat dilihat menggunakan Web Browser di http://localhost:50070/

Demikian langkah-langkah instal Hadoop mode pseudo-distributed di Linux beserta cara menjalankan contoh aplikasi MapReduce. Selamat mencoba!.

Referensi:
1. "Hadoop: The Definitive Guide, Third Edition", Tom White, O'Reilly 2012.
2. hadoop-tutorial.blogspot.jp/2010/11/running-hadoop-in-pseudo-distributed.html

2 comments:

Wina Winarti said...

Salam Pak, mau tanya,

kalau langkah ini:
2. Cygwin, dapat didownlaod dari http://cygwin.com/install.html

hanya untuk windows kah ? kalau dicoba di ubuntu dilewat saja ya ?

Terima kasih

Vijjam Wjaya said...

Salam,
terima kasih telah berkunjung.

Betul sekali, Cygwin tidak diperlukan di Ubuntu.