spark-submit --py-files给出警告 运行时警告:无法将"spark.submit.pyFiles"中指定的文件<abc.py>添加到Python路径:



我们有一个基于pyspark的应用程序,我们正在进行如下所示的spark提交。应用程序正在按预期工作,但我们看到了一条奇怪的警告消息。有什么办法处理这个问题吗?或者为什么会这样?

注意:该集群是Azure HDI集群。

spark-submit --master yarn  --deploy-mode cluster --jars file:/<localpath>/* --py-files pyFiles/__init__.py,pyFiles/<abc>.py,pyFiles/<abd>.py  --files files/<env>.properties,files/<config>.json main.py

看到的警告是:

warnings.warn(/usr/hdp/current/spark3 client/python/pyspark/context.py:256:运行时警告:无法添加文件[file:///home/sshuser/project/pyFiles/abc.py]在中指定"spark.submit.pyFiles"到Python路径:
/mnt/resource/hadop/yarn/local/usercache/shsuser/filecache/929

以上警告适用于所有文件,即abc.py、abd.py等(曾传递给--py文件(

由于Spark是开源的,我们可以在https://github.com/apache/spark/blob/master/python/pyspark/context.py#L350

在那里,我们可以看到Spark正在有效地执行这样的操作:

from pyspark import SparkFiles
from pyspark.sql import SparkSession
if __name__ == '__main__':
spark = SparkSession.builder.appName("MyApp").getOrCreate()
path = spark.conf.get("spark.submit.pyFiles").split(',')[0]
(dirname, filename) = os.path.split(path)
filepath = os.path.join(SparkFiles.getRootDirectory(), filename)
if not os.path.exists(filepath):
shutil.copyfile(path, filepath)

基本上,它会尝试将文件从原始位置复制到Spark应用程序根目录,以便可以找到它们。如果您运行此代码,您将获得被Spark隐藏的实际异常。

示例在我的案例中,我们使用livy将Azure blob存储中的文件提交给Yarn,而shutil引发的异常是FileNotFoundError: [Errno 2] No such file or directory: 'abfss://mycontainer@mystorage.dfs.core.windows.net/myappid/28_02_2023_15_33_56_146/pyFiles/imported_file.py',我想是因为shutil无法处理abfs文件路径。

然而,Yarn已经将文件从原始位置复制到livy filecache(如hadoop Yarn nodemanager.log中所示(,我相信这个新位置已经在我们的pythonpath中,因此Spark不需要复制文件,我们可以安全地忽略警告。