如何将EMR集群中Apache-Flink作业日志转存到CloudWatch?
将EMR上的Apache Flink作业日志转存至CloudWatch
一、创建EMR集群时启用CloudWatch日志集成
- 集群创建流程中,进入日志选项模块,勾选「将日志发送到CloudWatch Logs」
- 自定义日志组名称(例如
/aws/emr/cluster-<你的集群ID>/flink),便于后续分类管理;也可使用默认组,但建议自定义 - 确保EMR的EC2实例角色(通常为
EMR_EC2_DefaultRole)具备CloudWatch日志写入权限:至少需要logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents这三个权限,直接附加CloudWatchLogsFullAccess策略更快捷(生产环境建议按需缩权限)
二、确保Flink日志输出到标准目录
Flink默认将日志存储在EMR节点的/var/log/flink/目录下,若你自定义过Flink日志配置:
- 修改
flink-conf.yaml中的日志配置项(log4j.configuration或logback.configurationFile),确保日志输出到/var/log/flink/ - 配置日志滚动策略(比如按大小或时间切割),避免单日志文件过大影响采集效率
三、配置CloudWatch Agent(集群未自动配置时)
EMR 5.28及以上版本默认预装CloudWatch Agent,若未预装可通过sudo yum install amazon-cloudwatch-agent安装:
- 创建Agent配置文件(示例路径:
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json):
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/flink/*.log", "log_group_name": "/aws/emr/cluster-<你的集群ID>/flink", "log_stream_name": "{instance_id}/{hostname}", "timestamp_format": "yyyy-MM-dd HH:mm:ss,SSS" } ] } } } }
- 启动并加载配置:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s
四、验证日志传输状态
- 登录CloudWatch控制台,找到你指定的日志组,查看是否有来自EMR节点的日志流,且能看到Flink作业的日志内容
- 若日志未出现,检查:
- CloudWatch Agent状态:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status - EMR实例角色的IAM权限是否齐全
/var/log/flink/下的日志文件是否存在且Agent可读
- CloudWatch Agent状态:
额外优化建议
- 设置CloudWatch日志组的保留策略:在日志组详情页配置保留时长(支持永久保留),避免日志自动删除
- 成本优化:配置日志生命周期策略,将超过指定时长的日志归档到S3,降低CloudWatch存储成本
- 细分日志流:可在Agent配置中分别采集JobManager和TaskManager日志,比如将
file_path设为/var/log/flink/jobmanager*.log和/var/log/flink/taskmanager*.log,对应不同的日志流,方便排查问题
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

