Han*_*ian 3 python-3.x apache-spark pyspark
我在此路径下保存了这两个文件:
C:\code\sample1\main.py
def method():
return "this is sample method 1"
Run Code Online (Sandbox Code Playgroud)
C:\code\sample2\main.py
def method():
return "this is sample method 2"
Run Code Online (Sandbox Code Playgroud)
然后我运行这个:
from pyspark import SparkContext
from pyspark.sql import SparkSession
sc = SparkContext()
spark = SparkSession(sc)
sc.addPyFile("~/code/sample1/main.py")
main1 = __import__("main")
print(main1.method()) # this is sample method 1
sc.addPyFile("~/code/sample2/main.py") # Error
Run Code Online (Sandbox Code Playgroud)
错误是
Py4JJavaError:调用 o21.addFile 时出错。: org.apache.spark.SparkException: 文件 C:\Users\hans.yulian\AppData\Local\Temp\spark-5da165cf-410f-4576-8124-0ab23aba6aa3\userFiles-25a7ca23-84fb-42b7-969d67fmain .py 存在并且与 /C:/Users/hans.yulian/Documents/spark-test/main2/main.py 的内容不匹配
这意味着它的临时文件夹中已经有“main.py”文件并且内容不同。我想知道这种情况是否有任何解决方法,但对我来说,我有以下限制:
虽然在技术上是可行的,但通过设置spark.files.overwrite 为"true":
from pyspark import SparkConf, SparkContext
sc = SparkContext(conf=SparkConf().set("spark.files.overwrite", "true"))
Run Code Online (Sandbox Code Playgroud)
并且在简单的情况下会给出正确的结果
def f(*_):
from main import method
return [method()]
sc.addFile("/path/to/sample1/main.py")
sc.parallelize([], 3).mapPartitions(f).collect()
Run Code Online (Sandbox Code Playgroud)
from pyspark import SparkConf, SparkContext
sc = SparkContext(conf=SparkConf().set("spark.files.overwrite", "true"))
Run Code Online (Sandbox Code Playgroud)
def f(*_):
from main import method
return [method()]
sc.addFile("/path/to/sample1/main.py")
sc.parallelize([], 3).mapPartitions(f).collect()
Run Code Online (Sandbox Code Playgroud)
['this is sample method 1',
'this is sample method 1',
'this is sample method 1']
Run Code Online (Sandbox Code Playgroud)
它在实践中并不可靠,即使您reload在每次访问时使用模块,也会使您的应用程序难以推理。由于 Spark 可能会隐式缓存某些对象,或者透明地重新启动 Python 工作程序,因此您很容易陷入不同节点看到不同源状态的情况。
| 归档时间: |
|
| 查看次数: |
5507 次 |
| 最近记录: |