1.背景
目前大数据使用的是Hadoop集群,该集群可根据计算需求变化灵活扩展或收缩集群,就会存在一个问题:当spark任务提交之后,Hadoop集群会根据计算的需求进行扩展,新扩展的机器上python环境各不相同,并且每次扩展的机器ip不相同(不是同一台机器),对某些第三方包,例如:pandas 还会依赖numpy,并且对版本还有一定要求,必须大于15.4;此时python依赖的冲突就会导致spark任务执行失败。
2.解决方案
鉴于以上问题,通过搭建独立的Python运行环境可以解决以上问题,同时还可以使得单个项目的运行环境与其他项目互不影响。
3.搭建方法
3.1.安装virtualenv
3.1.1.检查服务器是否安装virtualenv
virtualenv --version
3.1.2.没有的话需要安装
pip install virtualenv
3.2.创建python虚拟环境
cd /home/hadoop/code
mkdir py_spark_env #创建目录py_spark_env
virtualenv -p /usr/bin/python3.6 pyspark_env #选择使用python3.6解释器创建虚拟环境目录
source pyspark_env/bin/activate #激活虚拟环境变量
deactivate #退出当前虚拟环境
删除虚拟环境,只需要删除它的文件夹:rm -rf pyspark_env
3.3.安装python依赖
3.3.1安装python依赖库
安装之前需要选择虚拟环境,否则就会安装在系统的环境下
source pyspark_env/bin/activate #选择虚拟环境
pip install pandas #安装pandas
pip install pyspark #安装pyspark
以上的依赖库会安装在:
/home/hadoop/code/py_spark_env/pyspark_env/lib64/python3.6/dist-packages下
需要将其拷贝至
/home/hadoop/code/py_spark_env/pyspark_env/lib64/python3.6/site-packages下
3.3.2.验证python虚拟环境
选择虚拟环境:source pyspark_env/bin/activate
在服务器终端执行python: python #可以看到当前的python环境是3.6.8
3.4.spark基于python虚拟环境提交任务
3.4.1.打包python虚拟环境
cd /home/hadoop/code
zip -r py_spark_env.zip py_spark_env
3.4.2.上传至hdfs
hdfs dfs -put py_spark_env.zip /tmp/bigdata/config
如果还需要增加其它第三方依赖,则需要通过执行步骤3.3安装依赖,再打包成zip,上传至hdfs上。
3.4.3.spark依赖虚拟环境
请参考以下示例:
spark-submit \
--deploy-mode cluster \
--master yarn \
--driver-memory 2g \
--num-executors 6 \
--executor-memory 4g \
--executor-cores 2 \
--queue default \
--name test \
--archives hdfs:///tmp/bigdata/config/py_spark_env.zip#py_spark_env \
--conf spark.pyspark.driver.python=./py_spark_env/pyspark_env/bin/python3 \
--conf spark.pyspark.python=./py_spark_env/pyspark_env/bin/python3 \
/home/hadoop/tmp/nibo/test.py
注:
--archives hdfs:///tmp/bigdata/config/py_spark_env.zip#py_spark_env----会将py_spark_env.zip解压,解压的目录是 py_spark_env后面的 py_spark_env 不能省略,会被解压到每个Executor的工作目录中,仅限于Spark on Yarn模式
--conf spark.pyspark.driver.python=./py_spark_env/pyspark_env/bin/python3 ----指定python执行器
--conf spark.pyspark.python=./py_spark_env/pyspark_env/bin/python3 ----指定python执行器