说明:
spark2.1.0(含)以下的版本不支持Python3.6
安装注意版本,请先检查版本
步骤
这个不多介绍了,不管是通过annaconda还是virtualenv,创建好你自己的python环境。如果你也碰到了离线的平台,建议自己用docker做一个和服务器一样的系统版本,在上面完成虚拟的环境的创建,再将其拷贝出来;
创建好环境后,进入到环境所在的文件夹,例如你的环境是 ***/***/py35, cd到py35下,使用打包命令将当前目录下的文件打包
zip -r py35.zip ./*
在当前文件夹下,将其上传至hdfs
hadoop fs -put ***/***/py35.zip hdfs://***/***/***/env/
3. 使用spark-submit命令引用
client模式下
--conf spark.yarn.dist.archives=hdfs://***/***/***/env/py35.zip#py35\
--conf spark.pyspark.driver.python=./py35/bin/python \
--conf spark.pyspark.python=./py35/bin/python \
注意 archivs命令后的#是必须的,它指的是将这个zip包解压到的文件夹
cluster模式下,driver端可以略去
--conf spark.yarn.dist.archives=hdfs://***/***/***/env/py35.zip#py35\
--conf spark.pyspark.python=./py35/bin/python \
一般其他的文章到这一步就结束了,但我的还是报错,说pandas的的dependency numpy包不存在,但事实上install pandas时,numpy必定是已经装过的,所以就到处找,应该是环境没有设置
除了上述设置后,在代码中显示的指定python的环境,例如
# test.py #
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from pyspark import SparkContext
os.environ['PYSPARK_PYTHON'] = './py35/bin/python'
sc = SparkContext(appName="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())
最后
也可以在submit的命令中设置这些路径
spark.yarn.dist.archives=hdfs://***/***/***/env/py35.zip#py35\
--conf spark.pyspark.python=./py35/bin/python \
--conf spark.executorEnv.PYSPARK_PYTHON=./py35/bin/python \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./py35/bin/python \
--conf spark.executorEnv.LD_LIBRARY_PATH=/AnacondaInstall/anaconda3/lib \
如果报libffi.so.6不存在,则加入最后一个conf。
参考:
https://imshuai.com/python-pip-install-package-offline-tensorflow
来源:oschina
链接:https://my.oschina.net/u/4258525/blog/4496700