最近在使用pyspark,写完程序放到集群里跑的时候,会碰到
no module named 'xxx'搜索后,发现pyspark包管理的方式有三种
conda
pex
virtual env
conda
conda是python常用的打包工具, 可以通过conda-forge命令行工具,创建conda运行环境
# -c 后面接需要依赖的第三方库
conda create -y -n pyspark_libs -c conda-forge pyarrow pandas conda-pack
conda activate pyspark_libs
conda pack -f -o pyspark_libs.tar.gz
提交到spark集群的时候, 需要通过--archives指定
spark-submit --archives pyspark_libs.tar.gz xxxVirtualenv
virtualenv 是一个python工具来创建隔离环境, 通过venv-pack打包工具(与conda的conda-forge类似), 来管理python依赖, 它将现在环境打包成一个压缩文件.
python -m venv pyspark_venv
source pyspark_venv/bin/activate
pip install pyarrow pandas venv-pack
venv-pack -o pyspark_venv.tar.gz
同样在spark-submit的时候指定
spark-submit --archives pyspark_libs.tar.gz xxxpex
pex是我比较喜欢的一个打包工具, 将python环境和依赖打包成一个可执行文件
使用方式也比较简单
#安装pex
pip install pex
#选择依赖包
pex pyspark pyarrow pandas -o pyspark_pex_env.pex
测试下, 运行可执行文件
./pyspark_pex_env.pex -c "import pandas; print(pandas.__version__)"
1.5.0
spark-submit 通过--files参数提交
spark-submit --files pyspark_pex_env.pex最后强烈推荐下cluster-pack
这个库, 它基于pex,已经集成好与spark, dask等分布式服务的打包配置
🔗 https://github.com/criteo/cluster-pack
示例
import cluster_pack
from cluster_pack.spark import spark_config_builder
if __name__ == "__main__":
# pex打包后的路径
package_path, _ = cluster_pack.upload_env()
ssb = SparkSession.builder \
.appName("spark_app") \
.master("yarn") \
.config("spark.submit.deployMode", "client") \
.config("spark.driver.memory", "1g") \
.config("spark.executor.memory", "1g") \
.config("spark.executor.memoryOverhead", "1g") \
.config("spark.executor.cores", "1") \
.config("spark.acls.enable", "true") \
.config("spark.ui.view.acls", "*")
# 引用pex打包后的路径
spark_config_builder.add_packaged_environment(ssb, package_path)
spark_config_builder.add_editable_requirements(ssb)
# sparksession instantance
ss = ssb.getOrCreate()
文章转载自小王的技术blog,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




