Python‎ > ‎

Map - Reduce











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

def phi_kuadrat(arg1):
    return arg1 * arg1

hasil = map(phi_kuadrat, [1,2,3])

print hasil


Hasil Eksekusi kuadrat.py

[1, 4, 9]

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

def 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

[2, 6, 12, 20]

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 Xdan Xsebagai 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.py

def 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.py

Argumen1 =  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_hybrid

def 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.py

Argumen1 =  (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 !


ċ
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
Comments