2013-02-20 34 views
5

Harita/Küçült sırasında Hadoop'ta özel bir yapılandırma nesnesi ayarlayıp (daha sonra) almak için herhangi bir yol var mı? Örneğin, büyük bir dosyayı önceden işleyen ve dosyayla ilgili bazı özellikleri dinamik olarak belirleyen bir uygulama varsayalım. Ayrıca, bu özelliklerin özel bir Java nesnesine (örneğin, Properties nesnesine, ancak yalnızca bazılarının dizgiler olmamasına rağmen) kaydedildiğini ve daha sonra her bir harita ve küçültme işi için gerekli olduğunu varsayalım.Hadoop'ta özel yapılandırma değerlerini yayma

Uygulama, bu yapılandırmayı "nasıl yayıyor", böylece her bir mapper ve redüktör işlevi gerektiğinde nasıl erişebilir?

bir yaklaşım, ikinci parametre üzerinden JSON dize tefrika konfigürasyon nesnesini geçmesi, örneğin, JobConf sınıfının set(String, String) yöntemi kullanmak ve bağlı olabilir, ancak bu bir kesmek çok fazla olabilir ve bu durumda uygun JobConf örneğin her bir Mapper ve Reducer tarafından erişilebilir olmalıdır (örneğin, earlier question'da önerilen gibi bir yaklaşımı izleyerek). Eğer M/R işinde gereken her özelliği içeren bir Properties nesne varsa

cevap

8

Ben bir şey eksik sürece, sadece Hadoop Configuration nesneye Properties nesnenin içerik yazmak gerekir. Böyle Örneğin, bir şey:

M/R işin içine Sonra
Configuration conf = new Configuration(); 
Properties params = getParameters(); // do whatever you need here to create your object 
for (Entry<Object, Object> entry : params.entrySet()) { 
    String propName = (String)entry.getKey(); 
    String propValue = (String)entry.getValue(); 
    conf.set(propName, propValue); 
} 

, sen eşleyicisinde (map fonksiyonu) veya redüktör (reduce fonksiyonu), hem de sizin Configuration geri almak için Context nesneyi kullanabilirsiniz böyle: Configuration nesneyi kullanırken, ayrıca gerekirse bazı başlatma yapmak, setup ve cleanup yöntemlerde kullanışlı Context erişebilmesi

public void map(MD5Hash key, OverlapDataWritable value, Context context) 
    Configuration conf = context.getConfiguration(); 
    String someProperty = conf.get("something"); 
    .... 
} 

Not. böylece,

Ayrıca muhtemelen doğrudan bir InputStream veya dosya olarak doğrudan özelliklerini eklemek için Configuration nesneden addResource yöntemini diyebiliriz sizi kayda değer, ama bu normal Hadoop XML yapılandırmasında gibi bir XML yapılandırma olması gerek diye düşünüyorum Bu sadece aşırı olabilir.

DÜZENLEME: olmayan dize nesnelerin durumda, seri hale getirme kullanılarak öneriyoruz olacaktır: Eğer nesneleri seri ve sonra Strings çevirebiliriz (muhtemelen ne olur emin değilim olarak Base64 ile örneğin onları kodlamak Olağandışı karakterler varsa, ve sonra mapper/redüktör tarafında Configuration içinde özellikleri gelen Strings gelen nesneleri serileştirin.

Başka bir yaklaşım aynı serileştirme tekniğini yapmak, ancak bunun yerine HDFS'ye yazmak ve sonra bu dosyaları DistributedCache'a eklemek olacaktır. Biraz aşırı kulağa geliyor, ama bu muhtemelen işe yarayacak.

+0

Tüm özellikler dizgilerse, bu iyi olur. Benim kullanım durumunda, bazıları değil, onlar (oldukça karmaşık) hem harita hem de azaltılmış parçalar için gerekli olan özel Java nesneleridir. Ama cevap için +1 yine de. :-) – PNS

+1

@PNS Dize olmayan bir nesneyi iletmek istiyorsanız, dizeleri Strings'e dönüştürmek için önce dizgelerinizi serileştirebilir ve bu dizeleri 'Yapılandırma'ya iletebilirsiniz, ardından mapper/redüktörde de serialize edilir. nesneler. Bunun gibi nesneleri geçmek için yerel bir yol olduğunu düşünmüyorum.Ayrıca, nesneyi bir dosyaya serileştirebilir ve HDFS'ye yerleştirebilir ve bu dosyayı muhtemelen 'DistributedCache' ile alabilirsiniz. –

+0

Evet, MapReduce dağıtılmış bir uygulama olduğundan, serileştirme yine de gerekli görünüyor. – PNS

İlgili konular