Landasan Teori
- http://labs.google.com/papers/mapreduce.html
- http://en.wikipedia.org/wiki/MapReduce
- http://hadoop.apache.org/common/docs/r0.20.0/mapred_tutorial.html
- http://hadoop.apache.org/common/docs/r0.20.0/hdfs_user_guide.html
Peralatan
- Java Development Kit 1.6
- Integrated Development Environtment (NetBeans / Eclipse)
- Apache Hadoop 0.2x
Latar Belakang
Kota Candibangun merupakan salah satu kota besar yang ada di Indonesia. Kota Candibangun menjadi target wisata dan juga tempat yang cocok untuk menuntut ilmu dan bekerja, oleh karena ini banyak sekali orang-orang yang berdatangan ke kota Candibangun baik itu untuk berwisata, bekerja atau kuliah.
Sejak tahun 1970, setiap harinya pemerintah kota Candibangun selalu mencatat jumlah pendatang yang masuk ke kota Candibangun. Saat ini, kota Pemerintah kota Candibangun ingin menghitung jumlah orang yang datang ke kota Candibangun per-tahunnya.
Data jumlah pendatang di kota candibangun disimpan dalam sebuah berkar dengan format penulisan seperti berikut .
tanggal-bulan-tahun-jam jumlah-pendatang stasiun
Dimana :
- tanggal => tanggal kedatangan
- bulan => bulan kedatangan
- tahun => tahun kedatangan
- jam => jam kedatangan
- jumlah-pendatang => jumlah pendatang
- terminal-kedatangan => stasiun tempat pendatang datang
Rumusan Masalah
Bagaimana menghitung jumlah pendatang setiap tahunnya di kota Candibangun?
Analisis Metode MapReduce
Format berkas catatan jumlah kedatangan perjam yang dimiliki oleh Pemerintahan kota Candibangun adalah sebagai berikut :
1-1-1970-1 67 Leuwipanjang 1-1-1970-1 45 Ledeng 1-1-1970-1 4 Cicaheum 1-1-1970-1 12 Cihangseur 1-1-1970-1 78 Cibelekok 1-1-1970-2 56 Leuwipanjang 1-1-1970-2 54 Ledeng 1-1-1970-2 23 Cicaheum 1-1-1970-2 45 Cihangseur .... 4-6-2010-14 344 Cibelekok
Dikarenakan saat ini, yang ingin didapat informasinya adalah jumlah pendatang per-tahun, oleh karena itu, yang harus difokuskan adalah pada tahun dan jumlah-pendatang. Sehingga, pada proses Map, yang diambil adalah tahun dan jumlah-pendatang saja, sehingga hasilnya adalah
1970 67 1970 45 1970 4 1970 12 1970 78 1970 56 1970 54 1970 23 1970 45 .... 2010 344
Setelah didapat jumlah pendatangnya setiap jam dari tahapan Map, lalu dilanjutkan dengan menggabungkan seluruh data jumlah per tahun dalam tahapan Reduce, sehingga hasil dari tahapan reduce adalah :
1970 34252 1971 13134 1972 56346 1973 24245 ... 2010 567574
Implementasi
Menambahkan Data ke Hadoop Distributed File System
Sebelum menggunakan berkas data jumlah pendatang yang dimiliki oleh Pemerintahan kota Candibangun, pertama kali kita perlu memasukkan data tersebut ke HDFS, caranya gunakan perintah seperti dibawah ini :
hadoop fs -copyFromLocal namafile.db targetfile.db
Membuat Mapper
Setelah data ada di HDFS, saatnya membuat Mapper untuk mengelola data tersebut, caranya adalah seperti dibawah ini :
package khannedy.hadoop.pendatang; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class PendatangMapper extends Mapper<LongWritable, Text, Text, LongWritable> { private SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy-HH"); protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { try { String[] token = value.toString().split(" "); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(format.parse(token[0]).getTime()); String year = String.valueOf(calendar.get(Calendar.YEAR)); long jumlah = Long.parseLong(token[1]); context.write(new Text(year), new LongWritable(jumlah)); } catch (ParseException e) { e.printStackTrace(); } }; }
Membuat Reducer
Setelah membuat Mapper, saatnya membuat Reduce yang digunakan untuk menggabungkan seluruh hasil Mapper, dan disini dijumlahkan seluruh jumlah pendatang dalam satu tahun.
package khannedy.hadoop.pendatang; import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class PendatangReducer extends Reducer<Text, LongWritable, Text, LongWritable> { protected void reduce(Text key, java.lang.Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { long total = 0L; for (LongWritable jumlah : values) { total = total + jumlah.get(); } context.write(key, new LongWritable(total)); }; }
Membuat Program
Setelah membuat Mapper dan Reducer, saatnya membuat programnya.
package khannedy.hadoop.pendatang; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class PendatangProgram { public static void main(String[] args) throws Exception { Configuration configuration = new Configuration(); Job job = new Job(configuration); job.setMapperClass(PendatangMapper.class); job.setReducerClass(PendatangReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); FileInputFormat.addInputPath(job, new Path("hdfs://localhost/user/echo/pendatang.db")); FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost/user/echo/pendatang-output/")); job.waitForCompletion(true); } }
Menjalankan Program
Jika kelas PendudukProgram dijalankan, maka dalam HDFS akan menghasilkan data penduduk-output. Salin berkar tersebut ke local dengan perintah :
hadoop fs -copyToLocal target tujuan
Berkas hasil dari process MapReduce tersebut berisikan seluruh data tahun dan jumlah penduduk yang masuk seperti dibawah ini :
1970 3263078 1971 3261077 1972 3254957 1973 3268965 1974 3263049 1975 3274179 1976 3270917 1977 3266051 1978 3250530 1979 3273013 1980 3261191 1981 3266908 1982 3244034 1983 3272409 1984 3280698 1985 3270441 1986 3266859 1987 3261544 1988 3277093 1989 3263863 1990 3252142 1991 3271244 1992 3277849 1993 3252695 1994 3271026 1995 3248604 1996 3268315 1997 3261750 1998 3264411 1999 3256916 2000 3266071 2001 3281366 2002 3273267 2003 3264435 2004 3268418 2005 3264170 2006 3256500 2007 3249088 2008 3277324 2009 3255996 2010 3247750
Kesimpulan
Dari hasil penelitian ini, ternyata dapat disimpulkan bahwa Hadoop dapat digunakan untuk menghitung jumlah pendatang ke kota Candibangun dengan menggunakan model pemrograman MapReduce.
Sedekah ilmu..@?!/
Muantep…
Semoga ilmunya tambah berkah…
keren mas, nambah ilmu lagi
Wah,, blognya,, kren,, postingnya juga, kerenn, Jempolan dah,,
bisa minta cara install di Slackware13
terimakasih
Mas saya buat aplikasi mapreduce dengan hadoop. Tapi waktu dijalankan tidak bisa load file “Kamus.dic”. File “Kamus.dic” saya simpan di directory /usr/local/hadoop/hadoop-0.20.2/
Ini potongan code buat baca file “Kamus.dic” :
fileConfigPath = new File(“/usr/local/hadoop/hadoop-0.20.2/”);
configFile = new File(fileConfigPath, “Kamus.dic”);
if (configFile.canRead() || configFile.exists() || configFile.isFile()){
try {
BufferedReader in = new BufferedReader(new FileReader(configFile));
String teks;
while ((teks = in.readLine()) !=null){
kata.add(teks);
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
Logger.getLogger(StopList.class.getName()).log(Level.SEVERE, null, ex);
}
}
Sedangkan potongan code untuk maping seperti berikut:
kamus = new Kamus();
while(m.find()){
//System.out.println(“Matcher m ” + m);
String matchedKey = m.group().toLowerCase();
//System.out.println(“matchedKey ” + matchedKey);
if (!Character.isLetter(matchedKey.charAt(0)) ||
Character.isDigit(matchedKey.charAt(0)) ||
indStopword.isContain(matchedKey) ||
matchedKey.contains(“_”)){
continue;
}
kataDasar = new Kata(matchedKey, kamus);
valueBuilder.append(” “+kataDasar.getBentukDasar(3));
valueBuilder.append(“@”);
valueBuilder.append(fileName);
context.write(new Text(valueBuilder.toString()), new IntWritable(1));
Mohon bantuannya Mas kenapa isi file “Kamus.dic” tidak bisa di-load. Terima kasih.
dimana mapreduce nya y? yang kamu buat cuma Java IO biasa aja 😀
TErima kasih udah bales mas 🙂 . Mungkin coding di atas kurang lengkap. Berikut lengkapnya mas.
Kamus.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Fikri
*/
public class Kamus {
private Set kata; //kata-kata yang masuk dalam kamus
private File file;
public Kamus() throws IOException{
kata = new HashSet();
initialize();
}
public synchronized void initialize() throws IOException{
file = new File(“/usr/local/hadoop/hadoop-0.20.2/Kamus.dic”);
if (file.canRead() || file.exists() || file.isFile()){
try {
BufferedReader in = new BufferedReader(new FileReader(file));
String teks;
while ((teks = in.readLine()) !=null){
kata.add(teks);
}
} catch (FileNotFoundException ex) {
Logger.getLogger(StopList.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public boolean isContain(String str){
for (String s : kata){
if (s.contains(str)){
return true;
}
}
return false;
}
public int size(){
return kata.size();
}
public void purge(){
this.kata.clear();
}
}
Mappernya :
public class WordFrequenceInDocMapper extends Mapper{
private Kata kataDasar;
private Kamus kamus;
public WordFrequenceInDocMapper(){}
/**
* @param key
* @param value
* @param context
* @throws IOException
* @throws InterruptedException
*
* POST Condition word@doc n
*/
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
Pattern p = Pattern.compile(“\\w+”);
Matcher m = p.matcher(value.toString());
String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
StringBuilder valueBuilder = new StringBuilder();
StopList indStopword = new StopList();
kamus = new Kamus();
while(m.find()){
String matchedKey = m.group().toLowerCase();
if (!Character.isLetter(matchedKey.charAt(0)) ||
Character.isDigit(matchedKey.charAt(0)) ||
indStopword.isContain(matchedKey) ||
matchedKey.contains(“_”)){
continue;
}
kataDasar = new Kata(matchedKey, kamus);
valueBuilder.append(” “+kataDasar.getBentukDasar(3));
valueBuilder.append(“@”);
valueBuilder.append(fileName);
context.write(new Text(valueBuilder.toString()), new IntWritable(1));
valueBuilder.delete(0, valueBuilder.length());
}
}
}
Reducer:
public class WordFrequenceInDocReducer extends Reducer{
public WordFrequenceInDocReducer(){}
protected void reduce(Text key, Iterable values, Context context)throws IOException, InterruptedException{
int sum = 0;
for (IntWritable val : values){
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
Masalah saya ga bisa load file –> file = new File(“/usr/local/hadoop/hadoop-0.20.2/Kamus.dic”);
saat mapreduce dijalankan. Tapi waktu tes di netbeans file itu bisa dibaca.
Kira-kira apa penyebabnya???
Mohon bantuannya mas. makasih.
kalo di netbeans bisa trus di terminal gak bisa, paling errornya ClassNotFound, artinya kelas hadoop gak ditemukan