Pendahuluan
Map-Reduce adalah salah satu konsep teknis yang sangat penting di dalam teknologi cloud terutama karena dapat diterapkannya dalam lingkungan distributed computing. Dengan demikian akan menjamin skalabilitas aplikasi kita.
Salah satu contoh penerapan nyata map-reduce ini dalam suatu produkadalah yang dilakukan Google. Dengan inspirasi dari functional programming map dan reduce Google bisa menghasilkan filesystem distributed yang sangat scalable, Google Big Table.
Dan juga terinspirasi dari Google, pada ranah open source terlihat percepatan pengembangan framework lainnya yang juga bersifat terdistribusi dan menggunakan konsep yang sama, project open source tersebut bernama Apache Hadoop.
Artikel berikut akan mencoba mengeksplorasi sifat proses map dan reduce di Python - salah satu bahasa pemograman populer yang mendukung functional programming.
Fungsi Map
Fungsi map - sesuai namanya - pada Pyhon adalah fungsi yang memetakan tiap nilai argumen dari satu daftar nilai (list, tuple ataupun dictionary) ke nilai transformasi yang diinginkan dengan suatu fungsi.
Namun hal ini tidak berarti argumennya hanya menerima satu daftar nilai saja, bisa sekumpulan daftar nilai asalkan jumlah anggota pada tiap daftar tersebut sama.
Syntax Dasar
map(function, sequence)
Skema Proses Map (1 Argumen)
Jika Anda memiliki sikap kebiasaan seperti saya - suatu proses harus bisa divisualisasikan - maka skema berikut mudah-mudahan bisa mengekspresikan bagaimana sebenarnya fungsi map bekerja (klik untuk memperbesar gambar).
Penjelasan gambar :
- X1, X2, X3, dan X4 adalah variabel dari suatu list / daftar
- f(x) adalah fungsi yang akan menerima variabel X1 s/d X4 sebagai argumennya. Terlihat disini fungsi f(x) independen terhadap fungsi f(x) lainnya dalam memproses variabel argumen
- X1', X2', X3', dan X4' adalah output dari fungsi pemetaan f(x)
Contoh Code - Nilai Kuadrat
Berikut adalah contoh code Python dimana kita memiliki map dari fungsi phi_kuadrat yang akan mengambil argumen dari list [1,2,3].
Setiap anggota dari list tersebut akan diambil, dikalikan dengan dirinya sendiri (kuadrat) dan dikembalikan sebagai nilai dari fungsi. Hasil akhir dari fungsi map ini adalah list [1,4,9].
kuadrat.pydef phi_kuadrat(arg1): return arg1 * arg1
hasil = map(phi_kuadrat, [1,2,3])
print hasil
Hasil Eksekusi kuadrat.py
Contoh source code bisa diambil dari lampiran artikel ini. Anda bisa eksekusi code tersebut dengan interpreter Python langsung melalui command line atau dari IDE seperti PyDev yang berbasis Eclipse (gambar).
Skema Proses Map (2 Argumen atau lebih)
Penjelasan gambar :
- X1, X2, X3, dan X4 adalah variabel dari suatu list / daftar
- Y1, Y2, Y3, dan Y4 adalah variabel dari suatu list / daftar
- f(x,y) adalah fungsi yang akan menerima daftar nilai X1 s/d X4 sebagai argumen pertama dan Y1 s/d Y4 sebagai argumen kedua . Terlihat disini fungsi f(x,y) independen terhadap fungsi f(x,y) lainnya dalam memproses variabel argumen
- XY1', XY2', XY3', dan XY4' adalah output dari fungsi pemetaan f(x,y)
Contoh Code - Perkalian
Berikut adalah contoh dimana kita memiliki map dari fungsi phi_kali yang akan mengambil argumen dari list [1,2,3,4] sebagai argumen pertama dan list [2,3,4,5] sebagai argumen kedua. Perhatikan bahwa kedua list tersebut memiliki jumlah anggota yang sama : 4 nilai integer.
Setiap anggota dari list pertama akan dikalikan dengan setiap anggota dari list kedua dalam urutan yang sama :
- 1 x 2 (1 adalah anggota pertama dari list pertama dan 2 adalah anggota pertama dari list kedua)
- 2 x 3 (2 adalah anggota pertama dari list pertama dan 3 adalah anggota pertama dari list kedua)
- dstnya
Hasil akhir berupa list dengan nilai [2, 6, 12, 20]
perkalian.pydef phi_kali(arg1, arg2): return arg1 * arg2
hasil = map(phi_kali, [1,2,3,4], [2,3,4,5])
print hasil
Hasil Eksekusi perkalian.py
Fungsi Reduce
Fungsi reduce membutuhkan sedikitnya 2 argumen untuk dapat beroperasi. Ini dikarenakan sifarnya yang berantai atau rekursif untuk "penciutan" argumen-argumen yang mengikuti.
Proses ini akan digambarkan lebih lengkap melalui diagram dan contoh program berikut.
Syntax Dasar
reduce(function, sequence)
Skema Proses Reduce
Penjelasan gambar :
- X1, X2, X3, dan X4 adalah variabel dari suatu list / daftar
- f(x,y) adalah fungsi yang akan menerima X1 dan X2 sebagai argumen awalnya. Fungsi ini akan menghasilkan nilai X12' yang nantinya akan digunakan sebagai argumen pertama dari proses fungsi f(x,y) berikutnya
- Fungsi f(x,y) kedua akan mengambil nilai X12' sebagai argumen pertama dan X3 sebagai argumen kedua untuk menghasilkan nilai X123'. Dan seterusnya hal yang sama dilakukan untuk argumen-argumen berikutnya.
- Perhatikan bahwa fungsi f(x,y) sangat tergantung dengan fungsi f(x,y) yang dilakukan sebelumnya
Contoh 1 - Penambahan
Contoh pertama untuk reduce adalah proses penambahan suatu daftar nilai yang kemudian dijumlahkan secara bertahap sampai kita mendapatkan hasil final dari semua penjumlahan argumen yang dikirimkan. Berikut adalah contoh code Python dan hasil outputnya.
penambahan.pydef phi_tambah(arg1, arg2): print "Argumen1 = ", arg1, ", Argumen2 = ", arg2 return arg1 + arg2
hasil = reduce(phi_tambah, [1,2,3,4])
print "Hasil akhir : ", hasil
Hasil Eksekusi penambahan.pyArgumen1 = 1 , Argumen2 = 2 Argumen1 = 3 , Argumen2 = 3 Argumen1 = 6 , Argumen2 = 4 Hasil akhir : 10
Contoh 2 - Hybrid Type Arguments
Pada contoh 1 di atas, sekilas kelihatan bahwa benar fungsi reduce di Python digunakan untuk "menciutkan" hasil akhir. Persepsi seperti ini tidak benar. Seperti skema di atas, fungsi reduce sebenarnya secara rekursif "menciutkan" semua daftar argumen menjadi fragmen-fragmen pasangan nilai (2 argumen) untuk kemudian diproses.
Berikut adalah contoh yang memperjelas hal tersebut. Tiap tuple dari argumen pertama dikalikan dengan konstanta dari argumen selanjutnya sehingga outputnya "membengkak" menjadi duplikasi dari tuple tersebut.
phi_hybriddef phi_hybrid(arg1, arg2): print "Argumen1 = ", arg1, ", Argumen2 = ", arg2 return arg2 * arg1
hasil = reduce(phi_hybrid, [(1,2),3,4])
print "Hasil akhir : ", hasil Hasil Eksekusi phi_hybrid.pyArgumen1 = (1, 2) , Argumen2 = 3 Argumen1 = (1, 2, 1, 2, 1, 2) , Argumen2 = 4 Hasil akhir : (1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2)
Kesimpulan
Map dan Reduce pada Python adalah fungsi khusus sebagai dukungannya terhadap functional programming. Kedua fungsi ini memiliki kemampuan :
- Melakukan call back kepada function yang menjadi argumen pertama dari fungsi map maupun reduce
- Secara iteratif / rekursif mengambil setiap elemen dari argumen kedua fungsi map dan reduce untuk disertakan sebagai argumen untuk call back function di atas
Tidak seperti awal yang penulis perkirakan, perbedaan penting antara keduanya bukanlah hasil / output dari kedua fungsi ini. Tapi pada proses pengambilan argumen tersebut :
- Fungsi map akan mengambil semua argumen untuk diproses / dipetakan dengan fungsi callback yang telah didefinisikan sebelumnya. Setiap proses pemetaan argumen ini bersifat independen satu sama lain.
- Sedangkan fungsi reduce akan mengambil dua argumen awal untuk diproses dengan fungsi callback. Hasil outputnya akan diproses sebagai argumen pertama dan dipadankan dengan argumen selanjutnya dan diproses kembali dengan fungsi callback. Begitu seterusnya sampai tidak ada lagi argumen yang tersisa. Dengan demikian fungsi reduce bersifat dependen terhadap proses sebelumnya.
Pertanyaannya sekarang adalah, apakah proses map-reduce ini sama dengan yang diterapkan oleh Google Big Table atau Apache Hadoop ?
Rasa penasaran ini akan saya simpan dan saya jawab dalam bentuk artikel apabila hubungannya sudah jelas.
Stay Tuned !
|
 Updating...
Feris Thia, Sep 2, 2009, 11:13 PM
Feris Thia, Sep 1, 2009, 10:40 AM
Feris Thia, Sep 1, 2009, 11:37 AM
Feris Thia, Sep 1, 2009, 11:06 AM
|