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



环境:

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'

谁能帮我解决这个问题?

你需要使用spark-submit--archivetag.
传递 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

有关群集的其他说明:
群集中有三个工作器/节点/计算机。我在工人 A 上构建应用程序/代码。Python 已被其他人安装在工作线程 A 上。我在工作线程 B 和 C 上手动安装了 python。

我找到了一个笨拙的解决方案来解决这个问题.
我在venv中找不到libpython3.6m.so.1.0.zip以及worker B和C的python安装目录。但我可以在工人 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/。这样libpython3.6m.so.1.0就可以在两个worker上找到。然后我提交了 python 应用程序并得到了一个不同的错误:
pyenv/venv/bin/python: symbol lookup error: pyenv/venv/bin/python: undefined symbol: _Py_LegacyLocaleDetected
我使用ldd命令查找 pyenv/venv/bin/python 的依赖项,怀疑工作线程 A 和其他两个工作线程的不同依赖项安装目录可能是原因。所以我按照工作线程 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(。但我不知道如何修改这些。任何建议将不胜感激。

最新更新