Hadoop MapReduce Katıl ve Örnekle Say

⚡ Akıllı Özet

MapReduce birleştirmeleri, eşleyici (mapper) veya indirgeyici (reducer) içinde, paylaşılan bir anahtar üzerinden iki büyük veri setini birleştirirken, MapReduce sayaçları ise hatalı kayıtların tahmin edilmek yerine ölçülebilmesi için işlemle ilgili istatistikler toplar.

  • 🔘 Katılımın temel bilgileri: İki veri setinden daha küçük olanı her veri düğümüne dağıtılır ve arama tarafı olarak kullanılır.
  • ☑️ Harita tarafında birleştirme: Haritalama fonksiyonu çalıştırılmadan önce her girdinin bölümlere ayrılması, eşit olarak bölünmesi ve birleştirme anahtarına göre sıralanması gerekir.
  • ✅ Yan birleştirmeyi azalt: Bölümlemeye gerek yok, çünkü birleştirme anahtarını paylaşan her demet aynı indirgeyiciye düşüyor.
  • 🧪 Çalışılmış örnek: DeptName.txt ve DeptStrength.txt dosyaları HDFS'ye kopyalanır ve paketlenmiş bir jar dosyası kullanılarak Dept_ID üzerinden birleştirilir.
  • ️ Sayaç türleri: Her iş ile birlikte beş adet yerleşik sayaç grubu gönderilir ve kullanıcı tanımlı sayaçlar şu şekilde belirtilir: Java Sıralama.
  • ⚠️ Tezgah kullanımı: Eksik veya geçersiz her kayıt için bir sayacı artırmak, veri kalitesi sorunlarını iş raporunda bir sayıya dönüştürür.

Hadoop MapReduce'da birleştirme (join) ve sayaç (counter) işlemleriyle ilgili örnek uygulamalı eğitim

MapReduce'da JOIN nedir?

MapReduce birleştirme işlemi, iki büyük veri setini birleştirmek için kullanılır. Ancak bu işlem, gerçek birleştirme işlemini gerçekleştirmek için çok fazla kod yazmayı gerektirir. İki veri setinin birleştirilmesi, her veri setinin boyutunun karşılaştırılmasıyla başlar. Bir veri seti diğerine göre daha küçükse, daha küçük olan veri seti kümedeki her veri düğümüne dağıtılır.

Bir kez katıldıktan sonra Harita indirgeme Dağıtılmış veri söz konusu olduğunda, Eşleyici (Mapper) veya İndirgeyici (Reducer) daha küçük veri setini kullanarak büyük veri setinden eşleşen kayıtları arar ve ardından bu kayıtları birleştirerek çıktı kayıtlarını oluşturur.

Üyelik Türleri

Hadoop'ta birleştirme işlemleri, birleştirmenin gerçekleştirildiği yere bağlı olarak iki türe ayrılır.

  1. Harita tarafında katılma — Birleştirme işlemi eşleyici (mapper) tarafından gerçekleştirildiğinde, buna eşleyici tarafı birleştirme (map-side join) denir. Bu türde, birleştirme işlemi veriler eşleme fonksiyonu tarafından gerçekten tüketilmeden önce gerçekleştirilir. Her eşlemeye verilen girdinin bölümleme (partition) biçiminde ve sıralı olması zorunludur. Ayrıca, eşit sayıda bölümleme olmalı ve birleştirme anahtarına göre sıralanmalıdır.
  2. Yan birleştirmeyi azaltın — Birleştirme işlemi indirgeyici tarafından yapıldığında, buna indirgeme tarafı birleştirme denir. Bu birleştirmede veri setinin yapılandırılmış (veya bölümlenmiş) bir biçimde olması gerekmez. Burada, eşleme tarafı işleme, birleştirme anahtarını ve her iki tablonun karşılık gelen kayıtlarını üretir. Bu işlemin bir sonucu olarak, aynı birleştirme anahtarına sahip tüm kayıtlar aynı indirgeyiciye düşer ve bu indirgeyici daha sonra aynı birleştirme anahtarına sahip kayıtları birleştirir.

Hadoop'taki birleştirmelerin genel süreç akışı aşağıdaki şemada gösterilmektedir.

Hadoop'ta map tarafındaki birleştirmeyi reduce tarafındaki birleştirmeyle karşılaştıran işlem akış diyagramı.
Hadoop MapReduce'ta Birleştirme Türleri

İki varyant netleştikten sonra, bir sonraki bölümde iki küçük departman dosyasında azaltma tarafı birleştirme işlemi ele alınacaktır.

İki Veri Kümesine Nasıl Birleştirilir: MapReduce Örneği

Aşağıda gösterilen iki farklı dosyada iki veri seti bulunmaktadır. Her iki dosyada da ortak olan anahtar Dept_ID'dir. Amaç, bu dosyaları birleştirmek için MapReduce Join kullanmaktır.

İlk giriş dosyası, departman adlarının yanında departman kimlik numaralarını listeler.

1 Dosya
Departman kimlik numaralarını ve departman personel sayılarını listeleyen ikinci giriş dosyası.

2 Dosya

Giriş: Giriş veri seti, DeptName.txt ve DeptStrength.txt adlı iki metin dosyasından oluşmaktadır.

Giriş Dosyalarını Buradan İndirin

Sahip olduğunuzdan emin olun Hadoop'un Kurulumu tamamladıktan sonra, MapReduce Join örneği gerçek işlemine başlamadan önce kullanıcıyı 'hduser' olarak değiştirin (Hadoop yapılandırması sırasında kullanılan kimlik, Hadoop yapılandırmanız sırasında kullandığınız kullanıcı kimliğine geçebilirsiniz).

su - hduser_

Aşağıda gösterildiği gibi, komut istemi Hadoop hesabına değişiyor.

su komutuyla hduser hesabına geçtikten sonra terminal.

) 1 Adım Zip dosyasını istediğiniz konuma kopyalayın

İndirilen MapReduceJoin arşivi seçilen çalışma dizinine yerleştirildi.

) 2 Adım Sıkıştırılmış Dosyayı Açın

sudo tar -xvf MapReduceJoin.tar.gz

EskitracTar arşivi açarken dosya adları ekranda beliriyor.

Dosyaların konsolda listelenmesi örneğitracted from MapReduceJoin.tar.gz

) 3 Adım MapReduceJoin/ dizinine gidin

cd MapReduceJoin/

MapReduceJoin dizinine geçtikten sonraki kabuk komut istemi

) 4 Adım Hadoop'u başlat

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

Her iki komut dosyası da başlattıkları arka plan işlemlerini yazdırır.

HDFS ve YARN arka plan programı komut dosyalarından gelen başlangıç ​​mesajları

) 5 Adım DeptStrength.txt ve DeptName.txt, bu MapReduce join örnek programı için kullanılan giriş dosyalarıdır.

Bu dosyaların kopyalanması gerekiyor. HDFS Aşağıdaki komutu kullanarak-

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

Her iki giriş metin dosyası da HDFS kök dizinine kopyalandı.

) 6 Adım Aşağıdaki komutu kullanarak programı çalıştırın-

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

Komut önce ekrana yazdırılır ve ardından işlem ilerleme durumunu konsolda bildirir.

Komut satırından paketlenmiş MapReduceJoin jar dosyasını başlatma

Konsol çıkışı tracMapReduce birleştirme işleminin ilerlemesini takip edin.

) 7 Adım Çalıştırma işleminden sonra, çıktı dosyası ('part-00000' adıyla) HDFS üzerindeki /output_mapreducejoin dizinine kaydedilecektir.

Sonuçlar komut satırı arayüzü kullanılarak görülebilir

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

HDFS'den cat komutuyla yazdırılan departman kayıtlarına katıldı.

Sonuçlar ayrıca bir web arayüzü aracılığıyla da görülebilir.

Hadoop web arayüzü açılış sayfası, dosya sistemi tarayıcısına ulaşmak için kullanılır.

Şimdi 'Dosya sistemine göz at' seçeneğini seçin ve /output_mapreducejoin dizinine gidin.

HDFS dosya sistemi görünümünde output_mapreducejoin dizinine göz atılıyor.

part-r-00000'i açın

Tarayıcı görünümünde part-r-00000 çıktı dosyasını seçme

Sonuçlar gösteriliyor

Tarayıcıda görüntülenen bölüm adı ve bölüm sayısı satırları.

NOT: Bu programı bir dahaki sefere çalıştırmadan önce, /output_mapreducejoin çıktı dizinini silmeniz gerekeceğini lütfen unutmayın.

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

Bunun alternatifi çıktı dizini için farklı bir ad kullanmaktır.

Birleştirmeler (JOIN) size verilerin neye benzediğini söyler. Bir sonraki bölümde ele alınacak olan sayaçlar (Counters), bu veriyi üreten işin nasıl davrandığını gösterir.

MapReduce'ta Sayaç Nedir?

MapReduce'da sayaç, MapReduce işleri ve olayları hakkında istatistiksel bilgileri toplamak ve ölçmek için kullanılan bir mekanizmadır. Sayaçlar, verileri saklar. tracMapReduce'da gerçekleşen işlem sayısı ve işlemin ilerlemesi gibi çeşitli iş istatistiklerinin sayımı. Sayaçlar, MapReduce'da sorun teşhisinde kullanılır.

Hadoop Sayaçları, bir haritanın veya azaltmanın koduna bir günlük mesajı koymaya benzer. Bu bilgi MapReduce iş sürecindeki bir sorunun teşhisinde faydalı olabilir.

Hadoop'ta bu sayaçlar genellikle bir programda (map veya reduce) tanımlanır ve belirli bir olay veya koşul (o sayaca özgü) gerçekleştiğinde yürütme sırasında artırılır. Hadoop sayaçlarının çok iyi bir uygulaması şudur: tracGiriş veri kümesinden k adet geçerli ve geçersiz kayıt.

MapReduce Sayaçlarının Türleri

MapReduce sayaçlarının temelde 2 türü vardır.

  1. Hadoop'un yerleşik sayaçları: İş başına mevcut olan bazı yerleşik Hadoop sayaçları vardır. Aşağıda yerleşik sayaç grupları bulunmaktadır.
    • MapReduce Görev Sayaçları — Görevin yürütülme süresi boyunca göreve özgü bilgileri (örneğin, girdi kayıtlarının sayısı) toplar.
    • Dosya Sistemi Sayaçları — Bir görev tarafından okunan veya yazılan bayt sayısı gibi bilgileri toplar.
    • FileInputFormat Sayaçları — FileInputFormat aracılığıyla okunan bir dizi baytın bilgilerini toplar.
    • FileOutputFormat Sayaçları — FileOutputFormat aracılığıyla yazılan bir dizi baytın bilgilerini toplar.
    • İş İlanı Sayaçları — Bu sayaçlar, bir iş için başlatılan görev sayısı gibi iş genelindeki istatistikleri kaydeder.
  2. Kullanıcı tanımlı sayaçlar: Dahili sayaçlara ek olarak, kullanıcı programlama dillerinin sağladığı benzer işlevleri kullanarak kendi sayaçlarını da tanımlayabilir. Örneğin, JavaKullanıcı tanımlı sayaçları tanımlamak için 'enum' kullanılır.

💡 Sürüm notu: İş bulma sayaçları İş Kurumu tarafından yönetiliyordu.TracMRv1 altında bu rol MapReduce ApplicationMaster'a aittir. YARN'da ise bu rol MapReduce ApplicationMaster'a aittir, bu nedenle sayaç adları korunur ancak bunları raporlayan bileşen değişir.

Bir iş, sınırsız sayıda sayaç tanımlayamaz. mapreduce.job.counters.max Bu ayar, varsayılan olarak iş başına toplam sayıyı 120 ile sınırlandırır ve daha fazla sayı belirten bir iş başarısız olur. LimitExceededExceptionDolayısıyla sayaçlar, tuş başına sayımlar yerine, bir avuç toplu sinyal için tasarlanmıştır.

Sayaçlar Örneği

Eksik ve geçersiz değerlerin sayısını saymak için sayaçlar içeren örnek bir MapClass. Bu eğitimde kullanılan giriş veri dosyası: Giriş veri setimiz SalesJan2009.csv adlı bir CSV dosyasıdır.

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"));
        }
    }
}

Yukarıdaki kod parçası, Hadoop MapReduce'da sayaçların örnek bir uygulamasını göstermektedir.

Burada, Satış Sayaçları ' ile tanımlanan bir sayaçtır.enumBu, eksik ve geçersiz giriş kayıtlarını saymak için kullanılır.

Kod parçacığında, eğer 'ülke'Alan sıfır uzunlukta ise değeri eksiktir ve bu nedenle ilgili sayaç SalesCounters.MISSING artırılır.'

Ardından, eğer 'satış'Alan " ile başlıyorsa, kayıt GEÇERSİZ kabul edilir. Bu, SalesCounters.INVALID sayacının artmasıyla belirtilir.

💡 API notu: Yukarıdaki alıntı orijinalini kullanıyor. org.apache.hadoop.mapred API, burada MapReduceBase, Mapper arayüzü, OutputCollector hem de Reporter Ayrı ayrı görünürler. Mevcut kod, buna karşı yazılmıştır. org.apache.hadoop.mapreducetek bir Context Toplayıcı ve muhabirin yerini alır ve bir sayaç artırılır. context.getCounter(SalesCounters.MISSING).increment(1)Karşıt kavram her ikisinde de aynıdır.

SSS

Her düğümde bellekte tutulabilecek kadar küçük bir taraf söz konusu olduğunda eşleyici (mapper) varyantını seçin, çünkü bu varyant karıştırma işlemini tamamen atlar. Her iki taraf da büyük veya sıralanmamış olduğunda ise indirgeyici (reducer) varyantını seçin ve ek ağ maliyetini kabul edin.

Modeller, çalışma süresini tahmin etmek, bölme boyutlarını ve azaltıcı sayılarını önermek ve sayaç değerlerindeki sapmaları tespit etmek için geçmiş iş geçmişinden öğrenir. Ayrıca, taşan kayıt veya başarısız görev sayaçları o işlem hattı için normal aralığın dışına çıkan işleri de işaretlerler.

Copilot, mantıklı eşleyici ve indirgeyici iskeletleri üretiyor, ancak eski mapred paketini yeni mapreduce paketiyle tek bir sınıfta serbestçe karıştırıyor ki bu da derlenmeyecektir. Mantığına güvenmeden önce içe aktarmaları ve yöntem imzalarını düzeltin.

Bu mekanizma, görevler başlamadan önce daha küçük dosyayı her düğüme gönderir. Ardından her eşleyici, bu kopyayı bir karma haritaya yükler ve yerel olarak eşleşmeleri arar; bu da eşleyici tarafında birleştirmeyi mümkün kılar.

Bu bilgiler, iş tamamlandığında konsol özetinde yazdırılır, iş geçmişi ve kaynak yöneticisi web sayfalarında gösterilir ve iş nesnesinden programatik olarak okunabilir; böylece bir sürücü bu bilgilere dayanarak hatalı bir çalıştırmayı reddedebilir.

Tek bir Context nesnesi. OutputCollector ve Reporter'ın aralarında bölüştürülen işi üstlenir; böylece çıktı yazılır ve sayaçlar, map yöntemine geçirilen aynı tanıtıcı aracılığıyla artırılır.

Çoğu haber çalışması için hayır. HiveQL birleştirme Birkaç satırda aynı karıştırma ve birleştirme modeline derlenir. Birleştirme mantığı bir SQL koşuluna uymadığında elle yazılan işler buna değer.

Hadoop, zaten var olan bir çıktı dizinine yazmayı reddeder; bu, tamamlanmış sonuçların üzerine yazılmasını önler. Öncelikle dizini özyinelemeli olarak silin veya bir sonraki çalıştırmada farklı bir çıktı yolu belirtin.

Bu yazıyı şu şekilde özetleyin: