मैं एक साथ कई समानांतर शैल नौकरियां कैसे चला सकता हूं और उन सभी की निगरानी कर सकता हूं?


3

मेरे पास बड़ी संख्या में बड़ी फाइलें (सैकड़ों फाइलें, प्रत्येक एमबी के सैकड़ों) हैं जिन्हें मुझे फ़िल्टर करने और उन्हें बदलने के लिए कई कार्यक्रमों के माध्यम से पाइप करने की आवश्यकता है। मैं कई सीपीयू कोर का लाभ ले रहा हूं, इसलिए मैं प्रत्येक फ़ाइल पर एक ही पाइप के कई उदाहरण चला रहा हूं (एक सौ कोर तक हो सकता है, और पाइप के हिस्से के रूप में एसएचएस का उपयोग कर सकता है, मामले में कोई फर्क नहीं पड़ता है जवाब देने के)। मैं प्रत्येक पाइप की निगरानी करना चाहता हूं, और उसके pvलिए उपयोग कर रहा हूं । यहाँ मेरे पास एक न्यूनतम उदाहरण है:

$ pv file-001.gz | gunzip | xz > file-001.xz
1.58GB 0:00:02 [ 713MB/s] [=================================>] 100%

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

वर्तमान में, मुझे पाइप के प्रत्येक उदाहरण के लिए एक अलग टर्मिनल विंडो की आवश्यकता है। मैं जो करना चाहता हूं, वह एकल टर्मिनल / शेल में पाइप के एन समानांतर उदाहरणों को शुरू करना है, और स्वयं की लाइन पर प्रत्येक पीवी उदाहरण से आउटपुट प्राप्त करना है। कुछ इस तरह:

1.48GB 0:00:54 [ 704MB/s] [===============================>  ]  97% ETA 00:00:06
1.58GB 0:01:00 [ 713MB/s] [=================================>] 100%
0.75GB 0:00:31 [ 709MB/s] [================>                 ]  50% ETA 00:00:29

एन के लिए मूल्य उन पंक्तियों की संख्या होगी जिन्हें मैं एक टर्मिनल विंडो में फिट कर सकता हूं, 3-50 या तो कहते हैं। प्रगति रिपोर्ट का सटीक प्रारूप महत्वपूर्ण नहीं है, जब तक कि इसमें गति, प्रतिशत, किया हुआ समय और अनुमानित शेष समय शामिल हैं। यह भी महत्वपूर्ण नहीं है कि मैं उपयोग करता हूं pv, जब तक मैं इसे आसानी से स्थापित कर सकता हूं या बस सादे खोल (बाश, अधिमानतः) का उपयोग करना ठीक है। हालांकि, जो महत्वपूर्ण है, वह यह है कि विधि कभी-कभी टूटी हुई पाइप को संभाल सकती है यदि किसी कारणवश पाइप का एक हिस्सा दुर्घटनाग्रस्त हो जाता है। मैं हर बार एक नौकरी खत्म (सफलतापूर्वक या नहीं) नई नौकरियां शुरू करना चाहूंगा और अभी भी अप्रमाणित फाइलें बाकी हैं।

इसे कैसे करना है इस पर कोई आइडिया?

ध्यान दें कि मैंने पहले ही GNU समानांतर की कोशिश की है , लेकिन इसकी ssh विशेषताएँ यह मानती हैं कि प्रत्येक इनपुट फ़ाइल को पहले दूरस्थ होस्ट में स्थानांतरित किया गया, फिर संसाधित किया गया, फिर परिणाम वापस स्थानांतरित कर दिया गया, जो कि डेटा की मात्रा के कारण मैं बचना चाहता हूं और प्रत्येक प्रसंस्करण नोड पर सीमित मात्रा में स्थान।

जवाबों:


4

क्या आपने --pipeजीएनयू समानांतर के लिए देखा ?

cat bigfiles* | pv | parallel --pipe -S server1,server2 'cat | process_pipe'

(बिल्ली जोर देने के लिए शामिल)

यह 1 एमबी ब्लॉकेज को डिफॉल्ट करता है, जिसे --ब्लॉक के साथ समायोजित किया जा सकता है।

1-1 पत्राचार के लिए संपादित करें -

उपरोक्त के आधार पर आप इस तरह 1-1 पत्राचार कर सकते हैं:

parallel --eta "cat {} | parallel --pipe -S server1,server2 'cat | process_pipe' > {}.out" ::: bigfiles*

(बिल्ली जोर देने के लिए शामिल)

यह काफी इष्टतम नहीं है, क्योंकि आंतरिक समानांतर में अपने भाई-बहनों के बारे में नहीं पता होगा और इस तरह सर्वर 1 पर सर्वर 1 से अधिक स्पॉन हो सकता है। इससे बचने का एक तरीका बाहरी समानांतर पर -j1 है, लेकिन यह इष्टतम नहीं होगा यदि आंतरिक में केवल पहले सर्वर के लिए पर्याप्त ब्लॉक हैं। दूसरे शब्दों में: अपने वर्कलोड को पूरी तरह से संतुलित करने के लिए आपको इसके साथ थोड़ा फील करना पड़ सकता है - शायद 100% या इसी तरह का भी उपयोग करें।

--- संपादित करें: दुर्घटनाओं से निपटने ---

यदि process_pipeएक त्रुटि के साथ रिटर्न मिलता है, तो यह कमांड को 2 बार फिर से प्रयास करना चाहिए:

parallel --retries 3 --eta "cat {} | parallel --pipe -S server1,server2 'cat | process_pipe' > {}.out" ::: bigfiles*

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

3

इसे कैसे करना है इस पर कोई आइडिया?

नहीं।

pv में -c और -N विकल्प हैं जो आपको वह करने में सक्षम बनाते हैं जो आप चाहते हैं

$ pv -cN source access.log | gzip | pv -cN gzip > access.log.gz
source:  760MB 0:00:15 [37.4MB/s] [=>     ] 19% ETA 0:01:02
  gzip: 34.5MB 0:00:15 [1.74MB/s] [  <=>  ]

लेकिन मैं यह नहीं देख सकता कि इस सुविधा को कई पाइपलाइनों में कैसे लागू किया जाए


हालाँकि, यदि आप pv के लिए मैन पेज देखते हैं तो आप इसे देखेंगे

          (tar cf - . \
           | pv -n -s $(du -sb . | awk '{print $1}') \
           | gzip -9 > out.tgz) 2>&1 \
          | dialog --gauge 'Progress' 7 70

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

वर्तमान में, मुझे पाइप के प्रत्येक उदाहरण के लिए एक अलग टर्मिनल विंडो की आवश्यकता है

मेरा मुख्य मुद्दा यह है कि आपके लिए यह आवश्यक नहीं है कि आप बहुत सी टर्मिनल विंडो को इंटरेक्टिव रूप से खोल सकें, आप एक स्क्रिप्ट को बहुत सारे डायलॉग बॉक्स खोल सकते हैं।



ओपनिंग डायलॉग बॉक्स को स्वचालित करने के सुझाव के लिए +1।
बजे फेबियन फगारहोम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.