2011-04-12 7 views
9

हमारे पास 200,000,000 पंक्तियों के साथ फ्लैट फ़ाइलें (सीएसवी) है, जिसे हम 23 आयाम तालिकाओं के साथ एक स्टार स्कीमा में आयात करते हैं। सबसे बड़ी आयाम तालिका में 3 मिलियन पंक्तियां हैं। फिलहाल हम एक ही कंप्यूटर पर आयात प्रक्रिया चलाते हैं और इसमें लगभग 15 घंटे लगते हैं। चूंकि यह बहुत लंबा समय है, हम आयात करने के लिए 40 कंप्यूटर जैसे कुछ उपयोग करना चाहते हैं।डेटा आयात करने के लिए 10+ कंप्यूटरों का कुशलतापूर्वक उपयोग कैसे करें

मेरा प्रश्न

हम कैसे कुशलतापूर्वक आयात करने के लिए 40 कंप्यूटर का उपयोग कर सकते हैं। मुख्य चिंता यह है कि सभी नोड्स में आयाम तालिकाओं को दोहराने में काफी समय लगेगा क्योंकि उन्हें सभी नोड्स पर समान होने की आवश्यकता है। इसका मतलब यह हो सकता है कि यदि हमने भविष्य में आयात करने के लिए 1000 सर्वर का उपयोग किया है, तो यह व्यापक नेटवर्क संचार और सर्वर के बीच समन्वय के कारण, वास्तव में एक का उपयोग करने से धीमा हो सकता है।

क्या किसी के पास सुझाव है?

संपादित करें:

निम्नलिखित CSV फ़ाइलों का सरलीकरण है:

"avalue";"anothervalue" 
"bvalue";"evenanothervalue" 
"avalue";"evenanothervalue" 
"avalue";"evenanothervalue" 
"bvalue";"evenanothervalue" 
"avalue";"anothervalue" 

आयात करने के बाद, टेबल इस तरह दिखेगा:

dimension_table1

id name 
1 "avalue" 
2 "bvalue" 

आयाम_टेबल 2

id name 
1 "anothervalue" 
2 "evenanothervalue" 

तथ्य तालिका

dimension_table1_ID  dimension_table2_ID 
    1      1 
    2      2 
    1      2 
    1      2    
    2      2 
    1      1 
+1

यदि आप समस्या को छोटे उपप्रोबम्स में कम नहीं कर सकते हैं, तो आप अतिरिक्त मशीनों से लाभ नहीं उठा सकते हैं, क्योंकि उन्हें सभी को एक ही समस्या को हल करने की आवश्यकता है। आपने मेरे 23 डी मैपिंग (या इसके लिए अग्रणी डेटा) की प्रकृति पर पर्याप्त जानकारी प्रदान नहीं की है, ताकि आप मुझे इसके अलावा कोई पॉइंटर्स दे सकें। – jmz

+1

ऑफ-विषय के रूप में चिह्नित –

+1

बाइट्स में सीवीएस का आकार क्या है? – ern0

उत्तर

3

डेटाबेस में सीएसवी डेटा लोड करना धीमा है क्योंकि इसे डेटा को पढ़ने, विभाजित करने और सत्यापित करने की आवश्यकता है।

  1. सेटअप प्रत्येक कंप्यूटर पर एक स्थानीय डेटाबेस:

    तो क्या आप की कोशिश करनी चाहिए यह है। यह नेटवर्क विलंबता से छुटकारा पा जाएगा।

  2. प्रत्येक कंप्यूटर पर डेटा का एक अलग हिस्सा लोड करें। प्रत्येक कंप्यूटर को एक ही हिस्सा देने की कोशिश करें। अगर किसी कारण से यह आसान नहीं है, तो प्रत्येक कंप्यूटर को 10'000 पंक्तियां दें। जब वे पूरा हो जाते हैं, तो उन्हें अगले खंड दें।

  3. एक भी डीबी

    में

  4. लोड सभी उदासीनता डीबी उपकरणों के साथ डेटा डंप

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

आप प्राथमिक कुंजी की जरूरत है (और आप चाहिए) तो आप की तरह insert into TABLE (....) select .... from REMOTE_SERVER.TABLE

आदेशों को चलाने के लिए अनुमति देता है कि, आप भी समस्या स्थानीय डीबीएस में आयात के दौरान पीकेएस आवंटित करने के लिए होगा। मैं पीएस को सीएसवी फ़ाइल में जोड़ने का सुझाव देता हूं।

  1. एक छोटा सा प्रोग्राम है जो CSV फ़ाइल के पहले और दूसरे स्तंभ में अनन्य मानों निकालने लिखें:

    [संपादित करें] अपने संपादन की जाँच के बाद, आप निम्न की कोशिश करनी चाहिए है। यह एक साधारण स्क्रिप्ट हो सकता है जैसे:

    cut -d";" -f1 | sort -u | nawk ' { print FNR";"$0 }' 
    

    यह एक बहुत ही सस्ता प्रक्रिया है (विशाल फ़ाइलों के लिए भी कुछ मिनट)। यह आपको आईडी-वैल्यू फाइल देता है।

  2. एक प्रोग्राम लिखें जो नई आईडी-वैल्यू फाइलें पढ़ता है, उन्हें स्मृति में कैश करता है और फिर विशाल सीएसवी फाइलें पढ़ता है और आईडी के साथ मानों को प्रतिस्थापित करता है।

    यदि आईडी-मूल्य फ़ाइलें बहुत बड़ी हैं, तो बस छोटी फ़ाइलों के लिए यह चरण करें और विशाल 40 को प्रति मशीन डीबी में लोड करें।

  3. विशाल फ़ाइल को 40 हिस्सों में विभाजित करें और उनमें से प्रत्येक को प्रत्येक मशीन पर लोड करें।

    यदि आपके पास बड़ी आईडी-मूल्य फ़ाइलें थीं, तो आप बने सभी मानों को प्रतिस्थापित करने के लिए प्रत्येक मशीन पर बनाए गए टेबल का उपयोग कर सकते हैं।

  4. परिणामों को मर्ज करने के लिए बैकअप/पुनर्स्थापित या दूरस्थ तालिकाओं का उपयोग करें।

    या इससे भी बेहतर, 40 मशीनों पर डेटा रखें और समानांतर कंप्यूटिंग से एल्गोरिदम का उपयोग कार्य को विभाजित करने और परिणामों को मर्ज करने के लिए करें। इस प्रकार Google कुछ मिलीसेकंड में अरबों वेब पृष्ठों से खोज परिणाम बना सकता है।

here for an introduction देखें।

+0

इस समाधान के साथ समस्या यह है कि एकल डीबी पर सभी डंप आयात करते समय आयाम तालिकाओं को मर्ज करने का कोई आसान तरीका नहीं है। एक आयाम तालिका में आईडी 1 से संबंधित स्ट्रिंग किसी अन्य आयाम तालिका में आईडी 77 के अनुरूप हो सकती है। इसका मतलब यह भी है कि तथ्य तालिका में आईडी संगत नहीं होंगे। –

+0

जैसा कि मैंने कहा था: आप आयाम तालिका में लोड करने से पहले CSV पंक्तियों में आईडी असाइन करें। स्वत: निर्दिष्ट पहचान कॉलम का उपयोग न करें (या उन स्तंभों के लिए 'NULL' पास न करें; तब डेटाबेस आपके लिए कुंजी उत्पन्न नहीं करेगा)। –

+0

मैं सीएसवी पंक्तियों को आईडी कैसे सौंप सकता हूं? क्या आपका मतलब है कि मुझे CSV फ़ाइलों को बनाते समय इसे असाइन करने की आवश्यकता है? यदि आपका मतलब यह है तो मैं कह सकता हूं कि निर्माण प्रक्रिया के कारण यह संभव नहीं है। –

2

यह एक बहुत ही सामान्य सवाल है और खाते में डेटाबेस बैकएंड नहीं लेता है। डेटाबेस बैकएंड पर 40 या 1000 मशीनों के साथ फायरिंग जो लोड को संभाल नहीं सकती है, आपको कुछ भी नहीं देगी। इस तरह की समस्या वास्तव में इसका एक विशिष्ट तरीके से जवाब देने के लिए व्यापक है .. आपको अपने संगठन के अंदर लोगों के संपर्क में रहना चाहिए ताकि पहले डीबी स्तर पर पर्याप्त कौशल हो और फिर एक और विशिष्ट प्रश्न के साथ वापस आएं।

+0

मैं उस व्यक्ति को हमारे दो व्यक्ति संगठन में हूं। क्या आप कृपया मुझे इस तरह से इंगित कर सकते हैं कि मैं प्रश्न को और अधिक विशिष्ट बना सकता हूं। फिलहाल हमने डेटाबेस इंजन नहीं चुना है, इसलिए मैंने एक निर्दिष्ट नहीं किया है। मुझे लगता है कि यह एक सामान्य समस्या थी, इसलिए मैंने एक सामान्य तरीके से पूछा ताकि अन्य डेटाबेस प्रौद्योगिकियों के बावजूद समाधान का उपयोग कर सकें। –

+0

हम आपके इनपुट डेटा के बारे में कुछ नहीं जानते हैं। हम कुछ नहीं जानते कि आपका डेटा कैसे विभाजित किया जा सकता है। हम इनपुट डेटा पर बाधाओं के बारे में कुछ भी नहीं जानते .... क्षमा करें, स्टैक ओवरफ्लो के दायरे से परे। आपको बड़े पैमाने पर सिस्टम से निपटने के लिए पेशेवर मदद प्राप्त करने पर विचार करना चाहिए। –

+0

मैंने अपना प्रश्न अपडेट किया है। तो उम्मीद है कि यह इस सवाल को और स्पष्ट कर देगा। –

2

एन कंप्यूटर, एक्स फाइलें लगभग 50 जीबी फाइलों पर मानते हैं, और अंत में सबकुछ युक्त 1 डेटाबेस रखने का लक्ष्य है।

प्रश्न: इसमें 15 घंटे लगते हैं। क्या आप जानते हैं कि प्रक्रिया का कौन सा हिस्सा सबसे लंबा समय ले रहा है? (डेटा को साफ करना, तालिकाओं में पढ़ने के डेटा को सहेजना, अनुक्रमण करना ... आप अनइंडेक्ड टेबल में डेटा डालने और बाद में अनुक्रमणित कर रहे हैं, सही?)

एन कंप्यूटरों के बीच इस नौकरी को विभाजित करने के लिए, मैं कुछ ऐसा करूंगा (और यह एक बैक-ऑफ-द-लिफाफा डिज़ाइन है):

  • "केंद्रीय" या मास्टर डेटाबेस है। समग्र प्रक्रिया को मैंगे करने के लिए इसका उपयोग करें, और अंतिम पूर्ण गोदाम को पकड़ने के लिए।
  • इसमें सभी एक्स फाइलों की सूची और सभी एन -1 (स्वयं को गिनती नहीं) "वर्कर" डेटाबेस
  • प्रत्येक कार्यकर्ता डेटाबेस किसी भी तरह से मास्टर डेटाबेस से जुड़ा हुआ है (बस आरडीबीएमएस पर निर्भर करता है, जिसे आपने निर्दिष्ट नहीं किया है)
  • जब ऊपर और चलते हैं, तो एक "तैयार" कार्यकर्ता डेटाबेस प्रक्रिया के लिए फ़ाइल डेटाबेस के लिए मास्टर डेटाबेस का चुनाव करता है।मास्टर डेटाबेस गुड़िया कार्यकर्ता प्रणालियों को फाइल करता है, यह सुनिश्चित करता है कि एक समय में एक से अधिक फाइलों को संसाधित नहीं किया जाता है। (किसी दिए गए फ़ाइल को लोड करने की सफलता/विफलता को ट्रैक करना है; टाइमआउट (कार्यकर्ता विफल) के लिए देखें, रीट्रीज़ प्रबंधित करें।)
  • वर्कर डेटाबेस में स्टार स्कीमा का स्थानीय उदाहरण है। फ़ाइल को असाइन करते समय, यह स्कीमा खाली करता है और उस फ़ाइल से डेटा लोड करता है। (स्केलेबिलिटी के लिए, एक समय में कुछ फाइलों को लोड करने लायक हो सकता है?) "पहला चरण" डेटा क्लिनिंग उस फ़ाइल में मौजूद डेटा के लिए यहां किया जाता है।
  • लोड होने पर, मास्टर डेटाबेस को उस कार्यकर्ता के लिए "तैयार फ्लैगी" के साथ अपडेट किया जाता है, और यह प्रतीक्षा मोड में जाता है।
  • मास्टर डेटाबेस में कार्यकर्ता डेटाबेस की अपनी स्वयं की कार्य सूची है जो डेटा लोड करना समाप्त कर चुका है। यह प्रत्येक प्रतीक्षा कार्यकर्ता को बारी में सेट करता है; जब एक कार्यकर्ता सेट संसाधित हो जाता है, तो कार्यकर्ता को "जांचने के लिए कोई अन्य फ़ाइल है" जांचने के लिए सेट किया गया है।
  • प्रक्रिया शुरू होने पर, मास्टर डेटाबेस में स्टार स्कीमा साफ़ हो गया है। लोड किया गया पहला सेट शायद वर्बैटिम पर कॉपी किया जा सकता है।
  • दूसरे सेट और अप के लिए, डेटा को पढ़ना और "विलय" करना है - अनावश्यक प्रविष्टियों को टॉस करना, अनुरूप आयामों के माध्यम से डेटा मर्ज करना आदि। व्यवसाय डेटा जो सभी डेटा पर लागू होते हैं, एक समय में केवल एक सेट नहीं होना चाहिए अब भी किया यह "दूसरा चरण" डेटा सफाई होगा।
  • फिर से, प्रत्येक कार्यकर्ता डेटाबेस के लिए उपर्युक्त चरण दोहराएं, जब तक कि सभी फाइलें अपलोड नहीं हो जातीं।

लाभ:

  • पठन/डेटाबेस में फ़ाइलों से डेटा परिवर्तित करने और कर "पहले चरण" सफाई एन कंप्यूटरों के बीच बाहर बढ़ाया जाता है।
  • आदर्श रूप में, छोटे से काम ("दूसरे चरण", विलय डेटासेट) मास्टर डेटाबेस

सीमाओं के लिए छोड़ दिया जाता है:

  • डेटा बहुत पहले कार्यकर्ता डेटाबेस में पढ़ा जाता है, और उसके बाद फिर से पढ़ें (हालांकि डीबीएमएस-मूल प्रारूप में) नेटवर्क पर
  • मास्टर डेटाबेस एक संभावित चॉकपॉइंट है। सब कुछ यहाँ से गुजरना है।

शॉर्टकट:

  • यह संभावना है कि जब एक कार्य केंद्र "में चेक" एक नई फ़ाइल के लिए, यह पहले से ही मास्टर में लोड डेटा की एक स्थानीय दुकान से ताज़ा और डेटा सफाई विचार जोड़ सकते हैं के आधार पर लगता है यह अपने "पहले चरण" कार्य (यानी यह जानता है कि कोड 5484J पहले ही लोड हो चुका है, इसलिए यह इसे फ़िल्टर कर सकता है और इसे वापस मास्टर डेटाबेस में पास नहीं कर सकता है)।
  • SQL सर्वर तालिका विभाजन या अन्य आरडीबीएमएस की समान भौतिक कार्यान्वयन चाल शायद अच्छे प्रभाव के लिए उपयोग की जा सकती है।
  • अन्य शॉर्टकट्स संभवतः हैं, लेकिन यह पूरी तरह से लागू व्यवसाय नियमों पर निर्भर करता है।

दुर्भाग्यवश, सिस्टम और डेटा की जानकारी के बारे में और जानकारी के बिना, कोई यह नहीं बता सकता कि यह प्रक्रिया "यह सब एक बॉक्स" समाधान से तेज या धीमी गति से समाप्त हो जाएगी या नहीं। दिन के अंत में यह आपके डेटा पर बहुत निर्भर करता है: क्या यह तकनीक को "विभाजित और जीतने" के लिए सबमिट करता है, या यह सब एक प्रसंस्करण आवृत्ति के माध्यम से चलाया जाना चाहिए?

2

सबसे सरल बात यह है कि एक कंप्यूटर को नए आयाम आइटम आईडी को सौंपने के लिए ज़िम्मेदार बनाना है। आप प्रत्येक आयाम के लिए एक हो सकता है। यदि आयाम हैंडलिंग कंप्यूटर एक ही नेटवर्क पर हैं, तो आप उन्हें आईडी प्रसारित कर सकते हैं। यह पर्याप्त तेज़ होना चाहिए।

23-आयामी starscheme के साथ आप किस डेटाबेस का उपयोग करने की योजना बना रहे थे? आयात करना एकमात्र प्रदर्शन बाधा नहीं हो सकता है। आप इसे वितरित मुख्य-मेमोरी सिस्टम में करना चाहेंगे। इससे बहुत से संपार्श्विक मुद्दों से बचा जाता है।

आपको जांच करनी चाहिए कि अत्यधिक सहसंबंध वाले आयाम हैं या नहीं।

सामान्य रूप से, 23 आयामी स्टार योजना के साथ बड़े आयामों के साथ एक मानक संबंध डेटाबेस (SQL सर्वर, PostgreSQL, MySQL) डेटावेयर हाउस सवालों के साथ बेहद खराब प्रदर्शन करने जा रहा है। एक पूर्ण टेबल स्कैन करने से बचने के लिए, संबंधपरक डेटाबेस भौतिक दृश्यों का उपयोग करते हैं। 23 आयामों के साथ आप उनमें से पर्याप्त खर्च नहीं कर सकते हैं। एक वितरित मुख्य-मेमोरी डेटाबेस पर्याप्त तालिका स्कैन पर्याप्त तेज़ी से करने में सक्षम हो सकता है (2004 में मैंने डेल्फी में पेंटियम 4 3 गीगाहर्ट्ज पर लगभग 8 मिलियन पंक्तियां/सेक/थ्रेड किया था)। वर्टिका एक और विकल्प हो सकता है।

एक और सवाल: फ़ाइल को ज़िप करते समय फ़ाइल कितनी बड़ी है? यह सामान्यीकरण की मात्रा का एक अच्छा पहला ऑर्डर अनुमान प्रदान करता है जो आप कर सकते हैं।

[संपादित करें] मैंने आपके अन्य प्रश्नों पर एक नज़र डाली है। यह PostgreSQL (या MySQL या SQL सर्वर) के लिए एक अच्छा मिलान की तरह नहीं दिखता है। आप क्वेरी परिणामों के लिए कितने समय तक इंतजार करना चाहते हैं?

0

एक और पर ध्यान दें आप Windows Server के लिए Windows हाइपर-वी क्लाउड कम्प्यूटिंग ऐड-ऑन का उपयोग कर सकते हैं: http: //www.microsoft.com/virtualization/en/us/private-cloud.aspx

10

आप प्रयोग करने पर विचार कर सकता है अनुक्रमिक आईडी का उपयोग करने के बजाय प्रत्येक स्ट्रिंग के लिए bigint आईडी बनाने के लिए एक 64 बिट हैश फ़ंक्शन।

64-बिट हैश कोड के साथ, आप टकराव का 0.0031% मौका होने से पहले अपने हैश टेबल में 2^(32 - 7) या 30 मिलियन से अधिक आइटम स्टोर कर सकते हैं।

यह आपको सभी नोड्स पर समान आईडी रखने की अनुमति देगा, जिसमें 'प्रेषण' और 'विलय' चरणों के बीच सर्वर के बीच कोई संचार नहीं होगा।

आप टकराव की संभावना को और कम करने के लिए बिट्स की संख्या भी बढ़ा सकते हैं; केवल, आप परिणामी हैश को 64 बिट पूर्णांक डेटाबेस फ़ील्ड में फिट करने में सक्षम नहीं होंगे।

देखें:

http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash

http://code.google.com/p/smhasher/wiki/MurmurHash

http://www.partow.net/programming/hashfunctions/index.html

+1

यह एक उत्कृष्ट विचार है। हालांकि, यह तथ्य तालिका को आकार के दोगुना होने का कारण नहीं बनता है। क्या बाद के चरण में कॉलम को 32-बिट में परिवर्तित करने का कोई तरीका है? – David

+0

@ डेविड, बहुत ही रोचक सवाल। संसाधित हिस्सों में विलय करने के बाद, आप एक एकल मशीन वातावरण पर वापस आ जाएंगे जहां पीके टकराव तुरंत पता लगाया जाएगा, और आसानी से संभाला जाएगा। उस बिंदु पर 32-बिट संख्या पर वापस जाने का सबसे तेज़ तरीका हैश ट्रंकेशन (देखें स्लाइड 2: http://www.ietf.org/proceedings/63/slides/hash-4.pdf, "छंटनी एच का परिणाम नया एल्गोरिदम विकसित करने/तैनात करने के लिए बेहतर है जो लंबाई एनपी "का संदेश पाचन उत्पन्न करता है। यह अतिरिक्त चरण प्रसंस्करण समय की कीमत पर डिस्क स्थान को बचाएगा; यह इस बात पर निर्भर करता है कि सबसे महत्वपूर्ण क्या है। – magma

1

रोहिता,

मैं तुम्हें सबसे पहले डेटा sumarising द्वारा लोड से बहुत काम को खत्म सुझाव देंगे , डेटाबेस के बाहर। मैं एक सोलारिस यूनिक्स पर्यावरण में काम करता हूं। मैं एक कॉर्न-शेल स्क्रिप्ट की तरफ झुकता हूं, जो cut फाइल को अधिक प्रबंधनीय हिस्सों में जोड़ता है, फिर उन दो हिस्सों को मेरे दो अन्य सर्वरों के बराबर दूर करता है। मैं एक विशिष्ट स्क्रिप्ट (आयाम तालिकाओं) और तथ्य तालिका की गणना करने के लिए एक नॉक स्क्रिप्ट का उपयोग कर भागों को संसाधित करता हूं (नॉक में एक कुशल हैशटेबल है, जिसे वे "सहयोगी सरणी" कहते हैं)। बस प्रत्येक नए-नाम को देखा गया है जो कि वृद्धिशील-के-आयाम के साथ देखा गया है, फिर तथ्य लिखें।

यदि आप इसे नामित पाइप के माध्यम से करते हैं तो आप "होस्ट" कंप्यूटर को 'फ्लाई पर' डेटा को रीडबैक कर सकते हैं, जबकि "मेजबान" कंप्यूटर सीधे इसे टेबल में लोड कर बैठता है।

याद रखें, कोई फर्क नहीं पड़ता कि आप डेटा की 200,000,000 पंक्तियों के साथ क्या करते हैं (कितने गिग है?), इसमें कुछ समय लगेगा। लगता है जैसे आप कुछ मस्ती के लिए हैं। यह पढ़ना दिलचस्प है कि अन्य लोग इस समस्या से निपटने का प्रस्ताव कैसे करते हैं ... पुरानी कहावत "ऐसा करने के एक से अधिक तरीके हैं!" कभी इतना सच नहीं रहा है। सौभाग्य!

चीयर्स। कीथ।

0

ऐसा लगता है कि आपका कार्यान्वयन बहुत अक्षम है क्योंकि यह 1 एमबी/सेकंड (50 जीबी/15 घंटे) से कम की गति से लोड हो रहा है।

एक आधुनिक एकल सर्वर (2x ज़ीऑन 56 9 0 सीपीयू + रैम जो हैश टेबल + 8 जीबी में लोड किए गए सभी आयामों के लिए पर्याप्त है) पर उचित कार्यान्वयन आपको कम से कम 10 गुना/सेकंड कम से कम 10 गुना बेहतर गति देना चाहिए।

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

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