Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何导入我通过--py文件添加到集群的python模块?_Apache Spark_Import_Pyspark_Python Import - Fatal编程技术网

Apache spark 如何导入我通过--py文件添加到集群的python模块?

Apache spark 如何导入我通过--py文件添加到集群的python模块?,apache-spark,import,pyspark,python-import,Apache Spark,Import,Pyspark,Python Import,我想在应用程序中使用一些定制的jdbc驱动程序。当spark提交到Kubernetes spark群集时,我将这些作为--py文件包括在内: 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

我想在应用程序中使用一些定制的jdbc驱动程序。当spark提交到Kubernetes spark群集时,我将这些作为--py文件包括在内:

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
正如我所说的,我需要将这个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
因此,py文件确实被导入了,但是被导入了
/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确实试图将我通过
--py files
添加的
s3a://
文件添加到PYTHONPATH,只是它错误地解释了
,并且没有正确添加路径。
/var/data/..
目录位于PYTHONPATH中,但特定的.zip文件不在其中,因此我无法从中导入

我怎样才能解决这个问题?.zip文件尚未正确添加到路径,但在我的程序中,我也不知道

a。pyspark试图添加到的s3a://的路径 蟒蛇

b。.zip文件的`var/data/../local位置的路径。我知道它在某个地方,我想我可以解析出来,但那会很混乱

什么是优雅的解决方案?

一个(糟糕的)解决方案是简单地解析出看起来可能包含.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

这个解决方案起作用,允许我们进入我们的实际星火应用程序的测试,但是我不认为这是一个准备好的解决方案。 一个(糟糕的)解决方案是简单地解析出看起来可能包含.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

这个解决方案起作用,允许我们进入我们的实际星火应用程序的测试,但是我不认为这是一个准备好的解决方案。 更好的解决方案是使用pyspark中的SparkFiles对象来定位导入

from pyspark import SparkFiles

spark.sparkContext.addPyFile(SparkFiles.get("pyspark_jdbc.zp"))
更好的解决方案是使用pyspark中的SparkFiles对象来定位导入

from pyspark import SparkFiles

spark.sparkContext.addPyFile(SparkFiles.get("pyspark_jdbc.zp"))

回答得好!。。我只是在找这个。很好的答案!。。我只是在找这个。