2012-12-22 24 views
5

में बड़ी मात्रा में डेटा प्रोसेसिंग मैं बहुत अच्छा आरडीबीएमएस अनुभव के साथ एक अजगर डेवलपर हूं। मुझे काफी बड़ी मात्रा में डेटा (लगभग 500 जीबी) संसाधित करने की आवश्यकता है। डेटा एस 3 बाल्टी में लगभग 1200 सीएसवी फाइलों में बैठा है। मैंने पायथन में एक स्क्रिप्ट लिखी है और इसे सर्वर पर चला सकता है। हालांकि, यह रास्ता बहुत धीमा है। वर्तमान गति के आधार पर और डेटा की मात्रा में सभी फ़ाइलों को प्राप्त करने में लगभग 50 दिन लगेंगे (और निश्चित रूप से, समय सीमा पहले से ठीक है)।समांतर

नोट: प्रसंस्करण आपके मूल ईटीएल प्रकार की सामग्री का प्रकार है - कुछ भी भयानक कल्पना नहीं है। मैं आसानी से पोस्टग्रेएसक्यूएल में एक अस्थायी स्कीमा में पंप कर सकता हूं, और उसके बाद स्क्रिप्ट चला सकता हूं। लेकिन, फिर से, मेरे प्रारंभिक परीक्षण से, यह धीमा करने का तरीका होगा।

नोट: एक नया नया PostgreSQL 9.1 डेटाबेस यह अंतिम गंतव्य होगा।

तो, मैं बैच (समानांतर में) चलाने और चलाने के लिए ईसी 2 उदाहरणों का एक गुच्छा फैलाने की कोशिश करने के बारे में सोच रहा था। लेकिन, मैंने पहले ऐसा कुछ नहीं किया है, इसलिए मैं विचारों के लिए चारों ओर देख रहा हूं, आदि।

फिर से, मैं एक अजगर डेवलपर हूं, इसलिए ऐसा लगता है कि फैब्रिक + बोटो वादा कर सकता है। मैंने समय-समय पर बोटो का उपयोग किया है, लेकिन फैब्रिक के साथ कभी भी कोई अनुभव नहीं है।

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

इसके अलावा, मुझे पता है कि यह एक साधारण स्टैक ओवरफ्लो-प्रकार का सवाल नहीं है (कुछ "मैं पाइथन में एक सूची को कैसे उलट सकता हूं")। लेकिन, मैं जो उम्मीद कर रहा हूं वह इसे पढ़ने के लिए है और "कहो, मैं कुछ ऐसा करता हूं और XYZ का उपयोग करता हूं ... यह बहुत अच्छा है!"

मुझे लगता है कि मैं क्या पूछ रहा हूं क्या कोई इस बात को पूरा करने के लिए उपयोग कर सकता है (यह देखते हुए कि मैं एक पायथन डेवलपर हूं और मुझे हैडोप या जावा नहीं पता है - और एक है तंग समयरेखा जो मुझे हडोप जैसी नई तकनीक सीखने या नई भाषा सीखने से रोकती है)

पढ़ने के लिए धन्यवाद। मैं किसी भी सुझाव के लिए तत्पर हूं।

+0

कपड़े + Boto वास्तव में इस कार्य के लिए एक अच्छा संयोजन की तरह दिखता है। प्रत्येक उदाहरण पर कार्य को समानांतर करने के लिए भी उपयोगी हो सकता है (जब तक कि आप 1200 उदाहरण, प्रति फ़ाइल एक होने की उम्मीद नहीं कर रहे हों), शायद 'मल्टीप्रोसेसिंग' मॉड्यूल से 'पूल' का उपयोग करके। साथ ही, जिस तरह से आप फ़ाइल को पार्स करते हैं और परिणामों को संपादित करते हैं, शायद कुल समय में बहुत अधिक प्रभाव पड़ता है। क्या आपने 'numpy' में देखा है? – goncalopp

+1

इसलिए कोई भी संभावित सुझाव दोहराने का प्रयास नहीं करता है - क्या आप वर्णन कर सकते हैं कि आपने अपनी मौजूदा स्क्रिप्ट में क्या किया है जो बहुत धीमा है - इसलिए हम जानते हैं कि उस मार्ग को नीचे नहीं जाना है :) –

+0

@ जोनक्लेमेंट्स - एक उचित अनुरोध की तरह लगता है। मूल रूप से, मैंने दो दृष्टिकोणों की कोशिश की है। मैंने डेटा को एक अस्थायी स्कीमा में डालने और इसे अनुक्रमित करने की आवश्यकता है (आवश्यकतानुसार) और डेटा को "मालिश" करने के लिए इसके खिलाफ चल रहे प्रश्नों और इसे अनुरोधित प्रारूप में प्राप्त करने का प्रयास किया है। यह बहुत धीमा था क्योंकि मेरा मानना ​​है कि इंडेक्स PostgreSQL कैश से कहीं अधिक बड़े थे। नोट: मेरे पास Heroku पर चल रहा एक छोटा PostgreSQL उदाहरण है। (अगली टिप्पणी में जारी रहेगा) –

उत्तर

2

मैं अक्सर इस प्रकार के बैच काम के लिए एसक्यूएस/एस 3/ईसी 2 के संयोजन का उपयोग करता हूं। एसक्यूएस में किए गए सभी कार्यों के लिए संदेशों को कतारबद्ध करें (कुछ उचित रूप से छोटे हिस्सों में खंडित)। एनसी 2 उदाहरणों को स्पिन करें जो एसक्यूएस से संदेश पढ़ने, काम करने और एस 3 में परिणाम डालने के लिए कॉन्फ़िगर किए गए हैं, और फिर, और फिर, एसक्यूएस से संदेश हटाएं।

आप इसे पागल स्तर पर स्केल कर सकते हैं और यह हमेशा मेरे लिए वास्तव में अच्छा काम करता है। आपके मामले में, मुझे नहीं पता कि आप S3 में परिणाम संग्रहीत करेंगे या PostgreSQL पर जाएं।

+0

जिज्ञासा से बाहर, आप अपनी स्क्रिप्ट को ईसी 2 उदाहरण में कैसे प्राप्त करेंगे? क्या आप उन्हें एक गिट रेपो से खींच लेंगे? या बस स्क्रिप्ट को खत्म कर दें? –

+0

मैंने कई तकनीकों का उपयोग किया है। आप फाइलों को स्कैन करने के लिए पैरामीको-आधारित स्क्रिप्ट लिख सकते हैं। आप क्लाउड-इनिट का उपयोग कर सकते हैं और एस 3 से स्क्रिप्ट खींच सकते हैं। आप फैब्रिक का उपयोग कर सकते हैं। आप क्लाउडफॉर्मेशन टेम्पलेट्स का उपयोग कर सकते हैं। बहुत सारे विकल्प हैं। – garnaat

+0

उत्तर के लिए धन्यवाद। हाँ; बहुत सारे विकल्प की तरह लगता है। जैसा कि मैंने अपने मूल प्रश्न में उल्लेख किया है, मैं फैब्रिक का उपयोग करने की ओर झुका रहा हूं, लेकिन यह सोच रहा था कि आपने यहां क्या किया है। –

2

मैं कुछ समय पहले कुछ इस तरह किया है, और मेरे सेटअप

  • एक मल्टीकोर उदाहरण की तरह था (एक्स बड़े या अधिक), कि एक मध्यवर्ती प्रारूप में कच्चे स्रोत फ़ाइलें (XML/CSV) धर्मान्तरित । आप समानांतर में कनवर्टर स्क्रिप्ट की प्रतियां (संख्या-कोर-कोर) चला सकते हैं। चूंकि मेरा लक्ष्य मोंगो था, इसलिए मैंने जेसन को इंटरमीडिएट प्रारूप के रूप में इस्तेमाल किया, आपके मामले में यह एसक्यूएल होगा।

  • इस उदाहरण में एन वॉल्यूम संलग्न हैं। एक बार वॉल्यूम भरने के बाद, यह अलग हो जाता है और दूसरे उदाहरण से जुड़ा होता है (बोटो के माध्यम से)।

  • दूसरा उदाहरण एक डीबीएमएस सर्वर और एक स्क्रिप्ट चलाता है जो डीबी में तैयार (एसक्यूएल) डेटा आयात करता है। मुझे पोस्टग्रेज़ के बारे में कुछ भी पता नहीं है, लेकिन मुझे लगता है कि इसमें mysql या mongoimport जैसे टूल हैं। यदि हां, तो एक पायथन लिपि के माध्यम से प्रश्न बनाने के बजाय थोक आवेषण बनाने के लिए इसका उपयोग करें।

3

क्या आपने कुछ प्रदर्शन माप किए हैं: बाधाएं कहां हैं? क्या यह सीपीयू बाध्य है, आईओ बाध्य, डीबी बाध्य?

जब यह सीपीयू बाध्य होता है, तो आप अजगर की तरह एक पायथन जेआईटी आज़मा सकते हैं।

जब यह आईओ बाध्य है, तो आपको अधिक एचडी की आवश्यकता है (और उन पर कुछ स्ट्रिपिंग एमडी डालें)।

जब यह डीबी बाध्य है, तो आप पहले सभी इंडेक्स और कुंजी को छोड़ने का प्रयास कर सकते हैं।

पिछले हफ्ते मैंने अपने सर्वर पर पोस्टग्रेस इंस्टेंस में ओपनस्ट्रीटमैप डीबी आयात किया था। इनपुट डेटा 450 जी थे। प्रीप्रोकैसिंग (जो यहां जावा में किया गया था) ने सिर्फ कच्ची डेटा फाइलें बनाई हैं जिन्हें पोस्टग्रेस 'कॉपी' कमांड के साथ आयात किया जा सकता है। कुंजी और सूचकांक आयात करने के बाद उत्पन्न किया गया था।

सभी कच्चे डेटा को आयात करने में लगभग एक दिन लग गया - और फिर कुंजी और सूचकांक बनाने में कई दिन लग गए।

1

आपको अमेज़ॅन लोचदार मानचित्र कम करने के रूप में हडूप से लाभ हो सकता है। बहुत गहराई के बिना इसे पैरारल (मानचित्र चरण) में भारी डेटा वॉल्यूम्स पर कुछ तर्क लागू करने के तरीके के रूप में देखा जा सकता है।
हैडूप स्ट्रीमिंग नामक हैडूप तकनीक भी है - जो किसी भी भाषा (जैसे पायथन) में स्क्रिप्ट/एक्जिक्यूटिव का उपयोग करने में सक्षम बनाता है।
एक अन्य हैडऑप तकनीक जो आप उपयोगी पा सकते हैं वह वर्ग है - जो एचडीएफएस और आरडीबीएमएस के बीच डेटा ले जाती है।

+0

उत्तर के लिए धन्यवाद। मेरे अंदर नीचे उतरो, मुझे पता है कि हैडोप और लोचदार MapReduce यहां उपयोग करने के लिए सही बात है। हालांकि, मैं अपने सिर को लपेट नहीं सकता कि यह कैसे काम करेगा जो मैं पूरा करने की कोशिश कर रहा हूं। मेरी समस्या का एक हिस्सा यह है कि मैंने जो भी उदाहरण देखा है वह वही मूर्ख शब्द-गिनती समस्या है। मेरा वास्तव में एक ईटीएल (निकालने, बदलने, लोड) समस्या का अधिक है। मैं आसानी से नक्शा फ़ंक्शन को अधिकांश परिवर्तनों को संभालने की कल्पना कर सकता हूं। लेकिन, रूपांतरण ग्राहक निर्भर हैं। तो, यह एक साधारण गणना नहीं है (उदाहरण के लिए (x * y)/2)। –

1

तुम भी StarCluster
StarCluster साथ EC2 पर बहुत आसानी से ipython के समानांतर कंप्यूटिंग का उपयोग कर सकते बनाने और अमेज़न के EC2 पर होस्ट वितरित कंप्यूटिंग क्लस्टर प्रबंधन के लिए एक उपयोगिता है।

http://ipython.org/ipython-doc/stable/parallel/parallel_demos.html
http://star.mit.edu/cluster/docs/0.93.3/index.html
http://star.mit.edu/cluster/docs/0.93.3/plugins/ipython.html

+0

पोस्ट के लिए धन्यवाद! मैंने कभी इसके बारे में कभी नहीं सुना है! मैं इसे देख लूँगा! एक बार फिर धन्यवाद! –