我在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时,一切都很好,所以依赖项都在那里。有人知道是什么导致了这个问题,以及如何解决它吗?
谢谢
要使这种依赖分布方法与编译的扩展一起工作,我们需要做两件事:
使用以下脚本创建依赖项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
目录
--部署模式群集
在群集上运行主执行器,以获取依赖项
>
现在在代码中,使用以下命令添加这些zip/文件
sc.addPyFile(你的zip/file)
现在,使用如下别名在代码中导入zip/文件以开始引用它
将zip/文件作为别名导入
注意:导入时不需要使用文件扩展名,如末尾的.py
希望这有用。
首先,我假设您的依赖项列在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