2012-09-09 32 views
5

Redüktör çıkışını azalan sıraya göre nasıl sıralayabilirim? En çok dinlenen şarkıları döndürmesi gereken bir uygulama geliştiriyorum. Böylece şarkılar dinleme sayısına göre sıralanmalıdır. başvurum bu şekilde çalışır:MapReduce - Çıkışı nasıl azaltabilirsiniz

Input: [email protected]@boolean 
MapOutput : songname userid 
ReduceOutput : songname number_of_listening 

Bir fikrin nasıl bunu?

+0

: https://pkghosh.wordpress.com/2011/04/13/map-reduce-secondary-sort- does-it-all/ –

cevap

2

the docs, Redüktör çıkışı yeniden sıralanmaz. JobConf.setOutputValueGroupingComparator(Class) için uygun bir değer ayarlayarak ya da redükleyiciye (uygulamanız için çalışıyorsa) uygun bir değer ayarlayarak ya da yalnızca son çıktıyı ayrı bir adımda redükleyiciden ayırın.

+0

Cevabınız için teşekkürler, redüktörün giriş değerlerini sıralamak problemimi çözmez. İkincinin girişini ilk olarak alarak iki işi başlatmak için bir yol var mı? –

+0

@ Yüksek oranda kafeinli. Eşleştiriciyi ve redükleyiciyi yapılandıran MR sınıfınızda, ilk işin ikinci işin girdisi olarak çıktısını gösteren ikinci bir işi yapılandırın ve gönderin. Sadece göndermek yerine submitAndWait kullandığınızdan emin olun. –

+0

Teşekkürler Chris. Nasıl yapabilirim? Her iki işi de kabuğundan (birbiri ardına) çalıştırmalıyım, ya da birlikte başlamanın bir yolu var mı? İş API'sini [bağlantı] (http://hadoop.apache.org/common/docs/r1.0.3/api/index.html) görüyorum ve önceden sabitlenmiş bir girdi almak için herhangi bir yöntem yoktur. Üzgünüz ama bu benim ilk defa hadoop ile çalışıyor. –

5

Bunu yapmanın en iyi yolu, ilk MapReduce işinizin çıktısını Sort.java olarak adlandırdığım başka bir işin girdisi olarak kullanmaktır. Hadoop Map fonksiyonunun yerinde bir sıralama algoritması bulunduğundan, bir azaltma sınıfına bile ihtiyacınız yoktur. Sadece böyle bir şey yapmak: LongWritable değerine göre ilk MapReduce adresini [LongWritable, metin] çıkışını sıralanır

public static class Map extends Mapper<LongWritable,Text,IntWritable,Text>{ 
    private Text word = new Text(); 
    public void map(LongWritable key, Text value, Context context) throws IO Exception, Interrupted Exception{ 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    word.set(tokenizer.nextToken()); 
    IntWritable number = new IntWritable(Integer.parseInt(tokenizer.nextToken())); 
    context.write(number,word); 
    }  
} 

. Nasıl çalıştığını bana bildirin!

CL

ben bilgilendirici kadarıyla zaten saygı ile Hadoop tarafından yaptıklarından olarak tasnif için bu bağlantıyı bulundu
+1

Hadoop 2.4.0'ın Mapper sınıfından javadoc: "İşin sıfıra düşmesi durumunda, Mapper'ın çıkışı doğrudan tuşlara ayırmadan OutputFormat'a yazılır." Bu, cevabınızın aslında yanlış olduğu anlamına gelmez mi? –