环境:
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--archive
tag.
传递 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(。但我不知道如何修改这些。任何建议将不胜感激。