Map Reduce sederhana menggunakan PHP

Map Reduce menjadi salah satu model pemrograman yang berfokus pada pengolahan data pada lingkungan BigData. Biasanya bahasa pemrograman yang dipakai untuk memproses adalah bahasa pemrograman kelas berat seperti Java. Namun, bukan berarti kita yang suka PHP gak bisa main – main juga. ya tetap bisa saja.

Kalau kita lihat dari paper yang dipublish google tentang map- reduce programming model. Banyak hal yang dibahas di paper itu, namun kita coba untuk membahas 2 hal saja yang menurut saya esensial dalam model pemrogramannya. Yaitu (1) map phase dan (2) Reduce phase. Untuk yang lainnya mungkin akan kita coba utak atik di post lain.

untuk ujicoba nya mungkin kita perlu dataset ya. Dataset yang akan digunakan adalah dataset tentang populasi dari banyak negara dan lintas tahun.

dari data , dapat dilihat memiliki 4 kolom

  • Kolom 0 : Entity : nama negara – negara
  • Kolom 1 : Code : Kode dari negara
  • Kolom 2 : Year : Tahun
  • Kolom 3 : Population : populasi di negara tersebut pada tahun tersebut

nah, jika kita ingin membuat laporan dari file csv ini yang menghasilkan laporan berupa nama_negara, rata-rata populasi.

dengan mengasumsikan setiap baris adalah unik, maka rata-rata populasi dapat dihitung dengan jumlah populasi / jumlah baris , dimana dihitung per negara.

untuk ini kita dapat membuat 2 file di PHP untuk mapper dan reduce nya.

<?php
if(count($argv) != 2)
{
	echo "php mp-mapper.php <nama file>".PHP_EOL;
	exit(1);
}

$file = $argv[1];

$out = fopen("php://output","w");

$fp = fopen($file,"r");

while(($data = fgetcsv($fp)) !== FALSE)
{
	$data_out = array(
		$data[0],
		$data[3]
	);

	fputcsv($out,$data_out);
}

fclose($fp);
fclose($out);

file mp-mapper.php ini mengambil 1 parameter yaitu nama file. Lalu, akan melakukan projection terkait kolom yang akan digunakan. dimana kolom yang akan digunakan adalah kolom ke 0 dan 3.

untuk melihat perbedaan dari data nya, dapat kita visualkan seperti gambar dibawah

gambar berikut terkait cuplikan data yang digunakan, terlihat ada 4 kolom.

coba bandingkan dengan setelah program mp-reduce.php dijalankan

setelah mp-reduce dijalankan dan hasilnya disimpan ke dalam sebuah file

 php mp-mapper.php population-and-demography.csv > test-mapper.csv

maka file tersebut bisa juga dibuat sebagai file input untuk proses reduce

<?php
if(count($argv) != 2)
{
	echo "php mp-reducer.php <nama file>".PHP_EOL;
	exit(1);
}

$file = $argv[1];

$count = array();
$sum = array();

$fp = fopen($file,"r");

$out = fopen("php://output","w");

while(($data = fgetcsv($fp)) !== FALSE)
{
	$country = $data[0];

	if(!isset($count[$country]))
	{
		$count[$country] = 0;
		$sum[$country] = 0;
	}

	$count[$country] = $count[$country] + 1;
	$sum[$country] = $sum[$country] + floatval($data[1]);

}

$list_country = array_keys($count);
foreach($list_country as $country)
{
	$avg = (float)$sum[$country] / $count[$country];
	fputcsv($out,array($country,$avg));	
}

fclose($fp);
fclose($out);

lalu reducer ini dapat dipanggil seperti

 php mp-reducer.php test-mapper.csv

maka akan menjadi

dengan ini kita sudah bisa memprogram map reduce dengan PHP

tentu ini belum optimal dan belum menjawab banyak hal seperti bagaimana model terdistribusinya, fault tolerance dll. Namun ini bisa jadi dasar untuk membahas hal – hal tersebut.