我正在尝试在作为Spark群集节点的远程计算机上运行Python脚本。我在这台机器上拥有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()
[我从本地计算机(Linux Mint 19)将/usr/lib/python3.6/
文件夹复制到~/local/lib/python3.6
中的节点(Red Hat 7)-我的所有库现在都在~/local/lib/python3.6/dist-packages/
中,包括我需要的两个库。
我可以临时更改环境变量,并加载.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
库,但运行module load networkx/2.4
无效,找不到文件,并且无法在/usr/lib/
或[中进行任何修改C0]。
另一种尝试,我在脚本中添加了以下几行:
/some/path/modulefiles/
但是这不起作用。
由于集群,虚拟环境不可行。
我可以强制模块在我的本地目录中查找吗?我可以强制我的库的文件路径吗?
如果我理解正确,则您只能访问spark群集的一个节点。正确的方法是,在所有执行程序上打开共享的挂载,而不是将venv复制到挂载中,并添加--conf spark.pyspark.python = / path / to / venv。
因为您对此没有权限,所以唯一的方法(当您在群集上运行,而不是在本地模式下运行时)-是从您的site-packages文件夹(例如dep.zip)制作一个zip,比您提交作业(通过spark-submit)时添加--py-files。
[我不建议您这样做,因为在使用C编译库(例如numpy,pymssql ...)时,使用--pyfiles dep.zip的实验无法正常工作。