环境:
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'
有人可以帮我解决这个问题吗?
答案 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)。但是我不知道如何修改它们。任何建议将不胜感激。