2012-11-12 4 views
6

मैं riak/riak-js और निम्नलिखित समस्या में पड़ के साथ संयोजन में एक NodeJS आवेदन पर काम कर रहा हूँ:Riak MapReduce प्रश्नों में विफल रहता है। उपयोग करने के लिए कौन सी विन्यास?

इस अनुरोध

db.mapreduce 
    .add('logs') 
    .run(); 

corretly साथ बाल्टी लॉग में संग्रहीत सभी 155.000 आइटम रिटर्न चल रहा है उनके आईडी:

[ 'logs', '1GXtBX2LvXpcPeeR89IuipRUFmB' ], 
[ 'logs', '63vL86NZ96JptsHifW8JDgRjiCv' ], 
[ 'logs', 'NfseTamulBjwVOenbeWoMSNRZnr' ], 
[ 'logs', 'VzNouzHc7B7bSzvNeI1xoQ5ih8J' ], 
[ 'logs', 'UBM1IDcbZkMW4iRWdvo4W7zp6dc' ], 
[ 'logs', 'FtNhPxaay4XI9qfh4Cf9LFO1Oai' ], 
.... 

अगर मैं एक नक्शा-Funktion निर्दिष्ट और बाल्टी में केवल एक आइटम के कुछ का उपयोग लॉग

db.mapreduce 
    .add([['logs', 'SUgJ2fhfgyR2WE87n7IVHyBi4C9'], ['logs', 'EMtywD1UFnsq9rNRuINLzDsHdh2'], ['logs', 'ZXPh5ws8mOdASQFEtLDk8CBRn8t']]) 
    .map(function(v) {return ["asd"]; }) 
    .run(); 

सब कुछ ठीक काम कर रहा है और निम्न, अपेक्षित आउटपुट दिया जाता है:

[ 'asd', 'asd', 'asd' ] 

मैं अब riak बाल्टी "लॉग" में सभी आइटम (155.000 के बारे में छोटे json डॉक्स) को मैप करने के

db.mapreduce  
    .add('logs') 
    .map(function(v) {return ["asd"]; })  
    .run(); 
चाहते हैं

{ [Error: [object Object]] message: '[object Object]', statusCode: 500 } 

यहाँ क्या होता है:

मैं केवल त्रुटियों का सामना करना? त्रुटि-वस्तु में कुछ भी उपयोगी नहीं लिखा गया है।

अद्यतन: riak-सांत्वना कहते हैं निम्नलिखित कई बार:

[notice] JS call failed: All VMs are busy. 

riaks में map_js_vm_count बढ़ाने के बाद से 36 app.config, संदेश में बदल जाता है:

[error] Pipe worker startup failed:fitting was gone before startup 

लिंक: Basho Labs Riak Driver riak-js

उत्तर

4

basho.com से ब्रायन ने मेरे प्रश्न का उत्तर दिया:

हाय, कॉर्नेलियस। क्या आप थोड़ा सा वर्णन कर सकते हैं, आपकी रीक कॉन्फ़िगरेशन? विशेष रूप से, आपके क्लस्टर में कितने नोड्स हैं, और app.config से ring_creation_size क्या है?

यदि, उदाहरण के लिए, आप एक-नोड विकास क्लस्टर पर एक डिफ़ॉल्ट सेटअप {ring_creation_size, 64} का उपयोग कर रहे हैं, तो यह व्यवहार काफी संभावना है। 155,000 आइटम सभी 64 vnodes काम करने के लिए पर्याप्त है।

पहले मामले में, map_js_vm_count बढ़ाने से पहले, उन 64 vnodes केवल 8 जावास्क्रिप्ट वीएम पर लड़ रहे हैं, और इसलिए कुछ समय के लिए लंबे समय तक भूखे होने की संभावना है, जिससे "सभी वीएम व्यस्त हैं" लॉग संदेश ।

दूसरे मामले में, map_js_vm_count बढ़ाने के बाद, यह संभावना है कि उन 36 जावास्क्रिप्ट वीएम क्वेरी टाइमआउट आने से पहले सभी 155,000 आइटमों को संसाधित करने में सक्षम नहीं हैं। "फिटिंग स्टार्टअप से पहले चला गया था" लॉग संदेश कह रहा है कि वीएनओड्स पर अभी भी इनपुट आने पर क्वेरी बंद हो रही है।

आप साधारण व्यवहार में इन व्यवहारों में से कोई भी नक्शा कार्य नहीं देख रहे हैं क्योंकि जावास्क्रिप्ट वीएम के साथ कोई बातचीत आवश्यक नहीं है। इसके अतिरिक्त, उस मामले के लिए, वस्तुओं को डिस्क से भी नहीं पढ़ा जाता है, और संसाधन विवाद को कम करता है।

दो कॉन्फ़िगरेशन समाधान जो मैं अपेक्षा करता हूं, सबसे अधिक रिंग_क्रिएशन_साइज को कम करने और क्वेरी टाइमआउट को बढ़ाने में मदद करेगा। एकल-नोड क्लस्टर पर ring_creation_size को 16, या यहां तक ​​कि 8 को कम करने से जावास्क्रिप्ट वीएम के लिए कम विवाद हो जाएगा क्योंकि मानचित्र फ़ंक्शन प्रोसेसिंग में कम समानांतरता का प्रयास किया जाएगा। क्वेरी टाइमआउट को बढ़ाकर ('रन' फ़ंक्शन, या इसी तरह के लिए एक तर्क होना चाहिए, लेकिन मैं riak-js क्लाइंट से परिचित नहीं हूं), बंद करने से पहले क्वेरी को समाप्त करने के लिए अधिक समय देगा, जो आवश्यक हो सकता है धीमी प्रसंस्करण को दूर करें।

एरलांग में अपने मानचित्र फ़ंक्शन को पुनर्लेखन करने में भी मदद करनी चाहिए, क्योंकि यह तेज़ होगा, और उसी प्रकार की वीएम विवाद नहीं होगी। लेकिन, मैं समझता हूं, प्रारंभिक चरण के विकास में उपयोग करना उतना आसान नहीं है।

HTH, ब्रायन

+1

हाय ब्रायन, अपने उत्कृष्ट जवाब के लिए धन्यवाद, यह riak की एक गहरी ज्ञान के लिए एक बहुत मदद की। आप सही हैं, मैं डिफ़ॉल्ट-एक-नोड विकास क्लस्टर का उपयोग कर रहा हूं। आपके द्वारा वर्णित अंगूठी के आकार को 8 तक कम करने के बाद, सब कुछ ठीक काम करता है। –

संबंधित मुद्दे