当前位置: 首页 > 知识库问答 >
问题:

我似乎无法让Spark上的py文件正常工作

岳硕
2023-03-14

我在Spark上使用Python时遇到问题。我的应用程序有一些依赖项,如numpy、pandas、astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为集群上的节点除了HDFS之外没有任何公共挂载点或文件系统。因此,我一直坚持使用spark submit--py文件。我将站点包的内容打包在一个ZIP文件中,并使用--py files=dependencies.ZIP>选项提交作业(这是在Spark executor节点上安装Python依赖项的最简单方法吗?)。然而,集群上的节点似乎仍然看不到内部的模块,它们在导入numpy时抛出类似这样的ImportError

File "/path/anonymized/module.py", line 6, in <module>
    import numpy
File "/tmp/pip-build-4fjFLQ/numpy/numpy/__init__.py", line 180, in <module>   
File "/tmp/pip-build-4fjFLQ/numpy/numpy/add_newdocs.py", line 13, in <module>
File "/tmp/pip-build-4fjFLQ/numpy/numpy/lib/__init__.py", line 8, in <module>
    #
File "/tmp/pip-build-4fjFLQ/numpy/numpy/lib/type_check.py", line 11, in <module>
File "/tmp/pip-build-4fjFLQ/numpy/numpy/core/__init__.py", line 14, in <module>
ImportError: cannot import name multiarray

当我切换到virtualenv并使用本地pyspark shell时,一切都很好,所以依赖项都在那里。有人知道是什么导致了这个问题,以及如何解决它吗?

谢谢


共有3个答案

伯洋
2023-03-14

要使这种依赖分布方法与编译的扩展一起工作,我们需要做两件事:

  1. 在与目标集群相同的操作系统上运行pip安装(最好在集群的主节点上)。这可确保zip中包含兼容的二进制文件。

使用以下脚本创建依赖项zip将确保您与系统上已经安装的任何包隔离。这假定安装了viralenv,并且当前目录中存在requirements.txt,并在根级别输出带有所有依赖项的dependencies.zip

env_name=temp_env

# create the virtual env
virtualenv --python=$(which python3) --clear /tmp/${env_name}

# activate the virtual env
source /tmp/${env_name}/bin/activate

# download and install dependencies
pip install -r requirements.txt

# package the dependencies in dependencies.zip. the cd magic works around the fact that you can't specify a base dir to zip
(cd /tmp/${env_name}/lib/python*/site-packages/ && zip -r - *) > dependencies.zip

依赖关系现在可以部署、解压缩并包含在PYTHONPATH中

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --conf 'spark.yarn.dist.archives=dependencies.zip#deps' \
  --conf 'spark.yarn.appMasterEnv.PYTHONPATH=deps' \
  --conf 'spark.executorEnv.PYTHONPATH=deps' \
.
.
.

spark.yarn.dist.archives=dependencies.zip#deps
分发zip文件并将其解压缩到名为deps的目录中

spark.warn.appMasterEnv.PYTHONPATH=deps
spark.executorEnv.PYTHONPATH=deps
在PYTHONPATH中包含主进程和所有工作进程的deps目录

--部署模式群集
在群集上运行主执行器,以获取依赖项

晁绍辉
2023-03-14

>

  • 当您传递带有上述标志的zip/文件时,基本上您的资源将被转移到在HDFS上创建的临时目录中,只是在该应用程序的生命周期内。

现在在代码中,使用以下命令添加这些zip/文件

sc.addPyFile(你的zip/file)

  • 上面所做的是,它将文件加载到执行环境中,如JVM

现在,使用如下别名在代码中导入zip/文件以开始引用它

将zip/文件作为别名导入

注意:导入时不需要使用文件扩展名,如末尾的.py

希望这有用。

曾光誉
2023-03-14
匿名用户

首先,我假设您的依赖项列在requirements.txt中。要打包和压缩依赖项,请在命令行中运行以下操作:

pip install -t dependencies -r requirements.txt
cd dependencies
zip -r ../dependencies.zip .

上面的cd dependencies命令对于确保模块位于zip文件的顶层至关重要。多亏了Dan Corin的帖子提醒了我们。

接下来,通过以下方式提交作业:

spark-submit --py-files dependencies.zip spark_job.py

--py-file指令将zip文件发送给Spark工作人员,但没有将其添加到PYTHONPATH(我的困惑来源)。要将依赖项添加PYTHONPATH以修复重要错误,请将以下行添加到Spark作业,spark_job.py

sc.addPyFile("dependencies.zip")

Cloudera帖子中的一个警告:

任何使用商品硬件进行分布式计算的人都必须假设底层硬件可能是异构的。由于需要C编译,在客户端机器上构建的Python蛋将特定于客户端的CPU架构。为一个复杂的编译包分发一个鸡蛋,比如NumPy、SciPy或熊猫,这是一个脆弱的解决方案,很可能在大多数集群上失败,至少最终是这样。

虽然上面的解决方案不会生成鸡蛋,但同样的准则也适用。

 类似资料:
  • 问题内容: 我在Spark上使用Python时遇到问题。我的应用程序具有一些依赖项,例如numpy,pandas,astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为群集上的节点除HDFS外没有任何公共的挂载点或文件系统。因此,我坚持使用。我将站点程序包的内容打包到一个ZIP文件中,然后提交与option一样的作业(如在Spark executor节点上安装Python依

  • 我对nodeJS…和编程是新手。但我试图让这段代码工作,我无法理解为什么它似乎不起作用。更糟糕的是,我也不知道如何排除故障。如果我使用控制台。日志语句,我可以看到,一旦我启动网页,它就会连接,但网页从未从nodeJS服务器收到消息,服务器也从未从网页收到消息。我正在使用Chrome浏览器。 服务器.js: 我从命令提示符在树莓pi zero w上启动它: index.html引用interface

  • 问题内容: 我正在尝试通过检查golang TCPConn.Write返回的错误来检测发送失败,但它为nil。我也尝试使用TCPConn.SetWriteDeadline,但没有成功。 事情就是这样发生的: 服务器启动 客户端连接 服务器发送一条消息,客户端收到它 客户端 关闭 服务器再发送一条消息:没有错误 服务器发送第三条消息:仅现在出现错误 问题 :为什么只有第二条消息发送给不存在的客户端会

  • 所以我不知道如何让桌子在雪花中旋转。我试图在这里为帮助页面建模https://docs.snowflake.com/en/sql-reference/constructs/pivot.html。 枢轴输出 sql文本:

  • 我就是无法让它工作。想法是设计一种方法,将键值对添加到Map,尽管程序编译正确,但测试格式为“tracker.put”(“17/06/2019”,“Jeffrey Burns”)的代码;“显示错误消息 我尝试将方法参数更改为(String, List)。 我期望测试代码跟踪器。put(“2019年6月17日”,“Jeffrey Burns”);但改为获取“错误:第1行-找不到符号-方法put(ja

  • 问题内容: 我试图使用executemany将值插入数据库中,但对我来说不起作用。这是一个示例: 这给了我以下错误: 但是,当我更改列表时,它可以正常工作: 它按预期工作!我可以在数据库中看到数据。为什么第一个列表不起作用而第二个列表却不起作用? (PS:这只是一个示例,而不是实际的代码。为简单起见,我制作了一个小测试用例)。 问题答案: 根据我对执行力的了解,您的意思是, 或类似的东西。不要在s