2013-02-20 47 views
5

में कस्टम कॉन्फ़िगरेशन मानों का प्रचार करना क्या सेट करने के लिए कोई तरीका है और (बाद में) मानचित्र/घटा के दौरान हडोप में कस्टम कॉन्फ़िगरेशन ऑब्जेक्ट प्राप्त करें?हडोप

उदाहरण के लिए, एक ऐसा एप्लिकेशन मानें जो एक बड़ी फ़ाइल को प्रीप्रोकैस करता है और गतिशील रूप से फ़ाइल से संबंधित कुछ विशेषताओं को निर्धारित करता है। इसके अलावा, मान लें कि उन विशेषताओं को एक कस्टम जावा ऑब्जेक्ट में सहेजा जाता है (उदा।, Properties ऑब्जेक्ट, लेकिन विशेष रूप से नहीं, क्योंकि कुछ स्ट्रिंग नहीं हो सकते हैं) और बाद में प्रत्येक मानचित्र और कम नौकरियों के लिए आवश्यक हैं।

एप्लिकेशन इस कॉन्फ़िगरेशन को "प्रचारित" कैसे कर सकता है, ताकि जब आवश्यक हो तो प्रत्येक मैपर और रेड्यूसर फ़ंक्शन इसका उपयोग कर सके?

एक दृष्टिकोण उदाहरण के लिए JobConf वर्ग के set(String, String) विधि का उपयोग करें और,, विन्यास वस्तु दूसरा पैरामीटर के माध्यम से एक JSON स्ट्रिंग के रूप में धारावाहिक पारित करने के लिए हो सकता है, लेकिन यह एक हैक की बहुत अधिक हो सकता है और उसके बाद उपयुक्त JobConf उदाहरण प्रत्येक Mapper और Reducer द्वारा किसी भी तरह से एक्सेस किया जाना चाहिए (उदाहरण के लिए, earlier question में सुझाए गए एक जैसा दृष्टिकोण)।

उत्तर

8

जब तक मैं अगर आप हर संपत्ति आप अपने एम/आर काम में जरूरत से युक्त एक Properties वस्तु है, कुछ याद कर रहा हूँ, तो आप बस Hadoop Configuration वस्तु को Properties वस्तु की सामग्री लिखने के लिए की जरूरत है। उदाहरण के लिए, कुछ इस तरह:

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); 
} 
फिर अपने एम/आर काम के अंदर

, आप Context वस्तु का उपयोग कर सकते दोनों नक्शाकार (map समारोह) या कम करने (reduce समारोह) में Configuration वापस पाने के लिए , इस तरह:

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

ध्यान दें कि जब Configuration वस्तु का उपयोग कर, आप भी Contextsetup और cleanup तरीकों में यदि आवश्यक हो तो कुछ प्रारंभ करने के लिए उपयोग कर सकते हैं, उपयोगी।

इसके अलावा यह शायद सीधे Configuration वस्तु से addResource विधि कह सकते हैं अपने गुण एक InputStream या एक फ़ाइल के रूप में सीधे जोड़ने के लिए उल्लेख के लायक है, लेकिन मेरा मानना ​​है कि यह नियमित रूप से Hadoop एक्सएमएल कॉन्फ़िगरेशन की तरह एक XML विन्यास हो गया है, इसलिए यह सिर्फ overkill हो सकता है।

संपादित: गैर स्ट्रिंग वस्तुओं के मामले में, मैं का उपयोग कर सलाह देंगे क्रमबद्धता: आप अपने वस्तुओं को क्रमानुसार कर सकते हैं, और फिर उन्हें स्ट्रिंग्स में कन्वर्ट (शायद Base64 साथ उदाहरण के लिए उन्हें सांकेतिक शब्दों में बदलना के रूप में मुझे यकीन है कि नहीं कर रहा हूँ क्या होगा अगर आपके पास असामान्य पात्र हैं), और फिर मैपर/रेड्यूसर पक्ष पर Configuration के अंदर गुणों से प्राप्त स्ट्रिंग्स से ऑब्जेक्ट्स को डी-सीरियलाइज़ करें।

एक और तरीका एक ही क्रमबद्धता तकनीक करना होगा, लेकिन इसके बजाय एचडीएफएस को लिखें, और फिर इन फ़ाइलों को DistributedCache पर जोड़ें। थोड़ी अधिक मात्रा में लगता है, लेकिन यह शायद काम करेगा।

+0

यह ठीक है अगर सभी गुण स्ट्रिंग हैं। मेरे उपयोग के मामले में, कुछ नहीं हैं, वे (बल्कि जटिल) कस्टम जावा ऑब्जेक्ट्स हैं जो मानचित्र और भागों को कम करने के लिए आवश्यक हैं। लेकिन जवाब के लिए वैसे भी +1। :-) – PNS

+1

@PNS ठीक है अगर आप गैर-स्ट्रिंग ऑब्जेक्ट को पास करना चाहते हैं, तो आप स्ट्रिंग्स में कनवर्ट करने के लिए हमेशा अपनी ऑब्जेक्ट्स को क्रमबद्ध कर सकते हैं और इन स्ट्रिंग्स को 'कॉन्फ़िगरेशन' पर पास कर सकते हैं, और फिर मैपर/रेड्यूसर डी-सीरियलाइज में वस्तुओं। मुझे नहीं लगता कि इस तरह के आसपास वस्तुओं को पारित करने के लिए कोई मूल तरीका है।आप शायद ऑब्जेक्ट को फ़ाइल में भी क्रमबद्ध कर सकते हैं और इसे एचडीएफएस में डाल सकते हैं और फिर इस फ़ाइल को 'वितरित कैश' के साथ शायद प्राप्त कर सकते हैं। –

+0

हां, serialization वैसे भी आवश्यक लगता है, क्योंकि MapReduce एक वितरित अनुप्रयोग है। – PNS