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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章