2013-08-09 7 views
10

मैं जहाँ से lib.pylib मॉड्यूल आयात करता है एक MapReduce काम main.py में परिभाषित है, की है।MapReduce नौकरी में कस्टम मॉड्यूल कैसे आयात करें?

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -files lib.py,main.py 
    -mapper "./main.py map" -reducer "./main.py reduce" 
    -input input -output output 

मेरी समझ में, यह प्रत्येक कंप्यूटिंग मशीन पर दोनों main.py और lib.py रखना चाहिए वितरित कैश फ़ोल्डर में है और इस तरह मॉड्यूल lib उपलब्ध बनाने: मैं Hadoop स्ट्रीमिंग Hadoop क्लस्टर के लिए इस काम प्रस्तुत करने के लिए इस प्रकार के रूप में उपयोग main पर। लेकिन ऐसा नहीं होता है: लॉग से मैं देखता हूं कि वास्तव में को उसी निर्देशिका में कॉपी किया गया है, लेकिन main आयात नहीं कर सकता, ImportError फेंक रहा है।

ऐसा क्यों होता है और मैं इसे कैसे ठीक कर सकता हूं?

यूपीडी। जोड़ना पथ के लिए वर्तमान निर्देशिका काम नहीं किया:,

import sys  
sys.path.append(os.path.realpath(__file__)) 
import lib 
# ImportError 

हालांकि लोड हो रहा है मॉड्यूल मैन्युअल चाल किया:

import imp 
lib = imp.load_source('lib', 'lib.py') 

लेकिन वह नहीं है जो मैं चाहता। तो पाइथन दुभाषिया एक ही निर्देशिका में अन्य .py फ़ाइलों को क्यों देखता है, लेकिन उन्हें आयात नहीं कर सकता है? ध्यान दें कि मैंने बिना किसी प्रभाव के एक ही निर्देशिका में खाली __init__.py फ़ाइल जोड़ने का प्रयास कर लिया है।

+0

क्या आपने यह सुनिश्चित करने के लिए 'main.py' में 'sys.path' की जांच की है कि कार्यशील निर्देशिका शामिल है? – lmjohns3

+0

@ lmjohns3: हाँ, कामकाजी निर्देशिका क्लासपाथ पर है। बीटीडब्लू, क्या यह स्वचालित रूप से स्क्रिप्ट चलाने के लिए शामिल नहीं है? (सिर्फ उत्सुक) – ffriend

+0

मेरा मानना ​​है कि यह पाइथन स्क्रिप्ट्स के लिए सच है जो कमांड लाइन पर शुरू हो गए हैं, लेकिन हैडोप स्ट्रीमिंग एक अन्य तरीके से पाइथन दुभाषिया शुरू कर सकती है (वास्तव में निश्चित नहीं)। किसी भी तरह से, मुझे अभी भी लगता है कि यह एक पथ मुद्दे की तरह लगता है। एक अलग तरीके से अपने मॉड्यूल वितरित करने की एक संभावना के लिए http://www.litfuel.net/plush/?postid=195 देखें। वैकल्पिक रूप से, अपने आदेशों को एक शेल स्क्रिप्ट में लिखने का प्रयास करें और '-mapper' और' -reducer' कमांड-लाइन तर्कों के लिए इसे पास करें। – lmjohns3

उत्तर

12

मैंने सवाल हाडोप उपयोगकर्ता सूची में पोस्ट किया और अंततः उत्तर मिला। यह पता चला है कि हैडोप वास्तव में उस स्थान पर फ़ाइलों की प्रतिलिपि नहीं बनाता है जहां कमांड चलता है, लेकिन इसके बजाय सिम्लिंक बनाता है। पाइथन, इसके बदले में, सिम्लिंक के साथ काम नहीं कर सकता है और इस प्रकार पाइथन मॉड्यूल के रूप में lib.py को नहीं पहचानता है।

सरल वैकल्पिक हल यहाँ main.py और lib.py दोनों, ताकि निर्देशिका को सिमलिंक एमआर काम कार्यशील निर्देशिका में रखा जाता है, एक ही निर्देशिका में डाल दिया है, जबकि दोनों फ़ाइलों को एक ही निर्देशिका में शारीरिक रूप से कर रहे हैं।

  1. app निर्देशिका में रखो main.py और lib.py: तो मैं निम्नलिखित किया था।
  2. main.py में मैं सीधे lib.py इस्तेमाल किया, कि है, आयात स्ट्रिंग -files विकल्प के साथ सिर्फ

    आयात lib

  3. अपलोड की गई app निर्देशिका है।

तो, अंतिम आदेश इस तरह दिखता है:

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -files app 
     -mapper "app/main.py map" -reducer "app/main.py reduce" 
     -input input -output output 
+0

दर्जनों फ़ाइलों को अपलोड करने के लिए -फाइल विकल्प का उपयोग करना मेरे हडूप पर्यावरण में काम नहीं करता था। –

3

जब Hadoop-स्ट्रीमिंग अजगर स्क्रिप्ट शुरू होता है, अपने अजगर स्क्रिप्ट के पथ वह जगह है जहाँ स्क्रिप्ट फ़ाइल वास्तव में है। हालांकि, हैडॉप उन्हें './' पर शुरू करता है, और आपका lib.py (यह एक सिम्लिंक है) './' पर भी है। तो, इससे पहले कि आप इस तरह lib.py आयात 'sys.path.append ("./")' जोड़ने का प्रयास: import sys sys.path.append('./') import lib

+0

मैं यार्न का उपयोग कर रहा हूं, जो कि समर्थित उत्तर का उपयोग नहीं करता है। यह बहुत अच्छा काम किया, धन्यवाद! – bkribbs

1

-files और -archive स्विच बस Hadoop के distributed cache (डीसी) के लिए शॉर्टकट हैं, एक और अधिक सामान्य तंत्र जो ज़िप, टैर और tgz/tar.gz प्रारूपों में अभिलेखागार को अपलोड और स्वचालित रूप से अनपैक करने की अनुमति देता है। यदि एक मॉड्यूल के बजाए आपकी लाइब्रेरी को संरचित पायथन पैकेज द्वारा कार्यान्वित किया जाता है, तो बाद की सुविधा वह है जो आप चाहते हैं।

हम सीधे के बाद से रिलीज 1.0.0-RC1, जहां आप बस एक mypkg.tgz संग्रह का निर्माण करने और अपने कार्यक्रम चलाने के रूप में कर सकते हैं Pydoop में इस समर्थन कर रहे हैं:

pydoop submit --upload-archive-to-cache mypkg.tgz [...] 

प्रासंगिक डॉक्स http://crs4.github.io/pydoop/self_contained.html में हैं और यहाँ एक है पूर्ण कार्य उदाहरण (wheel की आवश्यकता है): https://github.com/crs4/pydoop/tree/master/examples/self_contained

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