如何导入通过--py-files添加到集群的python模块?

问题描述 投票:1回答:2

我有一些要在应用程序中使用的自定义jdbc驱动程序。当我提交给Kubernetes Spark集群时,我将它们作为--py-files包括在内:

spark-submit --py-files s3a://bucket/pyfiles/pyspark_jdbc.zip my_application.py

这给了我:

java.io.FileNotFoundException: File file:/opt/spark/work-dir/pyspark_jdbc.zip does not exist

[other answers告诉我,我实际上需要将该zip文件添加到PYTHONPATH中。现在,我发现至少在Spark 2.3以上版本不再适用,但可以使用:

spark.sparkContext.addPyFile("pyspark_jdbc.zip")

查看集群日志,我看到:

19/10/21 22:40:56 INFO Utils: Fetching s3a://bucket/pyfiles/pyspark_jdbc.zip to 
/var/data/spark-52e390f5-85f4-41c4-9957-ff79f1433f64/spark-402e0a00-6806-40a7-a17d-5adf39a5c2d4/userFiles-680c1bce-ad5f-4a0b-9160-2c3037eefc29/fetchFileTemp5609787392859819321.tmp

因此,可以肯定地导入了pyfile,但是将它们导入到/var/data/...中,而不是导入到我的工作目录中。因此,当我将.zip文件的位置添加到python路径时,我不知道它在哪里。在尝试添加python文件之前对群集进行一些诊断:

> print(sys.path)
[..., 
 '/var/data/spark-52e390f5-85f4-41c4-9957-ff79f1433f64/spark-402e0a00-6806-40a7-a17d-5adf39a5c2d4/userFiles-680c1bce-ad5f-4a0b-9160-2c3037eefc29', 
 '/opt/spark/work-dir/s3a', 
 '//bucket/pyfiles/pyspark_jdbc.zip'
...]
> print(os.getcwd())
/opt/spark/work-dir
> subprocess.run(["ls", "-l"])
total 0

因此,我们看到pyspark确实尝试将我通过s3a://添加的--py-files文件添加到PYTHONPATH,除了它错误地解释了:并且没有正确添加路径。 /var/data/...目录位于PYTHONPATH中,但是特定的.zip文件不在,因此我无法从中导入。

我该如何解决这个问题? .zip文件没有正确添加到路径,但是在我的程序中,我也不知道

a。 pyspark尝试添加到s3a://的路径PYTHONPATH

b。 .zip文件的`var / data /.../本地位置的路径。我知道它在某处的路径中,我想我可以将其解析出来,但这很混乱。

对此有什么优雅的解决方案?

apache-spark import pyspark python-import
2个回答
0
投票

(一个坏的解决方案是简单地解析看起来可能包含.zip文件的路径,并将其添加到sys.path

for pth in [p for p in sys.path if p.startswith("/var/data/spark-")]:
    try:
        sys.path.append("{}/pyspark_jdbc.zip".format(pth))
    except:
        passed

此解决方案有效,使我们能够测试实际的火花应用程序,但我认为这不是可用于生产的解决方案。


0
投票

(更好的解决方案是使用pyspark中的SparkFiles对象来定位您的导入。

from pyspark import SparkFiles

spark.sparkContext.addPyFile(SparkFiles.get("pyspark_jdbc.zp"))
© www.soinside.com 2019 - 2024. All rights reserved.