前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PySpark任务依赖第三方python包的解决方案

PySpark任务依赖第三方python包的解决方案

原创
作者头像
house.zhang
修改2022-03-31 16:39:34
3.7K0
修改2022-03-31 16:39:34
举报
文章被收录于专栏:大数据及人工智能

背景

在使用大数据spark做计算时,scala开发门槛比较高,一般多会去使用Spark Sql 和PySpark,而PySpark进行个性化开发时,需要引入第三方python包,尤其在机器学习算法方面依赖许多科学包如numpy、pandas 、matlib等等,安装这些依赖是一个非常痛苦的过程,尤其是涉及到需要在整个spark集群中去运行,不可能每个节点环境都是一致,也不可能去修改机器上的包依赖了。

Spark on yarn分为client模式和cluster模式,在client模式下driver 会运行在提交节点上,该节点也可能不是yarn集群内部节点,这种方式可以根据自己的需要在driver节点安装软件和依赖,以支撑spark application正常运行。而在cluster模式下,spark application运行的所有进程都在yarn集群的nodemanager上,具体那些节点不确定,这时候就需要集群中所有nodemanager都有运行python程序所需要的依赖包。

解决方法

方案一:

SparkContext.addPyFile(path)

代码语言:txt
复制
   Add a .py or .zip dependency for all tasks to be executed 

   on this SparkContext in the future. The path passed can be either

   a local file, a file in HDFS (or other Hadoop-supported filesystems),

   or an HTTP, HTTPS or FTP URI.

可以把python依赖包上传到hdfs当中, 把整个包目录上传到 hdfs,然后通过sc.addFile拉到所有nodes 的“当前工作目录”就可以import以来包了。

例如:

代码语言:txt
复制
hadoop fs -put /opt/conda/lib/python3.7/site-packages/h3/ hdfs:///user/zhangsan/python/dependency/

接着就可以在代码中通过以下方式去使用了,具体用的时候注意目录层级:
 SparkContext.addPyFile("hdfs:///user/zhangsan/python/dependency/")

方案二

spark-submit提交 python脚本运行 也可以指定以来的python文件,有一个 --py-files参数,对于 Python 来说,可以使用 spark-submit 的 --py-files 参数来添加 .py, .zip 和 .egg 文件,这些都会与应用程序一起分发。如果依赖了多个 Python 文件推荐将它们打包成一个 .zip 或者 .egg 文件。

代码语言:txt
复制
# 压缩多个python依赖

zip -r text.zip  numpy

# 提交spark作业

/bin/spark-submit \

--driver-memory 1g --num-executors 5 --executor-cores 1 --executor-memory 3G \

--py-files /client/files/text.zip \

/client/files/py\_spark\_task.py

方案三

如果以来包比较多可以试着把整个python环境打包到hdfs中,比如

代码语言:txt
复制
zip -r anaconda3.zip anaconda3/
代码语言:txt
复制
hadoop fs -put anaconda3.zip hdfs:///user/zhangsan/python/dependency/

spark-conf中配置

代码语言:txt
复制
spark.yarn.dist.archives=hdfs:///user/zhangsan/python/dependency/anaconda3.zip#anaconda3

spark.pyspark.python=./anaconda3/anaconda3/bin/python3

注:此时应特别注意解压路径,在anaconda3.zip在本地解压后,python的可执行路径为anaconda3/bin/python3,但在服务器上面会多一层。

总结

这篇主要分享了PySpark任务 python依赖包的问题,核心的思路就是把python以来包理解成一个文件目录,借助把Python依赖包打包通过提交spark命令去分法以来文件,或者在依赖包比较大的情况下为了减少上传分发的时间,可以借助预提交到hdfs分布式文件中的方式去指定依赖包,另外就是理解下spark-client模式和cluster模式的区别,有时候python代码只需要运行在client提交节点,就不用去做那么麻烦的事情了

参考文档

https://blog.csdn.net/pop_xiaohao/article/details/107898867?spm=1001.2014.3001.5501

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 解决方法
    • 方案一:
      • 方案二
        • 方案三
        • 总结
        • 参考文档
        相关产品与服务
        大数据处理套件 TBDS
        腾讯大数据处理套件(Tencent Big Data Suite,TBDS)依托腾讯多年海量数据处理经验,基于云原生技术和泛 Hadoop 生态开源技术提供的可靠、安全、易用的大数据处理平台。 TBDS可在公有云、私有云、非云化环境,根据不同数据处理需求组合合适的存算分析组件,包括 Hive、Spark、HBase、Flink、Presto、Iceberg、Elasticsearch、StarRocks 等,以快速构建企业级数据湖仓。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档