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

时间:2020-06-25 09:41:03

标签: python apache-spark hadoop pyspark

环境:

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'

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您需要使用spark-submit --archive标签传递python.zip。
当客户端使用--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

答案 1 :(得分:0)

有关群集的其他说明:
集群中有三台worker /节点/计算机。我在工作程序A上构造应用程序/代码。Woker A也可以用作主计算机。其他人已经在工人A上安装了Python。我在工人B和C上手动安装了python。

我找到了解决问题的笨拙方法。
我在venv.zip和工作程序B和C的python的安装目录中找不到libpython3.6m.so.1.0。但是我可以在工作程序A上找到它。命令:
./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。然后我提交了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)。但是我不知道如何修改它们。任何建议将不胜感激。