pyspark打包依赖包&使用python虚拟环境

一、anaconda创建python环境

anaconda创建python环境

在这篇博客中,已经很清楚地描述了如何通过anaconda来创建你需要的python环境:即合适的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文件夹了。

(看到我在这里再三强调,这都是坑呀)

三、上传hdfs

将打包好的py_env.zip上传至hdfs的对应账号目录下,如为root的话,hdfs的目录为/user/root

hdfs dfs -put xxx/py_env.zip /user/xxx/

说明:这一步不是必须的,环境包也可以在本地的。

但是放在本地的话,每次spark-submit运行程序的时候,就会将其上传至hdfs,当作临时文件,执行完毕就删除。

四、spark提交

前语:记清楚我们的python环境名称为py_env;

打包的名称为py_env.zip;

py_env/bin/python是python可执行程序。

最后,到了激动人心的提交时刻了:

client模式

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程序脚本

cluster模式

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打包依赖包&使用python虚拟环境_第1张图片

六、结语

在这里,我们在使用pyspark的时候,就可以自由地添加第三方依赖包了,虽然没有java有maven、scala有sbt那样方便的管理和打包依赖包,但是有个好处就是,可以使用不用于现有的python版本,有利于保持稳定的同时,实现更新迭代。
(网上很多教程都是一个样,全是cluster模式,然后也没说清楚cluster和client模式的区别,无语子!!!)

你可能感兴趣的:(Spark,python,spark,python,pyspark,anaconda)