2010-11-06 8 views
8

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

अब तक मैं ऐसा है कि मैं एक नक्शाकार और एक कम करने कि मैं मानक में अपने स्थानीय मशीन पर चला सकते मेरी अजगर कोड को संशोधित कर लिया है 'परीक्षा का प्रारूप।'

$ cat data.txt | mapper.py | reducer.py 

नक्शाकार आंकड़ों की प्रत्येक पंक्ति को जिस तरह से बाइनरी इसे लपेटता है, उसे स्वरूपित करता है, सबप्रोसेसपोपेन का उपयोग करके बाइनरी को टेक्स्ट भेजता है (यह मुझे बहुत अधिक नकली एसटीडीओयूटी मास्क करने की इजाजत देता है), फिर मैं चाहता हूं कि स्टॉट इकट्ठा करता है, और इसे लाइनों में स्वरूपित करता है reducer के लिए उपयुक्त पाठ का। समस्या तब उत्पन्न होती है जब मैं स्थानीय हैडऑप इंस्टॉल पर कमांड को दोहराने का प्रयास करता हूं। मैं मैपर को निष्पादित करने के लिए प्राप्त कर सकता हूं, लेकिन यह एक त्रुटि देता है जो बताता है कि यह बाइनरी निष्पादन योग्य नहीं ढूंढ सकता है।

File "/Users/me/Desktop/hadoop-0.21.0/./phyml.py", line 69, in main() File "/Users/me/Desktop/hadoop-0.21.0/./mapper.py", line 66, in main phyml(None) File "/Users/me/Desktop/hadoop-0.21.0/./mapper.py", line 46, in phyml ft = Popen(cli_parts, stdin=PIPE, stderr=PIPE, stdout=PIPE) File "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", line 621, in init errread, errwrite) File "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", line 1126, in _execute_child raise child_exception OSError: [Errno 13] Permission denied

मेरे Hadoop आदेश की तरह लग रहा है:

./bin/hadoop jar /Users/me/Desktop/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \ 
-input /Users/me/Desktop/Code/AWS/temp/data.txt \ 
-output /Users/me/Desktop/aws_test \ 
-mapper mapper.py \ 
-reducer reducer.py \ 
-file /Users/me/Desktop/Code/AWS/temp/mapper.py \ 
-file /Users/me/Desktop/Code/AWS/temp/reducer.py \ 
-file /Users/me/Desktop/Code/AWS/temp/binary 

जैसा कि मैंने उल्लेख किया ऊपर यह मेरे लिए लगता है कि नक्शाकार बाइनरी के बारे में पता नहीं है - शायद यह गणना नोड के लिए भेजा जा रहा है ? दुर्भाग्य से मैं वास्तव में यह नहीं बता सकता कि समस्या क्या है। किसी भी तरह की सहायता का स्वागत किया जाएगा। बाइनरी एक्जिक्यूटिव को लपेटने वाले पायथन में लिखे गए कुछ हडूप स्ट्रीमिंग मैपर/रेड्यूसर को देखना अच्छा होगा। मैं कल्पना नहीं कर सकता कि मैं ऐसा करने की कोशिश करने वाला पहला व्यक्ति हूं! वास्तव में, यहाँ एक और पोस्ट मूलतः एक ही सवाल पूछ रहा है, लेकिन यह अभी तक उत्तर नहीं किया गया है ...

Hadoop/Elastic Map Reduce with binary executable?

+0

ऐसा लगता है कि यह एक अनुमतियाँ समस्या हो सकती है की तरह। स्पष्ट रूप से hadoop-stream.jar 'फ़ाइल' अनुमतियों को खो देता है जब यह उन्हें .jar फ़ाइलों में संकुल करता है जो यह गणना नोड्स को भेजता है। कोई सुझाव? –

+0

ठीक है। अमेज़ॅन पर ऐसा करने के तरीके पर 'कुछ' जानकारी है।http://developer.amazonwebservices.com/connect/thread.jspa?messageID=130482🶲 –

उत्तर

4

ज्यादा googling (आदि) के बाद मुझे पता लगा कि कैसे निष्पादन बाइनरी/लिपियों शामिल करने के लिए/मॉड्यूल जो आपके मैपर/reducers के लिए सुलभ हैं। यह चाल है कि आप सभी फ़ाइलों को पहले हडूप पर अपलोड करें।

$ bin/hadoop dfs -copyFromLocal /local/file/system/module.py module.py 

तो फिर तुम आप निम्नलिखित टेम्पलेट की तरह आदेश स्ट्रीमिंग प्रारूप करने के लिए की जरूरत है:

$ ./bin/hadoop jar /local/file/system/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \ 
-file /local/file/system/data/data.txt \ 
-file /local/file/system/mapper.py \ 
-file /local/file/system/reducer.py \ 
-cacheFile hdfs://localhost:9000/user/you/module.py#module.py \ 
-input data.txt \ 
-output output/ \ 
-mapper mapper.py \ 
-reducer reducer.py \ 
-verbose 

आप एक अजगर मॉड्यूल लिंक कर रहे हैं आप अपने नक्शाकार/कम करने लिपियों के लिए निम्न कोड जोड़ने की आवश्यकता होगी :

import sys 
sys.path.append('.') 
import module 

आप अपने आदेश subprocessing कुछ इस तरह दिखना चाहिए के माध्यम से एक द्विआधारी प्रवेश कर रहे हैं:

0,123,
cli = "./binary %s" % (argument) 
cli_parts = shlex.split(cli) 
mp = Popen(cli_parts, stdin=PIPE, stderr=PIPE, stdout=PIPE) 
mp.communicate()[0] 

उम्मीद है कि इससे मदद मिलती है।

+0

इसके अलावा, मैंने यह कोशिश नहीं की है, लेकिन मुझे लगता है कि स्ट्रीमिंग कमांड को सब कुछ ज़िप करके और -cacheArchive कमांड का उपयोग करके सरलीकृत किया जा सकता है। –

2

समझे इसे चलाने अंत में

$pid = open2 (my $out, my $in, "./binary") or die "could not run open2"; 
+0

मुझे एक ही समस्या है लेकिन मुझे आपके समाधान के बाद परेशानी है, क्या आप कृपया स्पष्टीकरण दे सकते हैं? – AlexIIP

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