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依赖可用性:

spark怎么配置虚拟机 虚拟机启动spark_python

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执行器