2013-06-18 8 views
5

हमारे पास एक छोटी (16 एम पंक्तियां) विशिष्ट तालिका और एक बड़ी (6 बी पंक्तियां) स्काईड टेबल के बीच एक सुअर शामिल है। एक नियमित रूप से 2 घंटों में समाप्त होता है (कुछ tweaking के बाद)। हमने using skewed को आजमाया और प्रदर्शन को 20 मिनट तक सुधारने में सक्षम रहा।सुअर एक बड़े टेबल के साथ जुड़ने का कारण बनता है "स्प्लिट मेटाडाटा आकार 10000000 से अधिक हो गया"

हालांकि, जब तक हम बड़ी विषम तालिका (19B पंक्तियाँ) की कोशिश है, हम नमूना नौकरी से यह संदेश प्राप्त:

Split metadata size exceeded 10000000. Aborting job job_201305151351_21573 [ScriptRunner] 
at org.apache.hadoop.mapreduce.split.SplitMetaInfoReader.readSplitMetaInfo(SplitMetaInfoReader.java:48) 
at org.apache.hadoop.mapred.JobInProgress.createSplits(JobInProgress.java:817) [ScriptRunner] 

यह हर बार जब हम कोशिश using skewed प्रतिलिपि प्रस्तुत करने योग्य है, और ऐसा नहीं होता है जब हम का उपयोग नियमित रूप से शामिल हों।

हमने mapreduce.jobtracker.split.metainfo.maxsize=-1 सेट करने का प्रयास किया और हम इसे job.xml फ़ाइल में देख सकते हैं, लेकिन यह कुछ भी नहीं बदलेगा!

यहां क्या हो रहा है? क्या यह using skewed द्वारा बनाए गए वितरण नमूने के साथ एक बग है? यह पैरामीटर को -1 में बदलने में क्यों मदद नहीं करता है?

+0

ने जिरा बग दर्ज करने का निर्णय लिया: https://issues.apache.org/jira/browse/PIG-3411, – ihadanny

+0

अपडेट करेगा, हमने पाया है कि mapreduce.jobtracker.split.metainfo बदल रहा है। अधिकतम आकार नौकरी स्तर में काम नहीं करने के लिए जाना जाता है, केवल नौकरी ट्रैकर स्तर में, यहां देखें: https://groups.google.com/a/cloudera.org/forum/#!topic/cdh-user/UWBMKplvGkg – ihadanny

+0

क्या आपने कभी इस समस्या का हल ढूंढें? हम एक समान मुद्दे का सामना कर रहे हैं। – KennethJ

उत्तर

1

मेमोरी में फ़िट होने के लिए 1 एमबी की छोटी तालिका पर्याप्त है, इसमें शामिल होने का प्रयास करें। प्रतिकृति में शामिल होना केवल मानचित्र है, अन्य प्रकार के जुड़ने के रूप में चरण को कम नहीं करता है, इस प्रकार जॉइन कुंजियों में स्काई से प्रतिरक्षा है। यह जल्दी होना चाहिए।

big = LOAD 'big_data' AS (b1,b2,b3); 
tiny = LOAD 'tiny_data' AS (t1,t2,t3); 
mini = LOAD 'mini_data' AS (m1,m2,m3); 
C = JOIN big BY b1, tiny BY t1, mini BY m1 USING 'replicated'; 

बिग टेबल हमेशा कथन में पहला है।

अद्यतन 1: अपने मूल रूप में छोटी सी मेज स्मृति में फिट नहीं करता है, की तुलना में के रूप में आप के चारों ओर एक काम विभाजन है कि बहुत छोटे स्मृति में फिट करने के लिए कर रहे हैं में अपने छोटे से टेबल विभाजन और लागू की तुलना में की आवश्यकता होगी बड़ी तालिका में समान विभाजन, उम्मीद है कि आप उसी विभाजन को एल्गोरिदम जोड़ सकते हैं जो बड़ी तालिका बनाता है, ताकि आप इसे पुन: विभाजित करने में समय बर्बाद न करें। विभाजन के बाद, आप प्रतिकृति में शामिल होने का उपयोग कर सकते हैं, लेकिन इसे प्रत्येक विभाजन के लिए अलग-अलग सुअर स्क्रिप्ट की आवश्यकता होगी।

+0

अच्छा विचार है, लेकिन छोटी तालिका 1 एमबी (संपादित प्रश्न नहीं) है और हैडूप कैश में फिट नहीं होगी (इसे आजमाया गया) – ihadanny

+0

अपडेट किया गया उत्तर। अद्यतन देखें 1. – alexeipab

+0

फिर से धन्यवाद, लेकिन मैं मूल समस्या के लिए एक स्पष्टीकरण की तलाश में हूं। यह एक अच्छा कामकाज है, लेकिन मैं इसे तब तक नहीं जा रहा जब तक कि मैं समझ नहीं पा रहा हूं कि परंपरागत शामिल होने में क्या गलत है – ihadanny

0

Hadoop (> = 2.4.0 लेकिन शायद भी पहले) आप निम्नलिखित विन्यास संपत्ति का उपयोग करके काम स्तर पर अधिकतम विभाजन आकार निर्धारित करने के लिए सक्षम होना चाहिए के नए संस्करण में:

mapreduce.job.split .metainfo.maxsize = -1

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