PySpark 应用程序在 Yarn 集群模式和独立模式下提交错误

Posted

技术标签:

【中文标题】PySpark 应用程序在 Yarn 集群模式和独立模式下提交错误【英文标题】:PySpark application submitting error on Yarn cluster mode and standalone mode 【发布时间】:2020-06-25 09:41:03 【问题描述】:

环境:

Python : 3.6.8  
OS: CentOS 7  
Spark: 2.4.5  
Hadoop:2.7.7  
Hardware: 3 computers (8 VCores available for each computer on hadoop cluster)

我构建了一个简单的 python 应用程序。我的代码是:

import numpy as np
from pyspark.sql import SparkSession
spark = SparkSession.builder \
        .appName('test_use_numpy') \
        .getOrCreate()
sc = spark.sparkContext
rdd = sc.parallelize(np.arange(100))
rdd.saveAsTextFile('/result/numpy_test')
spark.stop()

我将虚拟环境打包为 venv.zip。然后我把它放在 hdfs 上。我使用以下命令提交了申请:

/allBigData/spark/bin/spark-submit \
--master yarn --deploy-mode cluster --num-executors 10 \
--conf spark.yarn.dist.archives=hdfs:///spark/python/venv.zip#pyenv \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pyenv/venv/bin/python \
/home/spark/workspace_python/test.py

我得到了错误:pyenv/venv/bin/python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

20/06/23 15:09:08 ERROR yarn.ApplicationMaster: User application exited with status 127
20/06/23 15:09:08 INFO yarn.ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: User application exited with status 127)
pyenv/venv/bin/python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

我在venv.zip中没有找到libpython3.6m.so.1.0。但是我在centos上找到了libpython3.6m.so.1.0。我试着把它放在 venv/bin/, venv/lib/ 目录下,但它们都不起作用。我仍然遇到同样的错误。 然后我尝试使用以下命令提交申请:

/allBigData/spark/bin/spark-submit \
--master spark://master:7077 --num-executors 10 \
--conf spark.yarn.dist.archives=/home/spark/workspace_python/venv.zip#pyenv \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pyenv/venv/bin/python \
/home/spark/workspace_python/test.py

我得到一个不同的错误:ModuleNotFoundError: No module named 'numpy'

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

您需要使用 spark-submit --archive 标签传递 python.zip。 当客户端使用 spark-submit 的 --archives 命令行选项指定的分配额外资源时使用它。

另外加PYSPARK_DRIVER_PYTHON

/allBigData/spark/bin/spark-submit \
--master yarn --deploy-mode cluster --num-executors 10 \
--archives hdfs:///spark/python/venv.zip#pyenv \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pyenv/venv/bin/python \
--conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=pyenv/venv/bin/python \
/home/spark/workspace_python/test.py

【讨论】:

当集群中的另外两台机器被分配运行作业时,我仍然得到错误:加载共享库时出错:libpython3.6m.so.1.0。但是当我编写代码的机器被分配来运行这项工作时,它运行良好。 我不明白这部分。机器是指容器吗? 没有。我是说电脑。只有我编写代码的计算机中的容器才能无误地完成任务。在该计算机上,应用程序可以通过 IDE 成功运行。【参考方案2】:

关于集群的其他描述:集群中有三台工作人员/节点/计算机。我在工作人员 A 上构建应用程序/代码。工作人员 A 也可以作为主机工作。其他人在worker A上安装了python。我在worker B和c上手动安装了python。

我找到了一个笨拙的解决方案来解决这个问题。 我在venv.zip和worker B和C的python的安装目录中找不到libpython3.6m.so.1.0。但是我可以在worker A上找到它。在我使用手动在B和C上安装python之前命令:./configure --with-ssl --prefix=/usr/local/python3 我使用以下命令在两台计算机上重新安装了 python:./configure --prefix=/usr/local/python3 --enable-shared CFLAGS=-fPIC 安装完成后,我将libpython3.6m.so.1.0复制到/usr/lib64/目录下。这样就可以在两个worker上找到libpython3.6m.so.1.0。然后我提交了python应用程序,得到了一个不同的错误:pyenv/venv/bin/python: symbol lookup error: pyenv/venv/bin/python: undefined symbol: _Py_LegacyLocaleDetected 我使用ldd命令查找pyenv/venv/bin/python的依赖,怀疑是worker A和另外两个worker的依赖安装目录不同导致的。所以我按照工人B和C的相同步骤在工人A上重新安装了python。然后我提交了应用程序并使用命令成功完成:

/allBigData/spark/bin/spark-submit \
--master yarn --deploy-mode cluster --num-executors 10 \
--conf spark.yarn.dist.archives=hdfs:///spark/python/venv.zip#pyenv \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pyenv/venv/bin/python \
--conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=pyenv/venv/bin/python \
/home/spark/workspace_python/test.py

但是,我仍然无法在独立模式下成功提交申请。使用命令时出错:

/allBigData/spark/bin/spark-submit \
--master spark://master:7077 --num-executors 10 \
--archives hdfs:///spark/python/venv.zip#pyenv \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pyenv/venv/bin/python \
--conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=pyenv/venv/bin/python \
/home/spark/workspace_python/test.py
ModuleNotFoundError: No module named 'numpy'

我想我设置了关于 python 路径的错误属性参数(spark.yarn.appMasterEnv.PYSPARK_PYTHON / spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON)。但我不知道如何修改这些。任何建议将不胜感激。

【讨论】:

以上是关于PySpark 应用程序在 Yarn 集群模式和独立模式下提交错误的主要内容,如果未能解决你的问题,请参考以下文章

PySpark任务在YARN集群上运行python 算法

PySpark任务在YARN集群上运行python 算法

在 YARN 集群上部署 pyspark 作业时出现 FileNotFoundException

YARN 集群上的 PySpark 分布式处理

Pyspark:如何在 Yarn 集群上运行作业时对多个文件使用 --files 标签

Spark运行模式_基于YARN的Resource Manager的Custer模式(集群)