2012-08-22 9 views
6

Tüm redüktörlerime belirli bir kaydı nasıl gönderebilirim?Hadoop tüm redüktörlere kayıt gönder

Partitioner sınıfını ve ne yaptığını biliyorum, ancak kayıtların tüm redüktörlere gittiğinden emin olmanın kolay bir yolunu göremiyorum.

Temelde, Partitioner bu yöntemi vardır: Mapper rekoru azaltmak sayısına eşit bir kaç kez çıkışının tutar şu şekildedir: Benim ilk fikir birliği partitioner ve Mapper sahip olmaktı

int getPartition(K2 key, 
      V2 value, 
      int numPartitions) 

Görevler ve Partitioner tüm inters'ı (0'dan numPartitions-1'e) döndürür, böylece kayıt tüm bölümlere ulaşır.

Bunu çözmenin başka daha akıllı yolları var mı? Mesela, tüm bölümlere gönderdiğim kayıtlar için -1 değerini döndürüyorum ve çerçeve, geri döndüğü zaman -1'i gördüğünde bunu yapıyor.

cevap

5

Bölümleyici bu şekilde çalışmıyor. Onun işi, çiftin hangi redüktöre gönderilmesi gerektiğini belirlemek için (genellikle) ve değere (nadiren) bakmaktır. Bu, haritalayıcıdan sonra ve redüktörden önce gerçekleşir. Bunun yerine, siz (haritacı), toplam redüktör sayısını (bölümleri) yanıtlayabilen konfigürasyon için bağlamı sorabilmeniz gerekir. Eşleştiriciniz daha sonra istediğiniz gerçek anahtarı ve bir bölüm numarasını içeren karmaşık bir anahtar verebilir. Bunu kaç kere yazacağınızı biliyorsunuz, çünkü haritacı redüktör sayısını bulabilir (yukarıya bakın). Tüm bölümleyicinin yapması gereken, bileşik anahtar değerini bozmak, hedef redüktör endeksini çıkarmak ve bu endeksi döndürmektir. Bu yöntem, eğer bu tekniği sayımları (sıralama yapıyorsanız) veya işlemin ilerleyen bölümlerinde kullanılacak diğer meta verileri göndermek için kullanıyorsanız, gerçek veri anahtarlarınızın aynı kompozit malzemeyi takip etmesi gerektiği anlamına gelir. biçim. Aslında, büyük olasılıkla, bileşik anahtarın anahtar/değer çiftinin türünü açıklayan bir göstergeye eklemeniz gerekecektir (ör. 1 = gerçek veri, 0 = meta veriler işleme).

+0

Ayrıca, bu yanıtı ihtiyaç duyacağınız gruplama karşılaştırıcısına göre güncellemem gerekiyor. –

+0

Ben de böyle düşünüyordum. Çok açık bir şekilde tarif etmedim ve Partitioner nesnesinde geri dönmesi gereken bir sonraki bölümün kaydını tutmak için bir sayaç sahibi olmayı düşünüyorum. Ancak, bunun bir çözüm olduğundan emin değilim çünkü Partitioner nesnesi GC-ed ve sayaç sıfırlama olabilir. Gruplama karşılaştırıcısıyla ilgili olarak, bunun açıklamamış olduğum şartlara bağlı olduğunu düşünüyorum. Gerekirse geri geleceğim. Teşekkürler! – Razvan