anaconda创建python环境
在这篇博客中,已经很清楚地描述了如何通过anaconda来创建你需要的python环境:即合适的python版本和包含你需要的依赖包。
假设我们的python环境名称为py_env,那么在anaconda的安装目录下,会有这么一个目录:envs/py_env
在Windows下,直接将使用压缩软件,将其压缩为zip文件(但windows的拿到linux取用就不行了);
在Linux下,zip -r py_env.zip py_env
。(必须在py_env文件夹所在的目录下执行,原因如下)
在这里要非常注意:我们是对py_env文件夹进行打包,不能再套上一层文件夹,不然spark会解析出错的
也就是我们只能对py_env进行打包,不能是envs/py_env或者anaconda/envs/py_env。
再换句话说,我们将py_env.zip解压之后,就是py_env文件夹了。
(看到我在这里再三强调,这都是坑呀)
将打包好的py_env.zip上传至hdfs的对应账号目录下,如为root的话,hdfs的目录为/user/root
hdfs dfs -put xxx/py_env.zip /user/xxx/
说明:这一步不是必须的,环境包也可以在本地的。
但是放在本地的话,每次spark-submit运行程序的时候,就会将其上传至hdfs,当作临时文件,执行完毕就删除。
前语:记清楚我们的python环境名称为py_env;
打包的名称为py_env.zip;
py_env/bin/python是python可执行程序。
最后,到了激动人心的提交时刻了:
spark-submit --master yarn --deploy-mode client --archives hdfs:///user/root/py_env.zip#PY2 --conf spark.pyspark.driver.python=/xxx/python2.7 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./PY2/py_env/bin/python /xxx/test.py
–archives hdfs:///user/root/py_env.zip#PY2:将hdfs:///user/root/py_env.zip加入到当前执行环境的根目录下,有点类似java的classpath,然后定向到PY2,即我们访问PY2时,就相当于访问hdfs:///user/root/py_env.zip;
spark.pyspark.driver.python:client模式下,driver端需要使用本地的python环境
spark.yarn.appMasterEnv.PYSPARK_PYTHON:指executor端(任务分配到的节点机器)的python环境指定为我们打包的python环境。
/xxx/test.py:最后的是你的spark程序脚本
spark-submit --master yarn --deploy-mode cluster --archives hdfs:///user/root/py_env.zip#PY2 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./PY2/py_env/bin/python /xxx/test.py
cluster模式与client不同的就是,driver端是集群根据资源情况分配到某一个节点上;
spark.yarn.appMasterEnv.PYSPARK_PYTHON:diver和executor端都统一使用我们打包的python环境。
==========================================================
如果不行的话,driver端也特地指定一下:
spark-submit --master yarn --deploy-mode cluster --archives hdfs:///user/root/py_env.zip#PY2 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./PY2/py_env/bin/python --conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=./PY2/py_env/bin/python /xxx/test.py
如果,你还有自己的一些依赖包或者程序(py文件),那么可以直接在–py-files参数带上。
比如,一个spark包,一个conifg.py,
spark-submit --master yarn --py-files spark.zip,config.py test.py
在代码中,可以直接import
import config
from spark import preprocess
注意:这里的spark必须是包,即需要有__init__.py
而且需要打包为zip,zip -r spark.zip spark
在这里,我们在使用pyspark的时候,就可以自由地添加第三方依赖包了,虽然没有java有maven、scala有sbt那样方便的管理和打包依赖包,但是有个好处就是,可以使用不用于现有的python版本,有利于保持稳定的同时,实现更新迭代。
(网上很多教程都是一个样,全是cluster模式,然后也没说清楚cluster和client模式的区别,无语子!!!)