Databricks-Connect 还返回找不到多个 python 文件作业的模块

Posted

技术标签:

【中文标题】Databricks-Connect 还返回找不到多个 python 文件作业的模块【英文标题】:Databricks-Connect also return module not found for multiple python files job 【发布时间】:2020-07-10 23:15:17 【问题描述】:

目前,我正在通过 databricks-connect 使用本地 VS Code 连接到 databricks。但是我的提交都带有找不到模块的错误,这意味着没有找到其他python文件中的代码。 我试过了:

    将代码移动到 main.py 文件夹中

    在使用它的函数中导入文件

    通过 sparkContext.addPyFile 添加文件

有人有这方面的经验吗?或者更好的方式与 python 项目的数据块交互。

我的python部分代码似乎是在本地python env中执行的,只有与spark相关的代码在集群中,但集群并没有加载我所有的python文件。然后引发错误。

我有文件夹

main.py

lib222.py

__init__.py

在 lib222.py 中使用类 Foo

主要代码是:

from pyspark.sql import SparkSession
    
spark = SparkSession.builder.getOrCreate()
    
sc = spark.sparkContext
#sc.setLogLevel("INFO")
    
print("Testing addPyFile isolation")
sc.addPyFile("lib222.py")
from lib222 import Foo
print(sc.parallelize(range(10)).map(lambda i: Foo(2)).collect())

但我收到 Module not find lib222 的错误。

另外,当我打印一些系统信息的 python 版本时,python 代码似乎是在我的本地机器而不是远程驱动程序中执行的。 我的数据库版本是 6.6。 详细错误:

> Exception has occurred: Py4JJavaError
An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 6, 10.139.64.8, executor 0): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/databricks/spark/python/pyspark/serializers.py", line 182, in _read_with_length
return self.loads(obj)
File "/databricks/spark/python/pyspark/serializers.py", line 695, in loads
return pickle.loads(obj, encoding=encoding)
ModuleNotFoundError: No module named 'lib222'
>
>During handling of the above exception, another exception occurred:
>
>Traceback (most recent call last):
File "/databricks/spark/python/pyspark/worker.py", line 462, in main
func, profiler, deserializer, serializer = read_command(pickleSer, infile)
File "/databricks/spark/python/pyspark/worker.py", line 71, in read_command
command = serializer._read_with_length(file)
File "/databricks/spark/python/pyspark/serializers.py", line 185, in _read_with_length
raise SerializationError("Caused by " + traceback.format_exc())
pyspark.serializers.SerializationError: Caused by Traceback (most recent call last):
File "/databricks/spark/python/pyspark/serializers.py", line 182, in _read_with_length
return self.loads(obj)
File "/databricks/spark/python/pyspark/serializers.py", line 695, in loads
return pickle.loads(obj, encoding=encoding)
ModuleNotFoundError: No module named 'lib222```

【问题讨论】:

从错误消息中:“ModuleNotFoundError: No module named 'lib222'”看起来“lib222”模块丢失。能否请您安装名为“lib222”的模块并重试? 这个模块在那里,如果你检查我的文件夹信息。 【参考方案1】:

我在 AWS 上使用 Databricks,我遵循的最佳实践如下-

使用 pipconda 从本地环境卸载 PySpark 使用与 Databricks 运行时兼容的 python 环境在本地系统上创建虚拟环境。拥有虚拟环境可以让您更好地控制设置并避免版本冲突。 conda create -n ENV_NAME python==PYTHON_VERSION

客户端 Python 安装的次要版本必须与 Databricks 集群的次要 Python 版本(3.5、3.6 或 3.7)相同。 Databricks Runtime 5.x 有 Python 3.5,Databricks Runtime 5.x ML 有 Python 3.6,Databricks Runtime 6.1 及更高版本和 Databricks Runtime 6.1 ML 及更高版本有 Python 3.7。

注意:始终使用 pip 安装 Pyspark,因为它指向官方版本。 PySpark 安装时避免使用condaconda-forge

按照 databricks-connect 中的步骤配置工作区-Official-document 在您的 databricks 集群上检查 Pyspark 的现有版本及其依赖项。如果我正确,最新 PySpark 代码的依赖项的版本详细信息如下 - pandas0.23.2 NumPy1.7 pyarrow0.15.1 Py4J0.10.9

【讨论】:

以上是关于Databricks-Connect 还返回找不到多个 python 文件作业的模块的主要内容,如果未能解决你的问题,请参考以下文章

java + spring security oauth token 未返回,找不到 404 页面

如何使用 databricks-connect 在本地执行 Spark 代码?

databricks-connect 无法连接到 Databricks 集群运行时 8.4

使用 databricks-connect 调试运行另一个笔记本的笔记本

Databricks Connect:无法连接到 azure 上的远程集群,命令:“databricks-connect test”停止

“form_with 找不到 Post 模型”