如何最好地在 Sagemaker PySpark 集群中安装依赖项

DLa*_*n01 6 apache-spark pyspark amazon-sagemaker

我正在尝试使用新的Sagemaker Spark 容器运行机器学习处理作业。集群启动,但我立即遇到导入错误 - 我的依赖项丢失。

我知道 Spark 容器没有这些依赖项,并且我尝试按照 SO 上概述的步骤安装它们 - 即使用 PySparkProcessor.run() 中的 Submit_py_files 参数提交所有依赖项的 .zip 文件。但是,它似乎没有安装它们。

有没有办法在集群启动时使用 Sagemaker PySparkProcessor 类执行引导脚本?我目前正在尝试运行使用 pandas_udfs 的处理工作负载,并在集群尝试使用 PyArrow 时看到 ImportError:

Traceback (most recent call last):
    File "/opt/ml/processing/input/code/spark_preprocess.py", line 35 in <module>
    @pandas_udf("float", PandasUDFType.GROUPED_AGG)
    File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/udf.py", line 47, in _create_udf
    File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 149 in require_minimum_pyarrow_version
    ImportError: PyArrow >= 0.8.0 must be installed; however, it was not found.
Run Code Online (Sandbox Code Playgroud)

dependency.zip 包含 PyArrow 0.16.0,我使用的是最新版本的 Sagemaker Python SDK。

我知道使用 EMR,您可以提交引导操作脚本来安装依赖项 - 这里有类似的选项吗?谢谢!

小智 0

使用 SageMaker 脚本模式,而不是直接使用 PySparkProcessor。该模式允许您使用脚本作为入口点,并且您可以通过requirements.txt文件指定依赖项和配置。

代码示例是

from sagemaker.script import ScriptProcessor

script_processor = ScriptProcessor(
    base_job_name="your-job-name",
    image_uri="sagemaker-spark-your-region",  # Use the appropriate Spark container URI
    command=["/bin/bash"],
    role="your-role",
    instance_count=1,
    instance_type="ml.m5.xlarge",
    max_runtime_in_seconds=3600,
)

script_processor.run(
    submit_app="your-entry-point-script.py",
    arguments=["arg1", "arg2"],
    # Add any other parameters as needed
Run Code Online (Sandbox Code Playgroud)

在与入口点脚本相同的目录中,创建一个列出依赖项的requirements.txt 文件。这将包括 PyArrow 和任何其他所需的包。

pandas==your_pandas_version
pyarrow==0.16.0
Run Code Online (Sandbox Code Playgroud)