Hadoop menggunakan model pemrograman MapReduce untuk pemrosesan data input dan output untuk peta dan untuk mengurangi fungsi yang direpresentasikan sebagai pasangan nilai kunci. Mereka tunduk pada eksekusi paralel dari kumpulan data yang terletak di beragam mesin dalam arsitektur terdistribusi. Paradigma pemrograman pada hakikatnya bersifat fungsional dalam menggabungkan dengan menggunakan teknik map and reduce. Artikel ini memperkenalkan model MapReduce, dan khususnya, bagaimana data dalam berbagai format, dari teks sederhana hingga objek biner terstruktur digunakan.
Jenis MapReduce
Pemetaan adalah teknik inti untuk memproses daftar elemen data yang berpasangan dengan kunci dan nilai. Fungsi peta berlaku untuk elemen individual yang didefinisikan sebagai pasangan nilai kunci dari daftar dan menghasilkan daftar baru. Gambaran umum fungsi peta dan reduksi Hadoop dapat diilustrasikan sebagai berikut:
map: (K1, V1) -> list (K2, V2) reduce: (K2, list(V2)) -> list (K3, V3)
Parameter input dari pasangan kunci dan nilai, masing-masing diwakili oleh K1 dan V1, berbeda dari jenis pasangan output:K2 dan V2. Fungsi pengurangan menerima output format yang sama oleh peta, tetapi jenis output lagi dari operasi pengurangan berbeda:K3 dan V3. Java API untuk ini adalah sebagai berikut:
public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable { void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter) throws IOException; } public interface Reducer<K2, V2, K3, V3> extends JobConfigurable, Closeable { void reduce(K2 key, Iterator<V2> values, OutputCollector<K3, V3> output, Reporter reporter)throws IOException; }
Kolektor Keluaran adalah antarmuka umum dari kerangka kerja Pengurangan Peta untuk memfasilitasi pengumpulan keluaran data baik oleh Mapper atau Peredam . Keluaran ini tidak lain adalah keluaran perantara dari pekerjaan. Oleh karena itu, mereka harus diparameterisasi dengan jenisnya. Wartawan memfasilitasi aplikasi Map-Reduce untuk melaporkan kemajuan dan memperbarui penghitung dan informasi status. Namun, jika fungsi kombinasi digunakan, ia memiliki bentuk yang sama dengan fungsi reduksi dan output diumpankan ke fungsi reduksi. Hal ini dapat digambarkan sebagai berikut:
map: (K1, V1) -> list (K2, V2) combine: (K2, list(V2)) -> list (K2, V2) reduce: (K2, list(V2)) -> list (K3, V3)
Perhatikan bahwa fungsi kombinasi dan pengurangan menggunakan tipe yang sama, kecuali pada nama variabel di mana K3 adalah K2 dan V3 adalah V2.
Fungsi partisi beroperasi pada tipe nilai kunci perantara. Ini mengontrol partisi kunci dari output peta perantara. Kuncinya mendapatkan partisi menggunakan fungsi hash yang khas. Jumlah total partisi sama dengan jumlah tugas pengurangan untuk pekerjaan itu. Partisi hanya ditentukan oleh kunci yang mengabaikan nilainya.
public interface Partitioner<K2, V2> extends JobConfigurable { int getPartition(K2 key, V2 value, int numberOfPartition); }
Ini adalah esensi utama dari tipe MapReduce secara singkat.
Format Masukan
Hadoop harus menerima dan memproses berbagai format, dari file teks hingga database. Sepotong input, yang disebut pembagian input , diproses oleh satu peta. Setiap pemisahan selanjutnya dibagi menjadi catatan logis yang diberikan ke peta untuk diproses dalam pasangan nilai kunci. Dalam konteks database, pemisahan berarti membaca rentang tupel dari tabel SQL, seperti yang dilakukan oleh DBInputFormat dan memproduksi LongWritables berisi nomor record sebagai kunci dan DBWritables sebagai nilai. Java API untuk input split adalah sebagai berikut:
public interface InputSplit extends Writable { long getLength() throws IOException; String[] getLocations() throws IOException; }
InputSplit mewakili data yang akan diproses oleh Mapper . Ini mengembalikan panjang dalam byte dan memiliki referensi ke data input. Ini menyajikan tampilan berorientasi byte pada input dan merupakan tanggung jawab RecordReader pekerjaan untuk memproses ini dan menyajikan pandangan berorientasi catatan. Dalam kebanyakan kasus, kami tidak menangani InputSplit langsung karena dibuat oleh InputFormat . Ini adalah tanggung jawab InputFormat untuk membuat pemisahan input dan membaginya menjadi catatan.
public interface InputFormat<K, V> { InputSplit[] getSplits(JobConf job, int numSplits) throws IOException; RecordReader<K, V> getRecordReader(InputSplit split, JobConf job, throws IOException; }
JobClient memanggil getSplits() metode dengan jumlah argumen split yang sesuai. Angka yang diberikan adalah petunjuk karena jumlah pembagian sebenarnya mungkin berbeda dari angka yang diberikan. Setelah pembagian dihitung, itu dikirim ke pelacak pekerjaan. Jobtracker menjadwalkan tugas peta untuk tasktracker menggunakan lokasi penyimpanan. Pelacak tugas kemudian meneruskan pemisahan dengan menjalankan getRecordReader() metode pada InputFormat untuk mendapatkan Pembaca Rekaman untuk perpisahan.
FileInputFormat adalah kelas dasar untuk sumber data file. Ini memiliki tanggung jawab untuk mengidentifikasi file yang akan dimasukkan sebagai input pekerjaan dan definisi untuk menghasilkan pemisahan.
Hadoop juga mencakup pemrosesan data tidak terstruktur yang sering datang dalam format tekstual. TextInputFormat adalah default InputFormat untuk data tersebut.
SequenceInputFormat mengambil input biner dan menyimpan urutan pasangan nilai kunci biner.
Demikian pula, DBInputFormat menyediakan kemampuan untuk membaca data dari database relasional menggunakan JDBC.
Format Keluaran
Kelas format output mirip dengan kelas format input yang sesuai dan bekerja dalam arah sebaliknya.
Misalnya, TextOutputFormat adalah format output default yang menulis record sebagai file teks biasa, sedangkan nilai kunci apa saja dari jenis apa pun, dan mengubahnya menjadi string dengan menjalankan toString() metode. Karakter nilai kunci dipisahkan oleh karakter tab, meskipun ini dapat disesuaikan dengan memanipulasi properti pemisah dari format output teks.
Untuk keluaran biner, ada SequenceFileOutputFormat untuk menulis urutan keluaran biner ke file. Output biner sangat berguna jika output menjadi input untuk pekerjaan MapReduce selanjutnya.
Format output untuk database relasional dan ke HBase ditangani oleh DBOutputFormat . Ini mengirimkan output yang dikurangi ke tabel SQL. Misalnya, TableOutputFormat HBase memungkinkan program MapReduce untuk bekerja pada data yang disimpan dalam tabel HBase dan menggunakannya untuk menulis output ke tabel HBase.
Kesimpulan
Singkatnya, ini adalah inti dari jenis dan format MapReduce. Lihat daftar dalam referensi di bawah ini untuk mendapatkan detail lebih lanjut tentang mereka. Ada banyak detail rumit tentang fungsi Java API yang menjadi lebih jelas hanya ketika seseorang mendalami pemrograman. Lihat dokumen Apache Hadoop Java API untuk detail selengkapnya dan mulailah mengkodekan beberapa praktik.
Referensi
- Tom White, Hadoop Panduan Definitif , O'Reilly
- Apache Hadoop Java API Documents