2010-06-25 5 views
5

Hadoop 0.20'de büyük dosyalarda, tek seferde çalışması gereken bir iş var. (Dosya tabanlı verileri MapReduce için daha uygun, daha temiz, çizgi tabanlı bir formatta almak için bir ön işlem adımıdır.)Sıfır Redüktörler kullanırken Hadoop'tan bireysel olarak sıralanmış Mapper çıktılarını alabilir miyim?

Kaç tane çıktı dosyanız olduğunu bilmiyorum, ancak her bir haritanın çıkışı en fazla bir çıktı dosyasında ve her çıktı dosyası sıralanmalıdır. Ben numReducers = 0 ile çalıştırırsanız

  • , hızlı çalıştığından ve her Mapper gayet kendi çıkış dosyası dışarı yazar - ancak dosyalar sıralanır.
  • Bir redüktör (düz Reducer.class) eklerseniz, bu, tek bir dosyaya gereksiz bir genel sıralama adımı ekler (bu, Harita görevlerinden çok daha uzun sürer).
  • Birden fazla redüktör eklerseniz, tekil harita işlerinin sonuçları birbirine karışır, böylece bir Haritanın çıktısı birden çok dosyada biter.

Hadoop'u, Reducers kullanmadan veya yavaş küresel birleşmeyi atlamadan başka bir yol kullanmadan, her işin çıktılarında bir harita tarafı sıralaması yapmaya ikna etmenin bir yolu var mı?

cevap

2

Genel sıralama yapmanın bir yolu, özel bir bölümleyiciye sahip olmak ve redüktörleriniz için aralık bölümleme yapmaktır. Bunun çalışması için mapper çıkış anahtarınızın aralığını bilmek zorundasınız. Anahtar aralığınızı, n redüktörün sayısı olan n kovalarına bölebilirsiniz.Anahtarın eşleştiği kepçeye bağlı olarak, eşleştirici çıkışı belirli bir redüktöre yönlendirilir.

Her redüktörün çıkışı sıralanır. Tüm bölüm düşürücü çıkışlarının toplanması, aralık bölümlemesi nedeniyle global olarak sıralanır. Tek yapmanız gereken, indirgeyici çıktı dosyalarını dosya adındaki 5 basamakla aynı sırayla almaktır. dikkat edilmesi gereken

bir şey kümede dengesiz redüktör yük sonuçlanacaktır anahtar dağılımındaki çarpıklık vardır. Dağıtım bilgisine, yani anahtarın histogramına sahipseniz, bu sorun hafifletilebilir. Sonra kova uzunluğunu eşitsiz yapabilir ve her biri aynı sayıda tuşa sahip olabilirsiniz.

Yardım edin.

0

Ben'in yorumunu aşağıya bakın - bu çalışmaz. Bu yanlış cevabı burada bırakacağım, böylece en azından neyin işe yaramadığını biliyoruz.

Combiner'un sizin için yapacağı şeyin bu olduğuna inanıyorum. ara çıkışların yerel toplanmasına gerçekleştirmek için JobConf.setCombinerClass (Sınıf) aracılığıyla,

Kullanıcılar isteğe bağlı olarak bir birleştirici belirtebilirsiniz: Onları ben hiç kullanmadım, ama http://hadoop.apache.org/common/docs/r0.20.1/mapred_tutorial.html durumları (bölüm Taşıma kapasitesi/Mapper) , Mapper öğesinden aktarılan veri miktarını Redüktöre düşürür.

bu benim okuma Eğer birleştirici olarak bir kimlik düşürücü belirtilmişse, ardından her bir harita oluşturucunun çıkış sıralanabilir gerektiğidir.

+0

"job.setCombinerClass (Reducer.class)" var. Redüktörler sıfır olduğunda etkili olmaz. Mapper.java adresinden:

İşin sıfır değeri azalırsa, Mapper'un çıktısı doğrudan OutputFormat'a anahtarlarla ayırmadan yazılır.

Yani bu sorunu çözecek veya başka yollarla aynı etkiyi elde etmek için bir yol var mı soruyorum varsayalım. –

+0

Çok yazık. Yani, harita oluşturucunun 'map' çağrısında değil çıktı şey olabilir, ama sadece bellekte toplanacak değerleri (bu çok büyük almaz emin olmak için yeterli haritacıları kullanın) saklamak. Sonra 'temizleme' çağrısında değerleri kendiniz sıralayın ve çıktı alın. –

+0

Evet - sanırım haritalama başına bellek sorun olsa da, oraya kendim koymam gerekecek ... Giriş için teşekkürler. –

2

Birleştiriciler verilerinizi global olarak sıralamayacaklardır - temelde indirgeyici verilerinin kısmen toplanması için bir önbellektirler.

Normal olarak, her bir eşleştiricinin çıktısını ayrı ayrı sıralamak istemezsiniz, ancak eğer yaparsanız, eşleme dosyası kimliğini çıktınızın bir parçası olarak eklemeyin ve her bir eşleştiricinin çıktısının ayrı olarak bölümlendirilmesi için özel bir bölüm işlevi kullanın. ve böylece ayrı ayrı sıralanmış, bu yüzden herhangi bir eşleştiricinin çıktıları her zaman tek bir dosyada mı? Muhtemelen dosya kimliği ile gruplamak istersiniz, böylece her giriş dosyasının sıralı çıktısını ayrı ayrı alırsınız.

Merak ediyorum, neden mapper çıkışını ayrı ayrı sıralamak istiyorsunuz?

Hadoop, çıktınızı sıralarsanız, aslında bir mapper-side sort ("shuffle") işlemi gerçekleştirecektir, böylece birçok redüktörle çalıştırırsanız muhtemelen bu geçici dosyaları silmeyebilirsiniz.

+0

Bu kısmi bir çözüm gibi geliyor - hız için birçok redüktörle çalışıyor ancak çıktılarını görmezden geliyor ve bunun yerine geçici olarak sıralanmış harita dosyalarını saklıyor. Mapper çıktı dosyalarını gelecekteki işler için girdi olarak istiyorum, sıralı dosyaların kullanımını daha kolay kılan kronolojik yapıya sahip olduklarından onları bekletmeyi umuyorlardı. Bununla birlikte, şu anda sıkı bir şekilde sıralanmadığında sorgulaması daha kolay olan farklı bir mapper çıktı formatı kullanma yoluna gidiyorum - yine de MR için daha iyi bir uyum gibi geliyor. Cevabınız için teşekkürler. –

1

sizin haritacılar tarafından tüketilen veri ölçüde büyük değilse, bunu toplanan almamak ve yerel bir veri takip edebilirsiniz, veri yapısını sıralanmış. Ardından, temizlenen/sonlandırma adımında sıralanan verilerin yazılmasını/toplanmasını yapabilirsiniz.

İlgili konular