1.背景
目前大数据使用的是Amazon EMR集群,该集群可根据计算需求变化灵活扩展或收缩集群,就会存在一个问题:当spark任务提交之后,EMR集群会根据计算的需求进行扩展,新扩展的机器上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_venv #选择使用python3.6解释器创建虚拟环境目录
source pyspark_venv/bin/activate #激活虚拟环境变量
deactivate #退出当前虚拟环境
删除虚拟环境,只需要删除它的文件夹:rm -rf pyspark_venv
3.3.安装python依赖
3.3.1安装python依赖库
安装之前需要选择虚拟环境,否则就会安装在系统的环境下
source pyspark_venv/bin/activate #选择虚拟环境
pip install pandas #安装pandas
pip install pyspark #安装pyspark
以上的依赖库会安装在:
/home/hadoop/code/py_spark_env/pyspark_venv/lib64/python3.6/dist-packages下
需要将其拷贝至
/home/hadoop/code/py_spark_env/pyspark_venv/lib64/python3.6/site-packages下
3.3.2.验证python虚拟环境
选择虚拟环境:source pyspark_venv/bin/activate
在服务器终端执行python: python #可以看到当前的python环境是3.6.8
以下截图是在本地测试pandas和numpy依赖可用性:
3.4.spark基于python虚拟环境提交任务
3.4.1.打包python虚拟环境
cd /home/hadoop/code/py_spark_env
zip -r py_spark_venv.zip py_spark_venv
3.4.2.上传至s3或者hdfs
hadoop fs -put py_spark_venv.zip s3://tmp/bigdata/config
hadoop fs -put py_spark_venv.zip /tmp/pyspark
如果还需要增加其它第三方依赖,则需要通过执行步骤3.3安装依赖,再打包成zip,上传至s3或者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 s3://tmp/bigdata/config/pyspark_venv.zip#pyspark_venv
--conf spark.pyspark.driver.python=./pyspark_venv/pyspark_venv/bin/python3
--conf spark.pyspark.python=./pyspark_venv/pyspark_venv/bin/python3
/home/hadoop/tmp/nibo/test.py
注:
--archives s3://tmp/bigdata/config/pyspark_venv.zip#pyspark_venv ----会将pyspark_venv.zip解压,解压的目录是"pyspark_venv", #后面的pyspark_venv不能省略,会被解压到每个Executor的工作目录中,仅限于Spark on Yarn模式
--conf spark.pyspark.driver.python=./pyspark_venv/pyspark_venv/bin/python3 ----指定python执行器
--conf spark.pyspark.python=./pyspark_venv/pyspark_venv/bin/python3 ----指定python执行器