我在Spark上使用Python时遇到了问题.我的应用程序有一些依赖项,例如numpy,pandas,astropy等.我不能使用virtualenv来创建一个包含所有依赖项的环境,因为除了HDFS之外,集群上的节点没有任何公共mountpoint或文件系统.因此我坚持使用spark-submit --py-files.我将site-packages的内容打包到一个ZIP文件中并像使用--py-files=dependencies.zip选项一样提交作业(最简单的方法是在Spark执行器节点上安装Python依赖项?).但是,群集上的节点似乎仍然没有看到内部的模块,并且ImportError在导入numpy时它们会抛出这样的内容.
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
Run Code Online (Sandbox Code Playgroud)
当我切换到virtualenv并使用本地pyspark shell时,一切正常,所以依赖都在那里.有谁知道,什么可能导致这个问题,以及如何解决它?
谢谢!
如何将C编译模块(例如,python-Levenshtein)发送到Spark集群中的每个节点?
我知道我可以使用独立的Python脚本在Spark中发布Python文件(下面的示例代码):
from pyspark import SparkContext
sc = SparkContext("local", "App Name", pyFiles=['MyFile.py', 'MyOtherFile.py'])
Run Code Online (Sandbox Code Playgroud)
但是在没有".py"的情况下,我该如何运送模块?
我想在pyspark中使用matplotlib.bblpath或shapely.geometry库.
当我尝试导入其中任何一个时,我得到以下错误:
>>> from shapely.geometry import polygon
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named shapely.geometry
Run Code Online (Sandbox Code Playgroud)
我知道模块不存在,但是如何将这些包带到我的pyspark库?
我正在使用AWS Glue和PySpark ETL脚本,并且想要使用辅助库,例如作为google_cloud_bigquery我的PySpark脚本的一部分。
该文件指出,这应该是可能的。之前的Stack Overflow讨论,尤其是其中一个答案中的一条评论似乎提供了进一步的证明。但是,我不清楚该怎么做。
因此,目标是将pip installed软件包转换为一个或多个zip文件,以便能够仅将软件包托管在S3上并指向它们,如下所示:
s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip
如何认为应该做的是没有明确规定的任何地方我已经看了。
即我如何pip install打包,然后将其转换为可上传到S3 的zip文件,以便PySpark可以将其与这样的S3 URL一起使用?
通过使用命令,pip download我已经能够提取这些库,但是默认情况下它们不是.zip文件,而是.whl文件或.tar.gz
..so不知道该怎么做才能将它们转换为AWS Glue可以消化的zip文件。也许有了.tar.gz,我可以先将它们备份,tar -xf然后再zip备份,但是whl文件呢?