PySpark 优雅的解决依赖包管理

背景

平台所有的Spark任务都是采用Spark on yarn cluster的模式进行任务提交的,driver和executor随机分配在集群的各个节点,pySpark 由于python语言的性质,所以pySpark项目的依赖注定不能像java/scala项目那样把依赖打进jar包中轻松解决问题。所以本文主要目标就是解决pySpark在分布式的情况下,如何优雅的解决项目中的依赖问题,目前总结出如下三种办法供大家使用。

1、Nodemanager节点直接安装依赖

使用pip install 或者conda install 在每台 nodemanager上安装所需依赖。

这个方法是最简单也是最优先能解决pySpark依赖的方法,但是缺点也十分明显。

优点 : 操作简单,易上手,能快速解决依赖问题
缺点 :1、每台nodemanager都需要安装依赖,并且未来新加入nodemanager的机器也需要安装依赖。如果未来新节点忘记安装就会导致失败。

2、直接在服务器上安装未经测试过得版本极有可能导致已经安装的python依赖与新依赖包冲突,导致大数据任务执行失败。对环境是一种污染和侵入。
适用范围:集群规模不大,用的人少,影响范围可控,想快速解决问题

2、Python zip项⽬

  1. pip freeze >requirements.txt
    将本地的pip依赖写⼊到requirements.txt⽂件中,根据⾃⼰情况进⾏增删改。
  2. pip install -r requirements.txt --target ${PROJECT_NAME}
    将依赖打⼊到项⽬当中,main⽅法和依赖要平级
  3. python -m zipapp ${PROJECT_NAME} -m "main:main"
    打包出⼀个.pyz⽂件
  4. mv ${PROJECT_NAME}.pyz ${PROJECT_NAME}.zip
    spark不仅支持提交单个.py文件执行,还支持提交整个zip包来执行,其中zip包中就包含了你所需要的简单依赖。

优点 :引入的依赖简洁明了,并且调试起来也比较方便,毕竟打包时间快,方便提交任务,也不需要额外的任务。
缺点 :不能控制python版本,用的python版本都是nodemanager上的python版本。
适用范围:引入的依赖不多,项目极小的情况下,并且不考虑依赖的复用。

3、Spark使⽤独⽴的Python虚拟环境提交任务

1、创建python的虚拟环境

  1. 搭建annaconda或找⼀台有annaconda环境的机器
  2. 创建虚拟环境,名字为sparkenv,包含模块pandas
powershell 复制代码
conda create --name sparkenv --copy python=3.6.7(版本根据实际情况更改)

⽣成的⽬录在⽂件夹

powershell 复制代码
/opt/anaconda2/envs/sparkenv

使⽤pip安装所需依赖

powershell 复制代码
/opt/anaconda2/envs/sparkenv/bin/pip install ****=**
  1. 压缩成zip⽂件
powershell 复制代码
1 cd /opt/anaconda2/envs/sparkenv
2 zip -r -q sparkenv.zip *
  1. 将sparkenv.zip⽂件上传⾄hdfs(一般都是放在hdfs的),如
powershell 复制代码
hadoop fs -put /tmp/aaa/sparkenv.zip

2、任务配置Spark参数

  1. 配置[⾃定义配置]
powershell 复制代码
 --archives hdfs:///tmp/aaa/sparkenv.zip#test-sparkenv

这个配置加在spark -submit命令后就行。

  1. 配置[Spark Conf 配置]
powershell 复制代码
1 spark.yarn.appMasterEnv.PYSPARK_PYTHON=test-sparkenv/bin/python3.6
2 spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=test-sparkenv/bin/python3.6
3 spark.executorEnv.PYSPARK_PYTHON=test-sparkenv/bin/python3.6
4 spark.executorEnv.PYSPARK_DRIVER_PYTHON=test-sparkenv/bin/python3.6

上面这四个分别用--conf引入

比如 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=test-sparkenv/bin/python3.6

优点 :独立的python环境,想用什么版本的自己决定。基于业务的独立依赖包闭环,低依赖冲突风险。可实现依赖复用,多部门共用虚拟环境。
缺点 :包很大,不论是上传包还是调试都非常麻烦。
适用环境:需要使⽤不⽤于服务器的python版本;并且引⼊的依赖错综复杂的场景,适合中大型的pySpark项目。

相关推荐
weixin_307779138 小时前
PySpark实现GROUP BY WITH CUBE和WITH ROLLUP的分类汇总功能
大数据·开发语言·python·spark
快手技术1 天前
Blaze RangePartitioning 算子Native实现全解析
spark·naive
知初~2 天前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
努力的小T2 天前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
Java资深爱好者2 天前
在Spark中,如何使用DataFrame进行高效的数据处理
大数据·分布式·spark
阿里云大数据AI技术2 天前
美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台
大数据·阿里云·spark·serverless·emr
python资深爱好者3 天前
什么容错性以及Spark Streaming如何保证容错性
大数据·分布式·spark
猪猪果泡酒3 天前
spark
spark
weixin_307779133 天前
PySpark实现MERGE INTO的数据合并功能
大数据·python·spark
lucky_syq4 天前
Spark算子:大数据处理的魔法棒
大数据·分布式·spark