2015-06-27 4 views
16

मैंने पायथन में वर्गीकृत को लागू करने वाली कक्षा लिखी है। मैं इस वर्गीकृत का उपयोग कर बड़ी संख्या में डेटापॉइंट्स के वर्गीकरण को समानांतर करने के लिए अपाचे स्पार्क का उपयोग करना चाहता हूं।अपाचे स्पार्क (pyspark) के साथ कस्टम कक्षाओं का उपयोग कैसे करें?

  1. मैं 10 स्लेव के साथ क्लस्टर पर अमेज़ॅन ईसी 2 का उपयोग करके स्थापित किया गया है, जो उस पर पाइथन के एनाकोंडा वितरण के साथ आता है। अमी मुझे दूरस्थ रूप से आईपीथन नोटबुक का उपयोग करने देता है।
  2. मैं परिभाषित किया है एक फ़ाइल में वर्ग BoTree में फ़ोल्डर /root/anaconda/lib/python2.7/ मास्टर जो वह जगह है जहाँ अपने सभी अजगर मॉड्यूल
  3. मुझे लगता है कि देख लिया है कर रहे हैं पर BoTree.py फोन मैं मास्टर से कमांड लाइन स्पार्क चलाते समय BoTree.py आयात और उपयोग कर सकता हूं (मुझे केवल आयात बोट्री लिखना शुरू करना है और मेरी कक्षा बोटीरी
  4. मैंने स्पार्क/रूट/स्पार्क-ec2/copy-dir का उपयोग किया है .sh स्क्रिप्ट मेरे क्लस्टर में /python2.7/ निर्देशिका की प्रतिलिपि बनाने के लिए।
  5. मैंने दासों में से एक में एसएसएच-एड किया है और वहां आईपीथॉन चलाने की कोशिश की है, और बोटीरी आयात करने में सक्षम था, इसलिए मुझे लगता है कि मॉड्यूल रहा है क्लस्टर में सफलतापूर्वक भेजा गया (मैं BoTree.py फ़ाइल को .../python2.7 में भी देख सकता हूं/फ़ोल्डर)
  6. मास्टर पर मैंने जांच की है कि मैं सीपीकल का उपयोग करके एक बोटीरी इंस्टेंस को अचार और अनपिक कर सकता हूं, जिसे मैं समझता हूं कि पाइस्पार्क का सीरियलाइज़र है।

हालांकि, जब मैं निम्न कार्य करें:

File "/root/spark/python/pyspark/worker.py", line 90, in main 
    command = pickleSer.loads(command.value) 
    File "/root/spark/python/pyspark/serializers.py", line 405, in loads 
    return cPickle.loads(obj) 
ImportError: No module named BoroughTree 

किसी को भी मेरी मदद कर सकते:

import BoTree 
bo_tree = BoTree.train(data) 
rdd = sc.parallelize(keyed_training_points) #create rdd of 10 (integer, (float, float) tuples 
rdd = rdd.mapValues(lambda point, bt = bo_tree: bt.classify(point[0], point[1])) 
out = rdd.collect() 

स्पार्क त्रुटि (सिर्फ प्रासंगिक बिट मुझे लगता है कि) के साथ विफल रहता है? कुछ हद तक हताश ...

धन्यवाद

उत्तर

13

शायद सबसे सरल समाधान pyFiles तर्क का उपयोग करने के लिए जब आप SparkContext

from pyspark import SparkContext 
sc = SparkContext(master, app_name, pyFiles=['/path/to/BoTree.py']) 

हर फ़ाइल रखा वहाँ श्रमिकों के लिए भेज दिया जाएगा और PYTHONPATH को जोड़ा पैदा करते हैं।

यदि आप एक इंटरैक्टिव मोड में काम कर रहे हैं तो आपको एक नया निर्माण करने से पहले sc.stop() का उपयोग करके मौजूदा संदर्भ को रोकना होगा।

यह भी सुनिश्चित करें कि स्पार्क कार्यकर्ता वास्तव में एनाकोंडा वितरण का उपयोग कर रहा है और डिफ़ॉल्ट पायथन दुभाषिया नहीं है। आपके विवरण के आधार पर यह समस्या की सबसे अधिक संभावना है। PYSPARK_PYTHON सेट करने के लिए आप conf/spark-env.sh फ़ाइलों का उपयोग कर सकते हैं।

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

+0

इस के लिए धन्यवाद। मैं पाइथन इंटरैक्टिव रूप से उपयोग कर रहा हूं, इसलिए मैं स्पार्ककॉन्टेक्स्ट सेट नहीं कर सकता। मैं इस मामले में pyFiles के बराबर कैसे करूँ? मैंने एक फ़ंक्शन को परिभाषित किया है जो sys आयात करता है और फिर sys.executable देता है। मुझे लगता है कि यह मुझे बता रहा है कि मेरे सभी गुलाम एनाकोंडा चला रहे हैं। हालांकि, अगर मैं उनमें शामिल हूं तो मैं देख सकता हूं कि पर्यावरण परिवर्तनीय PYSPARK_PYTHON सेट नहीं है। मैं अपने दासों पर पायथनपैट कैसे संपादित कर सकता हूं? – user3279453

+0

वास्तव में आप एक इंटरैक्टिव मोड में स्पार्ककॉन्टेक्स्ट बना सकते हैं। इसके बारे में कुछ विवरण और 'PYSPARK_PYTHON' चर – zero323

10

एक बार स्पार्ककॉन्टेक्स्ट अधिग्रहण हो जाने के बाद, कोई भी प्रत्येक कार्यकर्ता को मॉड्यूल भेजकर addPyFile का उपयोग कर सकता है।

sc.addPyFile('/path/to/BoTree.py') 

pyspark.SparkContext.addPyFile(path) documentation

+0

के लिए अद्यतन उत्तर देखें यह बहुत ही बढ़िया और बिल्कुल वही है जो मैं ढूंढ रहा था ... चीयर्स। – tamale

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