1 动机
不同用户的应用程序使用的python版本及需要的python依赖可能存在不同,若每次缺少依赖都请op去update所有节点,对于大集群的维护来说相对比较困难,而且走变更流程等还影响spark 用户的工作效率。
为解决上述问题,我们探索一种用户可自定义Python环境的方法,用户可依据自己的需要,定制自己的python 并做简单指定即可。
2 方法
2.1 构建Python
//下载Python源码
wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz
//解压
tar -zxvf Python-2.7.15.tgz
//编译
./Python-2.7.15/configure --prefix=/home/barrenlake/tmp/python-2.7.15 --with-zlib-dir=/usr/local/lib # 指定打包路径
make && make install
2.2 安装依赖
使用Python的包管理工具pip安装依赖,若无pip请自行安装。
pip install -t /home/barrenlake/tmp/python-2.7.15/lib/python2.7/site-packages <依赖包名>
// -t 指定安装路径
2.3 打包
//进入python根目录, 注意打包路径决定下面的spark配制方式。ll
cd /home/barrenlake/tmp/python-2.7.15
tar -zcf python-2.7.15.tgz *
3. Spark 配制
因客户机存在公用的可能,且每个应用程序的需求不同,为了降低不同用户之间的影响,我们推荐在提交命令中配制的作法。
3.1 上传python-2.7.15至Spark Executor工作目录
//submit提交脚本中指定(“#” 指的是符号连接,与submit 命令中指定的“spark.pyspark.python”路径方式有关)
--conf spark.yarn.dist.archives=file:/home/barrenlake/tmp/python-2.7.15/python-2.7.15.tgz#python-2.7.15
或
直接上传hdfs目录
3.2 Python目录指定
备注:因3.1中指定的变量,会将python-2.7.15.tgz上传至Spark Executor工作目录,随后Executor在准备启动环境时会将其加载到工作目录中,因此python路径可从当前路径“.”指定。
- 提交脚本中指定
//driver端配制
--conf spark.pyspark.driver.python = /home/barrenlake/tmp/python-2.7.15/bin/python
//executor端配制
--conf spark.pyspark.python = ./python-2.7.15/bin/python
4 应用提交示例
- client模式
Driver在用户提交宿主机运行,提交机和线上集群环境可能存在差异,因此,区分配制两端的python环境(若相同只须指定“spark.pyspark.python”即可)。
spark-submit <spark-shell>
--conf spark.yarn.dist.archives=/home/barrenlake/tmp/python-2.7.15/python-2.7.15.tgz#python-2.7.15 \
--conf spark.pyspark.driver.python = /home/barrenlake/tmp/python-2.7.15/bin/python \
--conf spark.pyspark.python = ./python-2.7.15/bin/python \
pi.py \
1000
- cluster 模式
Driver运行在ApplicationMaster, 而ApplicationMaster运行在Executor(container)中,因此,可视为Driver和Executor环境统一,只需要配制spark.pyspark.python即可。
spark-submit <spark-shell>
--conf spark.yarn.dist.archives=/home/barrenlake/tmp/python-2.7.15/python-2.7.15.tgz#python-2.7.15 \
--conf spark.pyspark.python = ./python-2.7.15/bin/python \
pi.py \
1000
注意:“#” 指的是符号连接,与submit 命令中指定的“spark.pyspark.python”路径方式有关。
5 缺点分析
上述方案虽可实现用户自定义python环境,但执行过程中每个Executor从HDFS下载一次python环境,增加RPC等开销,在开启动态资源伸缩功能时,下载次数会更多……