如何将EMR步骤生成的日志流同步至CloudWatch?
一、优先用EMR官方集成方案(无需手动装Agent)
EMR本身自带CloudWatch日志集成能力,之前手动装Agent没生效大概率是没走官方配置路径。
创建集群时配置日志推送
在Airflow的EmrCreateJobFlowOperator对应的集群配置里,指定S3日志存储路径,同时开启CloudWatch日志同步:{ "Name": "你的EMR集群名称", "LogUri": "s3://你的日志存储桶路径/", "ReleaseLabel": "emr-6.10.0", // 替换为你实际使用的EMR版本 "Applications": [{"Name": "Spark"}], // 根据你的ETL任务选择对应应用 "Instances": { ... }, // 填入你的实例配置信息 "Configurations": [ { "Classification": "cloudwatch-logging", "Properties": { "Enabled": "true" }, "Configurations": [ { "Classification": "emr-step", "Properties": { "LogGroupName": "/aws/emr/step/你的集群名", "LogStreamName": "{step_id}-{step_name}" } } // master/slave等节点的日志配置可选,核心是emr-step分类 ] } ], "JobFlowRole": "EMR_EC2_DefaultRole", "ServiceRole": "EMR_DefaultRole" }这里的
emr-step分类会自动把每个任务步骤的日志推送到指定CloudWatch日志组,每个步骤对应独立日志流,方便快速定位故障。检查IAM权限
给EMR服务角色(默认EMR_DefaultRole)添加CloudWatch日志读写权限;EC2实例角色(EMR_EC2_DefaultRole)需具备指定S3日志桶的访问权限,以及CloudWatch日志写入权限。
二、已创建集群的手动同步方案
如果集群已创建且未开启官方集成,可以手动配置CloudWatch Agent:
定位EMR步骤日志路径
步骤日志默认存储在节点的/var/log/hadoop/steps/{step-id}/目录下,其中stdout、stderr是关键故障排查日志文件。配置CloudWatch Agent
在所有集群节点上创建配置文件/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json:{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/hadoop/steps/*/stdout", "log_group_name": "/aws/emr/step/手动同步日志组", "log_stream_name": "{instance_id}-{step_id}-stdout", "timezone": "UTC" }, { "file_path": "/var/log/hadoop/steps/*/stderr", "log_group_name": "/aws/emr/step/手动同步日志组", "log_stream_name": "{instance_id}-{step_id}-stderr", "timezone": "UTC" } ] } } } }重启Agent使配置生效
执行命令:sudo systemctl restart amazon-cloudwatch-agent可通过以下命令检查Agent运行状态:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
三、Airflow任务的日志优化
在Airflow的EmrStepOperator任务执行后,可将步骤ID与对应CloudWatch日志流路径打印到任务日志中,方便步骤失败时直接定位日志;也可使用CloudWatchLogSensor监控关键日志内容,辅助故障排查。
常见问题排查
- 日志未同步:先检查IAM角色权限是否充足,再确认CloudWatch Agent运行状态,最后验证日志路径是否与EMR版本匹配(不同版本日志路径可能略有差异)。
- 手动配置Agent不生效:用以下命令验证配置文件语法是否正确:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a parse-config -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
内容的提问来源于stack exchange,提问作者Aubble

