当前位置: 首页 > news >正文

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
conda create --name sparkenv --copy python=3.6.7(版本根据实际情况更改)

⽣成的⽬录在⽂件夹

/opt/anaconda2/envs/sparkenv

使⽤pip安装所需依赖

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

2、任务配置Spark参数

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

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

  1. 配置[Spark Conf 配置]
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项目。

相关文章:

  • 如何在idea中使用maven搭建tomcat环境
  • 【网络协议】聊聊HTTPS协议
  • 一 Java初探
  • NoSQL数据库使用场景以及架构介绍
  • stable diffusion安装踩坑之clip安装、git报错
  • C4D 2024终于发布,速度翻倍!模拟模块大更新!
  • 【数据结构与算法】JavaScript实现哈希表
  • JavaEE-博客系统2(功能设计)
  • CM3D2 汉化杂记
  • 048基于web+springboot的校园资料分享平台
  • Android Studio(对话框AlertDialog)
  • Ansible概述以及模块
  • 一个可以自动把微信聊天收到的二维码图片实时提取出来并分类的软件
  • shell_73.Linux使用新 shell 启动脚本
  • Mybatis的工作原理
  • SegmentFault for Android 3.0 发布
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【Linux系统编程】快速查找errno错误码信息
  • AHK 中 = 和 == 等比较运算符的用法
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Java教程_软件开发基础
  • LintCode 31. partitionArray 数组划分
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • storm drpc实例
  • vue-cli3搭建项目
  • WePY 在小程序性能调优上做出的探究
  • 给第三方使用接口的 URL 签名实现
  • 基于webpack 的 vue 多页架构
  • 如何优雅地使用 Sublime Text
  • 实现菜单下拉伸展折叠效果demo
  • 使用Swoole加速Laravel(正式环境中)
  • 听说你叫Java(二)–Servlet请求
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • (java)关于Thread的挂起和恢复
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)WCF的Binding模型
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计高校学生选课系统
  • (过滤器)Filter和(监听器)listener
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)用.Net的File控件上传文件的解决方案
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *** 2003
  • .net core 6 集成和使用 mongodb
  • .Net Memory Profiler的使用举例
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net6 Api Swagger配置
  • .Net各种迷惑命名解释
  • .net生成的类,跨工程调用显示注释
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .net下的富文本编辑器FCKeditor的配置方法