2012-07-31 12 views
5

हमारे मानचित्र के विकास के दौरान-नौकरियों को कम करने के दौरान हमारे एमआर कोड डेटा-कम होने वाले डेटा के स्वतंत्र डायग्नोस्टिक डेटा संरचनाओं को स्वतंत्र रूप से उत्पन्न करता है। क्या इन आंकड़ों को उस कोड पर लाने का कोई आसान तरीका है जिसे मैपराइडस कहा जाता है या उन्हें मोंगो में बने रहने का कोई आसान तरीका है? बस लॉग फ़ाइल में लिखना बहुत उप-इष्टतम होने के रूप में बदल रहा है (ए) वहां पहले से बहुत सारे डेटा हैं और (बी) हमारी नैदानिक ​​जानकारी अत्यधिक संरचित है और वास्तव में, हम इसके खिलाफ प्रश्नों को चलाने के लिए चाहते हैं यह।MongoDB: mapReduce दुष्प्रभाव

मेरी जांच अब तक बताती है कि एमआर डेटा संरचना मूल्य (धारावाहिकरण के माध्यम से) द्वारा पारित की जाती है ताकि किसी भी इन-मेमोरी डेटा संरचनाएं खो जाएंगी, जिनमें "वैश्विक" दायरे से जुड़े हुए हैं। नामस्थान मुख्य जेएस सर्वर-साइड नेमस्पेस से अलग हैं इसलिए dbeval उन तक पहुंचने के लिए प्रतीत नहीं होता है (या, कम से कम, मुझे नहीं पता कि कहां देखना है)। अंतिम लेकिन कम से कम नहीं, हालांकि सभी डेटाबेस ऑब्जेक्ट्स और फ़ंक्शंस मौजूद हैं, 10gen उनके उपयोग को रोकने के लिए त्रुटि संदेशों को उत्पन्न कर रहा है (उदाहरण के लिए, coll.insert फ़ंक्शन नहीं होने पर typeof coll.insert === 'function'true है।

स्पष्ट होने के लिए, मुझे एक नोड में विकास के लिए ऐसा करने में दिलचस्पी है, क्योंकि मोंगोडीबी में लॉगिंग/डिबगिंग समर्थन काफी सीमित है। इस प्रकार के दुष्प्रभाव उत्पादन वातावरण में अच्छे नहीं हैं।

+0

सटीक रूप से यह किस प्रकार का डेटा उत्पन्न कर रहा है? एमआर के आउटपुट को संग्रह में रखा जा सकता है .. सी # में, मैं इसे इस प्रकार निर्दिष्ट करता हूं: MyInputCollection.MapReduce (नक्शा, कम करें, MapReduceOptions.SetOutput ("MyOutputCollection")); फिर आप लगातार संग्रह 'MyOutputCollection' से पढ़ते हैं। –

+0

मैं एमआर आउटपुट से स्वतंत्र जानकारी को सहेजना चाहता हूं। इसके बारे में डेटा निकास के रूप में सोचें, उदाहरण के लिए, विस्तृत संरचित लॉगिंग/बेंचमार्किंग जानकारी के लिए जिसे मैं कोड के साथ संसाधित करना चाहता हूं, इसलिए मैं इसे लॉग फ़ाइलों में समाप्त नहीं करना चाहता हूं। – Sim

+0

क्या आपने लॉगिंग के लिए एक कैप्ड संग्रह का उपयोग करने का प्रयास किया है .. मुझे समझ में नहीं आता कि coll.insert क्यों विफल होना चाहिए .. –

उत्तर

2

अनुमान के अनुसार, यह संभव नहीं है (जैसा कि मोंगोडीबी 2.2 में) मानचित्र/कम कार्यों के भीतर से किसी अन्य डीबी तक पहुंचने के लिए संभव नहीं है। संभावित प्रदर्शन प्रभाव के अलावा, डेडलॉक्स और अन्य अवांछित साइड इफेक्ट्स बनाने की भी संभावना है।

दुर्भाग्य से यह print() को "बैंड ऑफ आउट" विकल्प के रूप में मोंगो लॉग में छोड़ देता है।

अपने नैदानिक ​​उत्पादन के आधार पर, एक दृष्टिकोण की कोशिश करने का होगा:

  • एक अनूठा मार्कर है कि आप लॉग उत्पादन में उत्पादन (या यहां तक ​​उत्पादन रन) की पहचान करने की अनुमति होगी जोड़ने

  • अपने उत्पादन tojson() का उपयोग कर क्रमानुसार तो यह कुछ parseable संरचना के साथ लॉग इन और आदर्श एक पंक्ति पर उत्सर्जित जब आप print()

  • करने के लिए एक पटकथा लिखने हैअपने अद्वितीय मार्कर के साथ मिलान लाइनों के लिए लॉग इन करें और रिपोर्टिंग

कि एक एम/आर समारोह के भीतर से चलेंगे कोड का उदाहरण के लिए एक और संग्रह में उन सम्मिलित mongod.log:

var diag = { 
    'run' : diagrun, 
    'phase': 'map', 
    'key' : z 
} 
print("MAPDIAG:" + tojson(diag)); 

उदाहरण आउटपुट:

$ tail -f mongo.log | grep "^MAPDIAG" 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "mouse" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } 
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "cat", "total" : 3 } 
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "dog", "total" : 2 } 
+0

यह कम या ज्यादा है जो हम कर रहे हैं।मैंने एक लॉगर क्लास बनाया जो संग्रह में लॉग करता है और प्रिंट() का उपयोग करता है। एमआर के दौरान, लॉग संग्रह सम्मिलित अपवाद उत्पन्न करते हैं जो निगल जाते हैं। मेरी इच्छा है कि 10gen ने विकास/डिबगिंग समर्थन पर अधिक ध्यान दिया। – Sim

+0

@ सिम: यदि आप मोंगोडीबी ट्रैकर (SERVER कतार, घटक 'MapReduce/Distinct/Group') में एक [जिरा मुद्दा] (https://jira.mongodb.org/browse/SERVER) बना सकते हैं तो कुछ सहायक होंगे। डीबगिंग के लिए आवश्यक/उपयोगी होने के बारे में अधिक जानकारी। शायद हडोप [मैप्रिडस काउंटर] के समान कुछ (http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/), रन के अंत में एक वैकल्पिक लॉगिंग आउटपुट कॉलबैक के साथ । – Stennie