pyspark提交代码到yarn模式,报错ImportError: No module

上一篇:PySpark任务在YARN集群上运行 关联python包numpy pandas scipy 等
 

问题:

在提交ALS.train代码到yarn模式的时候,会出现如下报错:

import numpy as np
ImportError: No module named numpy


说pandas的的dependency numpy包不存在,但事实上install pandas时,numpy必定是已经装过的,所以就到处找,应该是环境没有设置

解决方式:

1. 创建虚拟python环境

这个不多介绍了,不管是通过annaconda还是virtualenv,创建好你自己的python环境。如果你也碰到了离线的平台,建议查看上面的 坑2:自己用docker做一个和服务器一样的系统版本,在上面完成虚拟的环境的创建,再将其拷贝出来;


2. 打包虚拟环境并将其上传hdfs

创建好环境后,进入到环境所在的文件夹,例如你的环境是 ***/***/project_env, cd到project_env下,使用打包命令将当前目录下的文件打包

zip -r project_env.zip ./*

在当前文件夹下,将其上传至hdfs

hadoop fs -put ***/***/project_env/project_env.zip hdfs://***/***/***/env/

3. 使用spark-submit命令引用

client模式下

--conf spark.yarn.dist.archives=hdfs://***/***/***/env/project_env.zip#project_env\
--conf spark.pyspark.driver.python=./project_env/bin/python \
--conf spark.pyspark.python=./project_env/bin/python \

注意 archivs命令后的#是必须的,它指的是将这个zip包解压到的文件夹

cluster模式下,driver端可以略去

--conf spark.yarn.dist.archives=hdfs://***/***/***/env/project_env.zip#project_env\
--conf spark.pyspark.python=./project_env/bin/python \

一般其他的文章到这一步就结束了,但我的还是报错,说pandas的的dependency numpy包不存在,但事实上install pandas时,numpy必定是已经装过的,所以就到处找,应该是环境没有设置

4. python环境设置

除了上述设置后,还需要在代码中显示的指定python的环境,例如下面的测试代码

# test_env.py #
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from pyspark import SparkContext
os.environ['PYSPARK_PYTHON'] = './project_env/bin/python'
sc = SparkContext(appName="env_test").getOrCreate()
def fun(x):
    import pandas
    return pandas.__version__
a = sc.parallelize([1,4,5,5,6],3)
print(a.map(lambda x:fun(x)).collect())

划重点:'./project_env/bin/python' 这个是zip文件解压后的路径一定要正确,如果当时打压缩包的时候对project_env目录,那么路径会是'./project_env/project_env/bin/python' ,第一个是project_env.zip#project_env的路径名,第二个project_env是解压后的路径名。

如果能输出你安装的pandas是版本,就说明可以正常使用了

补充

也可以在submit的命令中设置这些路径,例如

spark.yarn.dist.archives=hdfs://***/***/***/env/project_env.zip#project_env \
--conf spark.pyspark.python=./project_env/bin/python \
--conf spark.executorEnv.PYSPARK_PYTHON=./project_env/bin/python \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./project_env/bin/python \
--conf spark.executorEnv.LD_LIBRARY_PATH=/appcom/AnacondaInstall/anaconda3/lib \

最后一个conf是存在在导入一些包的时候报libffi.so.6不存在,这里使用老的的Python环境中的这个依赖。


参考:https://blog.csdn.net/wang_306/article/details/97756295

 

你可能感兴趣的:(Spark,机器学习/数据挖掘)