[英]SparkJarProcessor in Sagemaker Pipeline
我想在 Sagemaker Pipeline 中運行 SparkJarProcessor。 創建 SparkJarProcessor 的實例后,當我run
處理器時,我可以指定要執行的 jar 和 class 以及run
方法的submit_app
和submit_class
參數。 例如,
processor.run(
submit_app="my.jar",
submit_class="program.to.run",
arguments=['--my_arg', "my_arg"],
configuration=my_config,
spark_event_logs_s3_uri=log_path
)
如果我想將它作為管道中的一個步驟運行,我可以給 ProcessingStep 什么 arguments? 根據此文檔,您可以在處理器上調用 get_run_args 以“獲取在 ProcessingStep 中使用 SparkJarProcessor 時所需的規范化輸入、輸出和 arguments ”,但是當我這樣運行它時,
processor.get_run_args(
submit_app="my.jar",
submit_class="program.to.run",
arguments=['--my_arg', "my_arg"],
configuration=my_config,
spark_event_logs_s3_uri=log_path
)
我的 output 看起來像這樣:
RunArgs(code='my.jar', inputs=[<sagemaker.processing.ProcessingInput object at 0x7fc53284a090>], outputs=[<sagemaker.processing.ProcessingOutput object at 0x7fc532845ed0>], arguments=['--my_arg', 'my_arg'])
“program.to.run”不是 output 的一部分。因此,假設code
指定 jar, submit_class
的規范化版本是什么?
當在 SparkJarProcessor 上調用get_run_args
或run
時, submit_class
用於在處理器本身上設置一個屬性,這就是為什么您在get_run_args
output 中看不到它的原因。
該處理器屬性將在管道定義生成期間用於將ContainerEntrypoint參數設置為CreateProcessingJob
。
例子:
run_args = spark_processor.get_run_args(
submit_app="my.jar",
submit_class="program.to.run",
arguments=[]
)
step_process = ProcessingStep(
name="SparkJarProcessStep",
processor=spark_processor,
inputs=run_args.inputs,
outputs=run_args.outputs,
code=run_args.code
)
pipeline = Pipeline(
name="myPipeline",
parameters=[],
steps=[step_process],
)
definition = json.loads(pipeline.definition())
definition
definition
output :
...
'Steps': [{'Name': 'SparkJarProcessStep',
'Type': 'Processing',
'Arguments': {'ProcessingResources': {'ClusterConfig': {'InstanceType': 'ml.m5.xlarge',
'InstanceCount': 2,
'VolumeSizeInGB': 30}},
'AppSpecification': {'ImageUri': '153931337802.dkr.ecr.us-west-2.amazonaws.com/sagemaker-spark-processing:2.4-cpu',
'ContainerEntrypoint': ['smspark-submit',
'--class',
'program.to.run',
'--local-spark-event-logs-dir',
'/opt/ml/processing/spark-events/',
'/opt/ml/processing/input/code/my.jar']},
...
對於更現代的 sagemaker sdk 版本,您可以直接使用run
方法。 例如,對於'2.120.0' sagemaker sdk 版本:
from sagemaker.workflow.steps import ProcessingStep
from sagemaker.spark.processing import PySparkProcessor
from sagemaker.workflow.pipeline_context import PipelineSession
session = PipelineSession()
spark_processor = PySparkProcessor(
base_job_name="sm-spark",
framework_version="3.1",
role=role,
instance_count=2,
instance_type="ml.m5.xlarge",
max_runtime_in_seconds=1200,
sagemaker_session=session,
)
step_preprocess_data = ProcessingStep(
name="spark-train-data",
step_args=spark_processor.run(
submit_app="./code/preprocess.py",
arguments=[
"--s3_input_bucket",
bucket,
"--s3_input_key_prefix",
"user_filestore/marti/test-spark",
"--s3_output_bucket",
bucket,
"--s3_output_key_prefix",
"user_filestore/marti/test-spark",
],
spark_event_logs_s3_uri="s3://{}/{}/spark_event_logs".format(bucket, "user_filestore/marti/test-spark"),
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.