如何将 Python 库添加到远程集群机器?

我正在尝试在作为 Spark 集群节点的远程机器上运行 Python 脚本。在这台机器上,我没有除一个小家目录以外的任何权限,但是为了运行我的脚本,我需要两个库(networkxshapely)。

由于我的问题仅限于导入,因此我目前正在尝试运行一个基本的 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/ 文件夹从我的本地机器(Linux Mint 19)复制到节点(Red Hat 7)中的 ~/local/lib/python3.6 中,所有的库都已经在 ~/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//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')

但是这没有起作用。

由于集群化的原因,虚拟环境是不可能的。

我能否强制要求模块查找我的本地目录?我能否强制要求我的库文件路径?

点赞
用户12461814
用户12461814

如果我理解正确,您仅有一个spark集群节点的访问权限。 正确的操作是在所有执行节点上打开共享的挂载,然后将您的venv复制到挂载中,并添加 --conf spark.pyspark.python=/path/to/venv。

由于您没有权限这样做,当您在集群上运行而不是在本地模式下运行时,您唯一可以做的是从您的site-packages文件夹中制作一个zip文件(例如dep.zip),然后在提交作业时(通过spark-submit)添加 --py-files。

我不建议您这样做,因为我用 --pyfiles dep.zip 进行实验时,当您有C编译库(如numpy,pymssql...)时,将无法正常工作。

2019-11-30 21:59:51