Menghitung Jumlah Pendatang Per-Tahun di Kota Candibangun Menggunakan Apache Hadoop


Landasan Teori

Peralatan

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.

Iklan

9 pemikiran pada “Menghitung Jumlah Pendatang Per-Tahun di Kota Candibangun Menggunakan Apache Hadoop

  1. 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.

  2. 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.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s