मैं एक दूरस्थ मशीन पर एक पायथन स्क्रिप्ट चलाने की कोशिश कर रहा हूं जो स्पार्क क्लस्टर के लिए एक नोड है। मेरे पास इस मशीन पर अपने लिए एक छोटे से होम फोल्डर से परे 0 अधिकार हैं, लेकिन मेरी स्क्रिप्ट को चलाने के लिए मुझे दो पुस्तकालयों (networkx और shapely) की आवश्यकता है।

चूंकि मेरा मुद्दा पूरी तरह से आयात के साथ है, मैं वर्तमान में एक बुनियादी wordcount स्क्रिप्ट चलाने की कोशिश कर रहा हूं, लेकिन उन पुस्तकालयों को आयात कर रहा हूं जिनकी मुझे अपनी अंतिम परियोजना के लिए आवश्यकता होगी।

from pyspark import SparkConf
from pyspark import SparkContext

def calculate(sc):
    text_file = sc.textFile("nevergonnagive.txt")
    counts = text_file.flatMap(lambda line: line.split(" ")) \
                 .map(lambda word: (word, 1)) \
                 .reduceByKey(lambda a, b: a + b)
    counts.saveAsTextFile("word_count_OUT")
    return sc

sc = SparkContext.getOrCreate()

conf_spark = SparkConf()

conf_spark.set('spark.executorEnv.PYTHONPATH','~/local/lib/:/usr/bin/python3.6')
conf_spark.set('spark.executorEnv.LD_LIBRARY_PATH','~/local/lib/python3.6: /some/path/Python/3.7.2/lib')

import itertools
import networkx as nx
from networkx.algorithms.connectivity import local_edge_connectivity
import random
from shapely.geometry import Polygon
from shapely.ops import cascaded_union
import xml.etree.ElementTree as ET

sc=calculate(sc)
sc.close()

मैंने अपने /usr/lib/python3.6/ फ़ोल्डर को अपनी स्थानीय मशीन (लिनक्स मिंट 19) से नोड (Red Hat 7) में ~/local/lib/python3.6 में कॉपी किया - मेरे सभी पुस्तकालय अब ~/local/lib/python3.6/dist-packages/ में हैं, जिनमें दो I जरुरत।

मैं अस्थायी रूप से पर्यावरण चर बदल सकता हूं, और .lua मॉड्यूल लोड कर सकता हूं (जिसका मुझे कोई अनुभव नहीं है)। कुछ मॉड्यूल पहले से ही इस नोड पर /usr/lib/modules में मौजूद हैं:

$ module show python/3.6.5
------------------------------------------------------------------------------------------------
   /some/path/modulefiles/python/3.6.5.lua:
------------------------------------------------------------------------------------------------
help([[Interpréteur Python
Version disponible sous rh7
]])
whatis("Nom     : Python")
whatis("Version : 3.6.5")
whatis("Os      : rh7")
whatis("Date d installation : 14/08/2019")
setenv("PYTHON_HOME","/some/path/Python/3.6.5")
prepend_path("PATH","/some/path/Python/3.6.5/bin")
prepend_path("LD_LIBRARY_PATH","/some/path/Python/3.6.5/lib")
prepend_path("MANPATH","/some/path/Python/3.6.5/share/man")
prepend_path("PKG_CONFIG_PATH","/some/path/Python/3.6.5/lib/pkgconfig")
setenv("PIP_CERT","/some/path/certs/ca-bundle.crt")

मैंने networkx लाइब्रेरी को इंपोर्ट करने के लिए अपने होम फोल्डर में इसी तरह की फाइल बनाने की कोशिश की, लेकिन मॉड्यूल लोड नेटवर्कx/2.4 चलाने से काम नहीं चला, यह फाइल नहीं ढूंढ सका, और मैं /usr/lib/ या /some/path/modulefiles/ में कुछ भी संशोधित नहीं कर सकता।

एक अन्य प्रयास में, मैंने अपनी स्क्रिप्ट में निम्नलिखित पंक्तियाँ जोड़ीं:

conf_spark.set('spark.executorEnv.PYTHONPATH','~/local/lib/:/usr/bin/python3.6')
conf_spark.set('spark.executorEnv.LD_LIBRARY_PATH','~/local/lib/python3.6: /some/path/Python/3.7.2/lib')

लेकिन ये काम नहीं हुआ.

वर्चुअल वातावरण क्लस्टरिंग के कारण प्रश्न से बाहर हैं।

क्या मैं मॉड्यूल को अपनी स्थानीय निर्देशिका में देखने के लिए बाध्य कर सकता हूं? क्या मैं अपने पुस्तकालयों के फ़ाइल पथ को बाध्य कर सकता हूँ?

1
Jessica Chambers 29 नवम्बर 2019, 12:03

1 उत्तर

अगर मैं सही ढंग से समझूं, तो आपके पास स्पार्क क्लस्टर के केवल एक नोड तक पहुंच है। इसे करने का सही तरीका है, अपने वेनव को माउंट में कॉपी करने के बजाय, सभी निष्पादकों पर साझा माउंट खोलना है, और --conf Spark.pyspark.python=/path/to/venv जोड़ें।

क्योंकि आपके पास इसके लिए प्रीमिशन नहीं है, केवल एक ही तरीका है कि आप इसे कर सकते हैं (जब आप क्लस्टर पर चलते हैं, और स्थानीय मोड पर नहीं) - अपने साइट-पैकेज फ़ोल्डर (जैसे dep.zip) से एक ज़िप बनाना है, जब से आप नौकरी जमा करते हैं (स्पार्क-सबमिट के माध्यम से) --py-files जोड़ें।

मैं आपको ऐसा करने की सलाह नहीं देता, क्योंकि मेरे प्रयोग के साथ --pyfiles dep.zip ठीक से काम नहीं करेगा जब आपके पास C संकलित पुस्तकालय होंगे (जैसे numpy, pymssql...)।

0
ShemTov 1 पद 2019, 00:59