如何用AWS Lambda执行EMR Studio中读写S3的PySpark笔记本脚本?
如何用Lambda触发EMR Studio笔记本执行并解决S3写入失败问题
存在可触发EMR Studio笔记本执行的Lambda函数,你当前的两种实现方式都存在问题,导致脚本未成功将结果写入S3,以下是具体分析和解决方案:
方法1:start_notebook_execution API调用错误分析
你当前的代码存在参数误用问题:
- 错误地将笔记本ID传入了
EditorId参数,EditorId是EMR Studio的ID,而非具体笔记本的ID,正确参数应为NotebookId。 - 需确保
RelativePath指向的test_pyspark.py确实存在于目标笔记本的文件结构中,路径层级不能出错。 - 检查
EMR_Notebooks_DefaultRole是否具备足够权限:需包含S3读写权限(s3:GetObject、s3:PutObject)、EMR集群访问权限,以及EMR Studio相关的API调用权限。
修正后的Lambda调用代码
import boto3 def lambda_handler(event, context): emr_client = boto3.client('emr', region_name='us-east-1') response = emr_client.start_notebook_execution( NotebookId='你的笔记本ID', ExecutionEngine={ 'Id': '你的EMR集群ID', 'Type': 'EMR' }, ServiceRole='EMR_Notebooks_DefaultRole', RelativePath='test_pyspark.py', ExecutionName='Lambda触发的笔记本执行' ) return {'执行ID': response['NotebookExecutionId']}
方法2:EMR集群直接提交Spark步骤的问题排查
这种方式并非触发EMR Studio笔记本,而是直接在集群上运行Spark任务,未写入S3的常见原因包括:
- 权限不足:EMR集群的EC2实例角色(如
EMR_EC2_DefaultRole)未配置S3读写权限,需在IAM控制台为该角色添加对应S3资源的权限策略。 - 脚本路径错误:确认
s3://aws-emr-resources-us-east-1/test_pyspark.py路径正确,文件确实存在。 - Spark任务日志报错:前往EMR控制台的集群步骤页面,查看对应步骤的日志链接(存储在S3的EMR日志目录中),定位具体报错(如脚本语法错误、Spark配置问题)。
- 脚本逻辑问题:检查PySpark脚本中的写入代码,确保使用正确的路径和写入方式,例如:
# 示例正确的S3写入代码 df.write.mode('overwrite').parquet('s3://你的目标存储桶/结果路径/')
通用排查步骤
- 查看执行日志:
- 方法1:在EMR Studio控制台的「笔记本执行记录」中找到对应任务,查看日志输出,定位权限、路径或脚本错误。
- 方法2:在EMR集群的「步骤」页面,点击步骤的「日志链接」,查看Spark任务的详细报错信息。
- 验证IAM权限:
- 确认Lambda角色具备
emr:StartNotebookExecution权限(方法1)或emr:AddJobFlowSteps权限(方法2)。 - 确认EMR相关角色(笔记本服务角色、集群EC2实例角色)具备S3读写权限。
- 确认Lambda角色具备
内容的提问来源于stack exchange,提问作者Supriya R
相关产品推荐
相关产品推荐

