上一篇: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