使用Azure Synapse Spark打包Conda环境作业

0x6upsns  于 2023-10-22  发布在  Spark
关注(0)|答案(2)|浏览(111)

我正在尝试使用azure synapse来运行spark作业。根据文档,Synapse允许通过工作区包安装第三方库
然而,在azure synapse命令参考中,我可以看到它支持archives选项这是否意味着我可以从blob存储中引用打包的conda环境,并确保所有必要的包在所有节点中可用?
为了进行模拟,我创建了一个小型conda环境,其中包含单个外部包humanize

conda create -y -n hornet_conda_env
  conda activate hornet_conda_env
  conda install -c conda-forge humanize
  conda pack -f -o hornet_conda_env.tar.gz

作为script.py的条目spark作业文件

import humanize
  import datetime as dt

  print(humanize.naturalday(dt.datetime.now()))

脚本和conda环境包(hornet_conda_env.tar.gz)被上传到Azure Blob存储,并使用对脚本的引用创建一个spark作业。
spark作业定义通过az cli命令行调用,如下所示:

az synapse spark job submit \
--workspace-name <workspace_name> \ 
--spark-pool-name <pool_name> 
--executor-size Small 
--executors 2 
--language PySpark 
--main-definition-file abfss://<full_path_for_entry_spark_job>.script.py \
--name <name> \
--archives abfss://<full_path_for_conda_package>/hornet_conda_env.tar.gz

脚本执行失败,并显示错误ModuleNotFoundError: No module named 'humanize',这意味着conda环境未按照归档文件中的引用安装。
synapse允许这种conda环境的打包和分发吗?

更新1

我试图在本地使用这个软件包,我无法使用相同的。我试图在conda环境之外使用它,我得到了与ModuleNotFoundError: No module named 'humanize'相同的问题

PYSPARK_PYTHON=/Users/<username>/opt/anaconda3/bin/python3 \
spark-submit \
--master "local[3]" \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=/Users/<username>/opt/anaconda3/bin/python3 \
--archives ~/workspace/cuezen/hornet/hornet_env.tar.gz#environment  \
~/workspace/cuezen/hornet/hornet.py
mkh04yzy

mkh04yzy1#

按照以下步骤来摆脱模块找不到错误:
1.在终端中启用虚拟环境。下面是一些命令:

python -m venv .venv
 .venv\Scripts\activate
 #add the module in req.txt to install it.
 pip install -r requirements.txt

1.确保这更多的是目前在网站包。
1.如果它不存在,通过与azure-python-sdk或humanize模块进行比较来显式添加它。

wvmv3b1j

wvmv3b1j2#

您需要将--configuration参数和覆盖传递给spark.yarn.appMasterEnv.PYSPARK_PYTHON配置。事

az synapse spark job submit \
--workspace-name <workspace_name> \ 
--spark-pool-name <pool_name> 
--executor-size Small 
--executors 2 
--language PySpark 
--main-definition-file abfss://<full_path_for_entry_spark_job>.script.py \
--name <name> \
--archives abfss://<full_path_for_conda_package>/hornet_conda_env.tar.gz
--configuration "@config.json"

并在本地创建一个包含这些内容的json文件

{"spark.yarn.appMasterEnv.PYSPARK_PYTHON":"./<env_name>/bin/python"}

不幸的是,这会导致synapse池使用这个环境,而不是默认的环境,这可能意味着你需要在那里添加所有的依赖项(但是文件可能很大)。
如果你找到一种方法来加载两个环境的依赖关系,请告诉我。
编辑:做了一些研究,你将需要基本的yml文件的环境工作,这是大约4.5GB。

相关问题