2013-12-14 21 views
11

Ben hadoop dünyasında çok yeni ve tek bir basit görev elde etmek için uğraşıyordum. Kimse bana sadece harita kullanarak kod sayısı tekniği kullanarak en iyi n değerlerini nasıl elde edeceğimi söyler misiniz? Bu basit görev için herhangi bir hadoop komutunu kullanmak istiyorum. Herhangi bir fikir veya öneri gerçekten yardımcı olacaktır. Teşekkürler.Hadoop tarafından en iyi N değerleri Harita Kodu azalt

+1

Ne demek "Bu basit görev için herhangi bir hadoop komutunu kullanmak istemiyorum"? –

+1

Hadoop'ta redüktör, çıkışı tuşların değeri temelinde sıralar. Bu yüzden çıktıyı yazarken, sadece anahtarı ve değeri değiştirirsek, i. e., değeri (bu sayım olacaktır), değer olarak anahtar ve anahtar olarak yazın, sonra değerler temelinde sıralanır. Sonra tek yapmamız gereken şu komutu çalıştırmaktır: hadoop fs -cat | tail -n n, bilmek istediğiniz en üstteki n değerleri. Ama ben görevi tamamlamak için yukarıdaki komutu kullanmak istemiyorum. Sadece harita ile yapmak istiyorum sadece progamming azaltmak. – user3078014

+1

Yanlış. Redüktör çıkışı sıralamaz. Redüktör, girdiyi haritacılardan ayırır! Büyük fark! –

cevap

18

İki bariz seçenek vardır:

  1. WordCount: sayımlarını tüm kelimeler (hemen hemen örnek tam olarak)
  2. TopN:


    iki MapReduce işleri var bir MapReduce iş o bir şeyin en üst noktasını bulur (burada bazı örnekler verilmiştir: source code, blog post)

WordCount'ın çıktısının HDFS'ye yazmasını sağlayın. Ardından, TopN bu çıkışı okudu. Buna iş zincirleme denir ve bu sorunu çözmek için bir çok yol vardır: oozie, bash betikleri, sürücünüzden iki işi ateşleme, vb.

İki işe ihtiyaç duymanızın sebebi, iki topluluğunuz var: kelime sayısı ve ikincisi topN. Genellikle MapReduce'ta her bir toplama kendi MapReduce işini gerektirir.


Önce, WordCount işinizin verilerinde çalışmasını sağlayın. Ardından, üst N'yi çıkarmak için biraz bash kullanın.

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n20 

sort -n -k2 -r

"azalan sırada kolon 2. göre sıralama sayısal" diyor. head -n20 en üst yirmi çeker.

Bu, WordCount için daha iyi bir seçenek, çünkü WordCount muhtemelen sadece binlerce veya on binlerce satırlık sırayla çıkacak ve bunun için bir MapReduce işine ihtiyacınız olmayacaktır. Unutmayın ki, etrafta dolaşmış haldeyken, bütün problemlerinizi Hadoop ile çözmeniz gerektiği anlamına gelmez. zor ama yukarıdakilerin ikisinin bir karışımı olan


Bir sigara bariz versiyonu ...

bir WordCount MapReduce işi yazın ama Reducer içinde TopN MapReduce işlerde böyle bir şey yapmak Ben Seni daha önce gösterdi. Daha sonra, her redüktör çıkışını sadece bu redüktörden gelen TopN sonuçları alın.

Yani, Top 10 yapıyorsanız, her redüktör 10 sonuç verecektir. Diyelim ki 30 redüktörünüz var, 300 sonuç elde edersiniz. Sonra

, bash ile opsiyon # 2 ile aynı şeyi yapmak:

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n10 

yalnızca sonuçlar bir kısmını postprocess Bunun nedeni hızlı olması gerekir.

Bunu yapmayı düşünebilmemin en hızlı yolu budur, ancak muhtemelen çabaya değmez.

+0

Merhaba Donald, Çözümünüz için çok teşekkürler. Lütfen bana bu yaklaşımın da yazdığımın doğru olduğunu söyleyin. ==> Hadoop'ta, redüktör çıkışları tuşların değerine göre sıralar. Bu yüzden çıktıyı yazarken, sadece anahtarı ve değeri değiştirirsek, i. e., değeri (bu sayım olacaktır), değer olarak anahtar ve anahtar olarak yazın, sonra değerler temelinde sıralanır. Sonra tek yapmamız gereken komutu çalıştırmak: hadoop fs -cat | kuyruk n, n bilmek istediğimiz n değerleri. – user3078014

+0

Bu nedenle, bu görevi yerine getirmek için iki harita azaltma işini çalıştırmamız gerekiyor. Normal kelimeleri bulmak için ilk iş ve karşılık gelen sayımlar ve ikinci iş, her redüktörden en üstteki N'yi bulmaktır. koddaki ikinci iş. Nasıl çalışıyor ve nihayet tüm redüktörlerin çıkışındaki en üstteki n değerlerini nasıl alıyoruz? Her seferinde bir şeyin üst n'sini nasıl hesaplıyoruz ve nihayet tam olarak en iyi n değerlerini nasıl üretiyoruz? – user3078014

+0

Lütfen "sort -n -k2 -r | kafa -n20 '.. n, k2 ve r komutunda olduğu gibi? – user3078014

2

MR yolunda sorunların nasıl çözüleceğine aşina olmak için MapReduce Design Patterns kitabını edinin. Here, TopN'yi almak için kitabın kodudur.Ayrıca, daha fazla algoritma için Data-Intensive Text Processing with MapReduce'u kontrol edin.

+3

Bu topTendriver kodunu KULLANMAYIN. , TreeMap'i kullanır ve aynı int değer kayıtlarını geçersiz kılar ve doğru olarak sıralanacak şekilde toplam değeri hesaplamaz. – halil

+0

@halil, belki daha iyi bir uygulama tavsiye edebilir misiniz? –

+0

@halil bu fenomen için herhangi bir açıklama yararlı olacaktır –

İlgili konular