Dalam banyak situasi kehidupan nyata di mana Anda menerapkan MapReduce, algoritme akhir menjadi beberapa langkah MapReduce.
yaitu Map1, Reduce1, Map2, Reduce2, dan seterusnya.
Jadi Anda memiliki keluaran dari pengurangan terakhir yang diperlukan sebagai masukan untuk peta berikutnya.
Data perantara adalah sesuatu yang (secara umum) tidak ingin Anda simpan setelah pipeline berhasil diselesaikan. Juga karena data perantara ini pada umumnya adalah beberapa struktur data (seperti 'peta' atau 'kumpulan'), Anda tidak ingin terlalu banyak berusaha dalam menulis dan membaca pasangan nilai-kunci ini.
Apa cara yang disarankan untuk melakukan itu di Hadoop?
Apakah ada contoh (sederhana) yang menunjukkan cara menangani data perantara ini dengan cara yang benar, termasuk pembersihan sesudahnya?
Jawaban:
Saya rasa tutorial di jaringan pengembang Yahoo ini akan membantu Anda dalam hal ini: Merangkai Pekerjaan
Anda menggunakan
JobClient.runJob()
. Jalur keluaran data dari pekerjaan pertama menjadi jalur masukan ke pekerjaan kedua Anda. Ini perlu diteruskan sebagai argumen ke pekerjaan Anda dengan kode yang sesuai untuk menguraikannya dan menyiapkan parameter untuk pekerjaan itu.Saya pikir metode di atas mungkin bagaimanapun cara API mapred yang sekarang lebih tua melakukannya, tetapi itu masih harus berfungsi. Akan ada metode serupa di API mapreduce baru tapi saya tidak yakin apa itu.
Sejauh menghapus data perantara setelah pekerjaan selesai, Anda dapat melakukan ini di kode Anda. Cara saya melakukannya sebelumnya menggunakan sesuatu seperti:
Dimana path adalah lokasi pada data HDFS. Anda perlu memastikan bahwa Anda hanya menghapus data ini setelah tidak ada pekerjaan lain yang membutuhkannya.
sumber
Ada banyak cara untuk melakukannya.
(1) Pekerjaan bertingkat
Buat objek JobConf "job1" untuk pekerjaan pertama dan setel semua parameter dengan "input" sebagai direktori input dan "temp" sebagai direktori output. Jalankan pekerjaan ini:
Tepat di bawahnya, buat objek JobConf "job2" untuk pekerjaan kedua dan setel semua parameter dengan "temp" sebagai direktori masukan dan "keluaran" sebagai direktori keluaran. Jalankan pekerjaan ini:
(2) Buat dua objek JobConf dan setel semua parameter di dalamnya seperti (1) kecuali Anda tidak menggunakan JobClient.run.
Kemudian buat dua objek Job dengan jobconfs sebagai parameter:
Dengan menggunakan objek jobControl, Anda menentukan dependensi pekerjaan, lalu menjalankan pekerjaan:
(3) Jika Anda membutuhkan struktur seperti Map + | Kurangi | Map *, Anda dapat menggunakan kelas ChainMapper dan ChainReducer yang disertakan dengan Hadoop versi 0.19 dan seterusnya.
sumber
Sebenarnya ada beberapa cara untuk melakukan ini. Saya akan fokus pada dua.
Salah satunya adalah melalui Riffle ( http://github.com/cwensel/riffle ) pustaka anotasi untuk mengidentifikasi hal-hal yang bergantung dan 'mengeksekusinya' dalam urutan ketergantungan (topologis).
Atau Anda dapat menggunakan Cascade (dan MapReduceFlow) di Cascading ( http://www.cascading.org/ ). Versi mendatang akan mendukung anotasi Riffle, tetapi berfungsi dengan baik sekarang dengan pekerjaan MR JobConf mentah.
Variannya adalah tidak mengelola tugas MR secara manual, tetapi mengembangkan aplikasi Anda menggunakan Cascading API. Kemudian JobConf dan rantai pekerjaan ditangani secara internal melalui perencana Cascading dan kelas Flow.
Dengan cara ini Anda menghabiskan waktu Anda untuk fokus pada masalah Anda, bukan pada mekanisme mengelola pekerjaan Hadoop dll. Anda bahkan dapat melapisi bahasa yang berbeda di atas (seperti clojure atau jruby) untuk lebih menyederhanakan pengembangan dan aplikasi Anda. http://www.cascading.org/modules.html
sumber
Saya telah melakukan rangkaian pekerjaan menggunakan objek JobConf satu demi satu. Saya mengambil contoh WordCount untuk merangkai pekerjaan. Satu pekerjaan menghitung berapa kali sebuah kata diulangi dalam keluaran yang diberikan. Pekerjaan kedua mengambil keluaran pekerjaan pertama sebagai masukan dan menghitung total kata dalam masukan yang diberikan. Di bawah ini adalah kode yang perlu ditempatkan di kelas Driver.
Perintah untuk menjalankan pekerjaan ini adalah:
bin / toples hadoop TotalWords.
Kita perlu memberikan nama tugas akhir untuk perintah tersebut. Dalam kasus di atas, ini adalah TotalWords.
sumber
Anda dapat menjalankan rantai MR dengan cara seperti yang diberikan dalam kode.
HARAP DICATAT : Hanya kode driver yang telah disediakan
THE SEQUENCE IS
( JOB1 ) MAP-> REDUCE-> ( JOB2 ) MAP
Ini dilakukan untuk menyortir kunci namun ada lebih banyak cara seperti menggunakan peta hierarki.
Namun saya ingin memfokuskan perhatian Anda ke cara Pekerjaan telah dirantai! !
Terima kasih
sumber
Anda dapat menggunakan oozie untuk pemrosesan barch pekerjaan MapReduce Anda. http://issues.apache.org/jira/browse/HADOOP-5303
sumber
Ada contoh dalam proyek Apache Mahout yang menggabungkan beberapa pekerjaan MapReduce. Salah satu contohnya dapat ditemukan di:
RecommenderJob.java
http://search-lucene.com/c/Mahout:/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java%7C%7CRecommenderJob
sumber
Kita dapat menggunakan
waitForCompletion(true)
metode Job untuk menentukan ketergantungan di antara pekerjaan.Dalam skenario saya, saya memiliki 3 pekerjaan yang bergantung satu sama lain. Di kelas pengemudi saya menggunakan kode di bawah ini dan berfungsi seperti yang diharapkan.
sumber
Kelas baru org.apache.hadoop.mapreduce.lib.chain.ChainMapper membantu skenario ini
sumber
Meskipun ada mesin alur kerja Hadoop berbasis server yang kompleks misalnya, oozie, saya memiliki pustaka java sederhana yang memungkinkan eksekusi beberapa pekerjaan Hadoop sebagai alur kerja. Konfigurasi pekerjaan dan alur kerja yang menentukan ketergantungan antar pekerjaan dikonfigurasikan dalam file JSON. Semuanya dapat dikonfigurasi secara eksternal dan tidak memerlukan perubahan apa pun dalam peta yang ada, kurangi implementasi menjadi bagian dari alur kerja.
Detailnya dapat ditemukan disini. Kode sumber dan jar tersedia di github.
http://pkghosh.wordpress.com/2011/05/22/hadoop-orchestration/
Pranab
sumber
Menurut saya, oozie membantu pekerjaan selanjutnya untuk menerima masukan langsung dari pekerjaan sebelumnya. Ini untuk menghindari operasi I / o yang dilakukan dengan kontrol kerja.
sumber
Jika Anda ingin merantai pekerjaan secara terprogram, Anda perlu menggunakan JobControl. Penggunaannya cukup sederhana:
Setelah itu Anda menambahkan instance ControlledJob. ControlledJob mendefinisikan pekerjaan dengan dependensinya, sehingga secara otomatis memasukkan input dan output agar sesuai dengan "rantai" pekerjaan.
memulai rantai. Anda akan ingin memasukkannya ke dalam utas yang lebih cepat. Ini memungkinkan untuk memeriksa status rantai Anda saat berjalan:
sumber
Seperti yang telah Anda sebutkan dalam kebutuhan Anda bahwa Anda ingin output daya MRJob1 menjadi i / p MRJob2 dan seterusnya, Anda dapat mempertimbangkan untuk menggunakan alur kerja oozie untuk kasus penggunaan ini. Anda juga dapat mempertimbangkan untuk menulis data perantara Anda ke HDFS karena akan digunakan oleh MRJob berikutnya. Dan setelah pekerjaan selesai, Anda dapat membersihkan data perantara Anda.
sumber