2013-04-11 14 views
5
Mapper/Reducer 1 --> (key,value) 
        / | \ 
        / | \ 
    Mapper/Reducer 2  | Mapper/Reducer 4 
    -> (oKey,oValue)  | -> (xKey, xValue) 
          | 
          | 
        Mapper/Reducer 3 
        -> (aKey, aValue) 

MR1 ile birleştirdiğim bir günlük dosyam var. Mapper2, Mapper3, Mapper4, MR1'in çıkışını girdi olarak alır. İşler zincirlenir.Hadoop - çoklu girişleri nasıl kullanır ve azaltır?

MR1 Çıkış:

User  {infos of user:[{data here},{more data},{etc}]} 
.. 

MR2 Çıkış:

timestamp  idCount 
.. 

MR3 Çıkış:

timestamp  loginCount 
.. 

MR4 Çıkış:

timestamp  someCount 
.. 
Ben MR2-4 gelen çıkışlarını birleştirmek istediğiniz

: Final output->

timestamp  idCount  loginCount someCount 
.. 
.. 
.. 

w/Pig veya Hive o bir yolu var mı? Java kullanıyorum.

+1

+1 sadece ASCII sanatı için .. –

+0

İkinci adım için çok işlevli bir MR işine sahip olmak, anahtarlarınızın tüm zaman damgaları olduğunu görmek mümkün değil mi? Yani Geçirilen değeri yorumlayıp ona göre ele almalı mı? Redüktörlerin belirli bir anahtar için tüm değerleri alması garanti edilir, bir zaman damgasıyla ilgili tüm bilgileri toplayabilir ve sadece ihtiyacınız olan tüm bileşenlere sahip olduğunuzda yazabilirsiniz. – Quetzalcoatl

+0

Aslında bunu yaptım ve işe yaradı. Bir soru attı: İstediğim şeyi elde etmek için, map-function bağlamında 3 kez yazdım (context.write (key1, value1) - daha derindeki context.write (key2, value2) ve son bağlamda. Yazmak (key3, value3) Bu geçerli mi? – JustTheAverageGirl

cevap

1

bakınız, sen redüktör sınıfında çıktı dizisini sahip olamayacağını yapabilirsiniz. Ne sorunu çözmek için benim akla gelen şudur: MR1 için

Sizin çıkış anahtarı {a,b,c} ve değeri biri tuşlara göre {timestamp,idCount} veya {timestamp, loginCount} veya {timestamp, someCount} arasında çiftinin olurdu. Ve MR2-4'u birleştireceksiniz.

Yani süreç böyle olacak:

MR1 <inputKey,inputValue,outputKey,outPutValue> where outputKey is 
             "a" for outValue`{timestamp,idCount} 
             "b" for outValue`{timestamp, loginCount} 
             "c" for outValue`{timestamp, someCount} 

MR2-4<inputKey,inputValue,outputKey,outPutValue> if inputkey is "a" do MR2 
               if inputkey is "b" do MR3 
               if inputkey is "c" do MR4 

Ayrıca, anahtar olarak key+some_part_of_value düşünebiliriz {anahtar/değer} ve mapper/redüktör ile oynayabileceği Partitioner and GroupComperator denilen yöntem vardır.

İlgili konular