You are here

Dapatkah sebuah task MapReduce menulis/menyimpan file langsung ke HDFS?

Apakah sebuah task MapReduce dapat langsung menulis atau menyimpan file langsung ke dalam HDFS ?

Tentu bisa, karena kita tentu perlu menulis/menyimpan ke file selain output yang dihasilkan oleh OutputCollector.

Beberapa hal yang perlu diperhatikan:
${mapred.output.dir} adalah direktori output terakhir dari sebuah job (JobConf.setOutputPath / JobConf.getOutputPath).
${taskid} adalah id sesungguhnya dari sebuah task-attempt (misalnya task_200709221812_0001_m_000000_0), a TIP adalah sekumpulan ${taskid}s (misalnya task_200709221812_0001_m_000000).

Dengan speculative-execution on, mungkin timbul permasalahan adanya 2 instance dengan TIP yang sama (berjalan dalam waktu bersamaan) yang mencoba membaca/menulis ke file (path) yang sama di hdfs. Sehingga developer harus memilih nama yang unique untuk tiap task-attempt (misalnya menggunakan taskid), dan bukan hanya menggunakan TIP.
Untuk mengatasi hal ini, framework membantu developer dengan cara me-mantain sub-dir ${mapred.output.dir}/_${taskid} di hdfs untuk tiap reduce task-attempt untuk menyimpan output dari task-attempt reduce.
Ketika task-attempt selesai dengan sukses, file-file di ${mapred.output.dir}/_${taskid} milik task-attempt yang sukses akan dipindah ke ${mapred.output.dir}, dan membuang sub direktori dari task-attempt yang gagal. Proses ini transparan terhadap aplikasi.

Developer dapat memanfaaatkan mekanisme ini dengan menulis file-file yang diperlukan di ${mapred.output.dir} pada saat eksekusi reduce-task dan framework akan memindahkannya, sehingga tidak perlu menentukan path khusus untuk setiap task-attempt.
Catatan : nilai ${mapred.output.dir} selama eksekusi sebuah reduce task-attempt sebenarnya adalah ${mapred.output.dir}/_{$taskid}, dan bukan nilai yang di-set JobConf.setOutputPath. Jadi, simpan file di ${mapred.output.dir} dari task reduce anda untuk memanfaatkan fitur ini.

Untuk map task attempt, tidak ada substitusi otomatis ${mapred.output.dir} ke ${mapred.output.dir}/_${taskid}. Untuk mengakses direktori map task attempt, gunakan FileOutputFormat.getWorkOutputPath(TaskInputOutputContext).

Seluruh kasus di atas adalah untuk maps job dengan reducer=NONE (yaitu map jobs dengan reduces 0), karena output map untuk kasus ini langsung disimpan di hdfs.