Hadoop MapReduce Gabung & Kontra dengan Contoh

โšก Ringkasan Cerdas

Penggabungan MapReduce menggabungkan dua dataset besar berdasarkan kunci bersama, baik di dalam mapper maupun di dalam reducer, sementara penghitung MapReduce mengumpulkan statistik tentang pekerjaan tersebut sehingga catatan yang buruk dapat diukur daripada ditebak.

  • ๐Ÿ”˜ Cara bergabung: Dataset yang lebih kecil didistribusikan ke setiap node data dan digunakan sebagai sisi pencarian.
  • โ˜‘๏ธ Bergabung dari sisi peta: Setiap input perlu dipartisi, dibagi rata, dan diurutkan berdasarkan kunci gabungan sebelum fungsi map dijalankan.
  • โœ… Sambungan sisi reduksi: Tidak memerlukan partisi, karena setiap tuple yang memiliki kunci gabungan akan masuk ke reducer yang sama.
  • ๐Ÿงช Contoh yang dikerjakan: File DeptName.txt dan DeptStrength.txt disalin ke HDFS dan digabungkan berdasarkan Dept_ID oleh sebuah jar yang dikemas.
  • ๏ธ Jenis penghitung: Lima grup penghitung bawaan disertakan dalam setiap pekerjaan, dan penghitung yang ditentukan pengguna dideklarasikan sebagai Java enum.
  • โš ๏ธ Penggunaan di meja: Menambah satu angka pada setiap catatan yang hilang atau tidak valid mengubah masalah kualitas data menjadi angka pada laporan pekerjaan.

Tutorial Hadoop MapReduce tentang penggabungan dan penghitungan dengan contoh praktis.

Apa itu Join dalam MapReduce?

Operasi Join pada MapReduce digunakan untuk menggabungkan dua dataset besar. Namun, proses ini melibatkan penulisan banyak kode untuk melakukan operasi join yang sebenarnya. Penggabungan dua dataset dimulai dengan membandingkan ukuran masing-masing dataset. Jika satu dataset lebih kecil dibandingkan dengan dataset lainnya, maka dataset yang lebih kecil akan didistribusikan ke setiap node data dalam cluster.

Setelah bergabung PetaKurangi Jika dataset didistribusikan, baik Mapper maupun Reducer akan menggunakan dataset yang lebih kecil untuk melakukan pencarian data yang cocok dari dataset yang besar, kemudian menggabungkan data tersebut untuk membentuk data keluaran.

Jenis Gabung

Tergantung pada tempat di mana operasi join sebenarnya dilakukan, operasi join di Hadoop diklasifikasikan menjadi dua jenis.

  1. Gabung sisi peta โ€” Ketika operasi join dilakukan oleh mapper, ini disebut map-side join. Pada tipe ini, operasi join dilakukan sebelum data benar-benar digunakan oleh fungsi map. Input untuk setiap map wajib berupa partisi dan dalam urutan terurut. Selain itu, jumlah partisi harus sama dan harus diurutkan berdasarkan kunci join.
  2. Sambungan sisi bawah โ€” Ketika operasi join dilakukan oleh reducer, ini disebut join sisi reduce. Dalam join ini, tidak perlu memiliki dataset dalam bentuk terstruktur (atau terpartisi). Di sini, pemrosesan sisi map menghasilkan kunci join dan tuple yang sesuai dari kedua tabel. Sebagai efek dari pemrosesan ini, semua tuple dengan kunci join yang sama masuk ke reducer yang sama, yang kemudian menggabungkan record dengan kunci join yang sama.

Alur proses keseluruhan gabungan di Hadoop digambarkan dalam diagram di bawah ini.

Diagram alur proses yang membandingkan join sisi map dengan join sisi reduce di Hadoop.
Jenis Gabungan di Hadoop MapReduce

Setelah kedua varian tersebut jelas, bagian selanjutnya akan membahas cara melakukan reduce-side join pada dua berkas departemen kecil.

Cara Menggabungkan dua Kumpulan Data: Contoh MapReduce

Terdapat dua set data dalam dua file berbeda (seperti yang ditunjukkan di bawah). Kunci Dept_ID terdapat di kedua file tersebut. Tujuannya adalah menggunakan MapReduce Join untuk menggabungkan file-file ini.

File input pertama berisi daftar ID departemen beserta nama departemen.

File 1
File input kedua berisi daftar ID departemen beserta nilai kekuatan departemen.

File 2

Memasukkan: Kumpulan data masukan berupa file txt, DeptName.txt & DeptStrength.txt

Unduh File Masukan Dari Sini

Pastikan Anda memilikinya Hadoop Terinstal. Sebelum Anda memulai proses sebenarnya dari contoh MapReduce Join, ubah pengguna menjadi 'hduser' (ID yang digunakan selama konfigurasi Hadoop, Anda dapat beralih ke ID pengguna yang digunakan selama konfigurasi Hadoop Anda).

su - hduser_

Perintah tersebut mengubah akun Hadoop, seperti yang ditunjukkan di bawah ini.

Terminal setelah beralih ke akun hduser dengan perintah su

Langkah 1) Salin file zip ke lokasi pilihan Anda

Arsip MapReduceJoin yang diunduh ditempatkan di direktori kerja yang dipilih.

Langkah 2) Buka kompresi File Zip

sudo tar -xvf MapReduceJoin.tar.gz

Sang mantantracNama-nama file yang telah diedit bergulir saat tar mengekstrak arsip.

Daftar file di konsol, misalnyatracted dari MapReduceJoin.tar.gz

Langkah 3) Masuk ke direktori MapReduceJoin/

cd MapReduceJoin/

Prompt shell setelah masuk ke direktori MapReduceJoin

Langkah 4) Mulai Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Kedua skrip tersebut mencetak daemon yang mereka jalankan.

Pesan-pesan saat startup dari skrip daemon HDFS dan YARN

Langkah 5) DeptStrength.txt dan DeptName.txt adalah file input yang digunakan untuk program contoh MapReduce Join ini.

File-file ini perlu disalin ke HDFS menggunakan perintah di bawah ini-

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /

Kedua file teks input disalin ke direktori root HDFS.

Langkah 6) Jalankan program menggunakan perintah di bawah ini-

$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin

Perintah tersebut akan ditampilkan terlebih dahulu, dan kemudian proses akan melaporkan kemajuannya di konsol.

Baris perintah untuk menjalankan file jar MapReduceJoin yang telah dikemas.

Keluaran konsol tracraja kemajuan pekerjaan penggabungan MapReduce

Langkah 7) Setelah eksekusi, file output (bernama 'part-00000') akan disimpan di direktori /output_mapreducejoin pada HDFS.

Hasilnya dapat dilihat menggunakan antarmuka baris perintah

$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000

Menggabungkan catatan departemen yang dicetak dari HDFS oleh perintah cat

Hasilnya juga dapat dilihat melalui antarmuka web sebagai-

Halaman beranda antarmuka web Hadoop yang digunakan untuk mengakses penjelajah sistem file.

Sekarang pilih 'Jelajahi sistem file' dan navigasikan ke atas ke /output_mapreducejoin

Menjelajahi tampilan sistem file HDFS ke direktori output_mapreducejoin

Buka bagian r-00000

Memilih file output part-r-00000 di dalam tampilan browser.

Hasil ditampilkan

Baris nama departemen gabungan dan jumlah personel departemen ditampilkan di browser.

CATATAN: Harap dicatat bahwa sebelum menjalankan program ini untuk kali berikutnya, Anda perlu menghapus direktori keluaran /output_mapreducejoin

$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin

Alternatifnya adalah dengan menggunakan nama yang berbeda untuk direktori keluaran.

Join memberi tahu Anda seperti apa data tersebut. Counter, yang akan dibahas selanjutnya, memberi tahu Anda bagaimana kinerja proses yang menghasilkan data tersebut.

Apa itu Penghitung di MapReduce?

Counter dalam MapReduce adalah mekanisme yang digunakan untuk mengumpulkan dan mengukur informasi statistik tentang pekerjaan dan peristiwa MapReduce. Counter menyimpan informasi tentang hal ini. track merupakan berbagai statistik pekerjaan di MapReduce seperti jumlah operasi yang terjadi dan kemajuan operasi. Counter digunakan untuk mendiagnosis masalah di MapReduce.

Penghitung Hadoop mirip dengan memasukkan pesan log ke dalam kode untuk peta atau pengurangan. Informasi ini dapat berguna untuk mendiagnosis masalah dalam pemrosesan pekerjaan MapReduce.

Biasanya, penghitung ini di Hadoop didefinisikan dalam sebuah program (map atau reduce) dan akan bertambah nilainya selama eksekusi ketika suatu peristiwa atau kondisi tertentu (spesifik untuk penghitung tersebut) terjadi. Salah satu aplikasi yang sangat baik dari penghitung Hadoop adalah untuk track catatan valid dan tidak valid dari kumpulan data masukan.

Jenis Penghitung MapReduce

Pada dasarnya ada 2 jenis penghitung MapReduce.

  1. Penghitung bawaan Hadoop: Ada beberapa penghitung Hadoop bawaan yang ada per pekerjaan. Di bawah ini adalah grup penghitung bawaan-
    • Penghitung Tugas MapReduce โ€” Mengumpulkan informasi spesifik tugas (misalnya, jumlah catatan masukan) selama waktu eksekusinya.
    • Penghitung Sistem File โ€” Mengumpulkan informasi seperti jumlah byte yang dibaca atau ditulis oleh suatu tugas.
    • Penghitung FileInputFormat โ€” Mengumpulkan informasi sejumlah byte yang dibaca melalui FileInputFormat.
    • Penghitung FileOutputFormat โ€” Mengumpulkan informasi sejumlah byte yang ditulis melalui FileOutputFormat.
    • Penghitung Pekerjaan โ€” Penghitung ini mencatat statistik keseluruhan pekerjaan, seperti jumlah tugas yang diluncurkan untuk suatu pekerjaan.
  2. Penghitung yang ditentukan pengguna: Selain penghitung bawaan, pengguna dapat mendefinisikan penghitungnya sendiri menggunakan fungsi serupa yang disediakan oleh bahasa pemrograman. Misalnya, dalam Java, sebuah 'enum' digunakan untuk mendefinisikan penghitung yang ditentukan pengguna.

๐Ÿ’ก Catatan versi: Penghitung lowongan pekerjaan dikelola oleh Job.Tracker di bawah MRv1. Di YARN, peran itu dimiliki oleh MapReduce ApplicationMaster, jadi nama penghitung tetap ada tetapi komponen yang melaporkannya telah berubah.

Suatu pekerjaan tidak dapat menyatakan jumlah penghitung yang tidak terbatas. mapreduce.job.counters.max Pengaturan ini membatasi total per pekerjaan hingga 120 secara default, dan pekerjaan yang menyatakan lebih dari itu akan gagal dengan pesan kesalahan. LimitExceededExceptionJadi, penghitung dimaksudkan untuk sejumlah sinyal agregat, bukan penghitungan per kunci.

Contoh Penghitung

Contoh MapClass dengan Counter untuk menghitung jumlah nilai yang hilang dan tidak valid. File data input yang digunakan dalam tutorial ini. Kumpulan data input kami adalah file CSV, SalesJan2009.csv

public static class MapClass
            extends MapReduceBase
            implements Mapper<LongWritable, Text, Text, Text>
{
    static enum SalesCounters { MISSING, INVALID };
    public void map ( LongWritable key, Text value,
                 OutputCollector<Text, Text> output,
                 Reporter reporter) throws IOException
    {
        
        //Input string is split using ',' and stored in 'fields' array
        String fields[] = value.toString().split(",", -20);
        //Value at 4th index is country. It is stored in 'country' variable
        String country = fields[4];
        
        //Value at 8th index is sales data. It is stored in 'sales' variable
        String sales = fields[8];
      
        if (country.length() == 0) {
            reporter.incrCounter(SalesCounters.MISSING, 1);
        } else if (sales.startsWith("\"")) {
            reporter.incrCounter(SalesCounters.INVALID, 1);
        } else {
            output.collect(new Text(country), new Text(sales + ",1"));
        }
    }
}

Cuplikan kode di atas menunjukkan contoh implementasi penghitung di Hadoop MapReduce.

Di sini, Penghitung Penjualan adalah penghitung yang didefinisikan menggunakan 'enum'. Ini digunakan untuk menghitung data input yang HILANG dan TIDAK VALID.

Dalam cuplikan kode, jika 'negaraJika kolom tersebut memiliki panjang nol, maka nilainya hilang dan oleh karena itu penghitung yang sesuai, SalesCounters.MISSING, akan bertambah.

Selanjutnya, jika 'penjualanJika kolom ' diawali dengan tanda โ€œ maka catatan tersebut dianggap TIDAK VALID. Hal ini ditunjukkan dengan bertambahnya penghitung SalesCounters.INVALID.

๐Ÿ’ก Catatan API: Cuplikan di atas menggunakan yang asli org.apache.hadoop.mapred API, di mana MapReduceBase, yang Mapper antarmuka, OutputCollector ke Reporter muncul secara terpisah. Kode saat ini ditulis terhadap org.apache.hadoop.mapreduce, di mana satu Context menggantikan kolektor dan pelapor, dan sebuah penghitung bertambah dengan context.getCounter(SalesCounters.MISSING).increment(1)Konsep penghitungnya identik di keduanya.

Pertanyaan Umum Demo Slot

Pilih varian mapper ketika salah satu sisi cukup kecil untuk disimpan dalam memori di setiap node, karena varian ini sepenuhnya melewati proses shuffle. Pilih varian reducer ketika kedua sisi berukuran besar atau tidak terurut, dan terima biaya jaringan tambahan.

Model-model tersebut belajar dari riwayat pekerjaan sebelumnya untuk memprediksi waktu eksekusi, merekomendasikan ukuran pemisahan dan jumlah reducer, serta mendeteksi penyimpangan dari nilai penghitung. Mereka juga menandai pekerjaan yang penghitung catatan yang tumpah atau tugas yang gagalnya menyimpang di luar rentang normal untuk pipeline tersebut.

Copilot menghasilkan kerangka mapper dan reducer yang masuk akal, tetapi ia dengan bebas mencampur paket mapred lama dengan paket mapreduce yang lebih baru dalam satu kelas, yang tidak akan dapat dikompilasi. Perbaiki impor dan tanda tangan metode sebelum mempercayai logikanya.

Ini adalah mekanisme yang mengirimkan file yang lebih kecil ke setiap node sebelum tugas dimulai. Setiap mapper kemudian memuat salinan tersebut ke dalam hash map dan mencari kecocokan secara lokal, yang memungkinkan terjadinya join di sisi mapper.

Informasi tersebut dicetak dalam ringkasan konsol ketika pekerjaan selesai, ditampilkan dalam riwayat pekerjaan dan halaman web pengelola sumber daya, serta dapat dibaca secara terprogram dari objek pekerjaan, sehingga driver dapat memverifikasinya dan menyebabkan kegagalan jika terjadi kesalahan.

Sebuah objek Context tunggal. Objek ini menjalankan tugas yang sebelumnya dibagi antara OutputCollector dan Reporter, sehingga output ditulis dan penghitung ditambah melalui handle yang sama yang diteruskan ke metode map.

Untuk sebagian besar pekerjaan pelaporan, tidak. Gabung HiveQL Kode tersebut dikompilasi menjadi pola pengacakan dan penggabungan yang sama dalam beberapa baris. Pekerjaan yang ditulis secara manual layak dilakukan ketika logika penggabungan tidak sesuai dengan klausa SQL.

Hadoop menolak untuk menulis ke direktori keluaran yang sudah ada, yang melindungi hasil akhir agar tidak ditimpa. Hapus direktori secara rekursif terlebih dahulu, atau berikan jalur keluaran yang berbeda pada eksekusi berikutnya.

Ringkaslah postingan ini dengan: