在使用大数据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)
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以来包了。
例如:
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 文件。
# 压缩多个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中,比如
zip -r anaconda3.zip anaconda3/
hadoop fs -put anaconda3.zip hdfs:///user/zhangsan/python/dependency/
spark-conf中配置
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 删除。