我似乎无法在Spark上使用--py文件

发布于 2021-01-29 19:35:50

我在Spark上使用Python时遇到问题。我的应用程序具有一些依赖项,例如numpy,pandas,astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为群集上的节点除HDFS外没有任何公共的挂载点或文件系统。因此,我坚持使用spark- submit --py-files。我将站点程序包的内容打包到一个ZIP文件中,然后提交与--py- files=dependencies.zipoption一样的作业(如在Spark
executor节点上安装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

当我切换到virtualenv并使用本地pysparkshell时,一切正常,因此依赖项就在那里。有谁知道,什么可能导致此问题以及如何解决?

谢谢!

关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为了使这种依赖分发方法能够与编译扩展一起使用,我们需要做两件事:

    1. 在与目标集群相同的操作系统上运行pip install(最好在集群的主节点上)。这样可确保兼容的二进制文件包含在您的zip中。
    2. 将归档文件解压缩到目标节点上。这是必需的,因为Python不会从zip文件导入已编译的扩展名。(https://docs.python.org/3.8/library/zipimport.html

    使用以下脚本创建依赖项zip将确保您与系统上已安装的任何软件包隔离。假设已安装virtualenvrequirements.txt并存在于当前目录中,并dependencies.zip在根级别输出包含所有依赖项的a

    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.yarn.appMasterEnv.PYTHONPATH = deps
    spark.executorEnv.PYTHONPATH = deps
    包括depsPYTHONPATH中用于主服务器和所有工作程序的目录

    --deploy-mode集群
    集群上 运行主执行器,因此可以选择依赖项



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看