• 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(版本根据实际情况更改)
    
    • 1

    ⽣成的⽬录在⽂件夹

    /opt/anaconda2/envs/sparkenv
    
    • 1

    使⽤pip安装所需依赖

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

    2、任务配置Spark参数

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

    这个配置加在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
    
    • 1
    • 2
    • 3
    • 4

    上面这四个分别用–conf引入
    比如 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=test-sparkenv/bin/python3.6

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

  • 相关阅读:
    .NET中的数组在内存中如何布局?
    docker容器技术实战-2
    Head-First-Design-Patterns
    kkFileView源码编译并发布详细教程
    Unity 基础 之 目录结构解析
    cocos游戏引擎制作的滚动框地图防止误点操作的简单方法
    竟然还有人不会配置idea鼠标调节字体?
    并发编程——1.java内存图及相关内容
    【信息论与编码基础】第3章 离散信道
    用Androidstudio 开发一个学生作业管理系统
  • 原文地址:https://blog.csdn.net/qq_31806205/article/details/133563542