将亚马逊 EMR 步骤日志从亚马逊 EC2 实例推送到亚马逊 CloudWatch 日志

作者:E nnio Pastore | 202

Amazon EMR 是 亚马逊云科技 提供的一项大数据服务,用于在 亚马逊云科技 上运行 Apache Spark 和其他开源应用程序,以经济实惠的方式构建可扩展的数据管道。监控在 EMR 集群上部署的作业生成的日志对于帮助实时检测关键问题和快速确定根本原因至关重要。

将这些日志推送到 Amazon CloudWat ch 使您能够集中并从日志中获取可操作的情报,从而解决操作问题,而无需预置服务器或管理软件。你可以立即开始使用聚合、过滤器和正则表达式编写查询。此外,您可以可视化时间序列数据、深入查看单个日志事件,并将查询结果导出到 CloudWatch 控制面板。

要将保留在 EMR 集群的 亚马逊弹性计算云 (亚马逊 EC2)实例上的日志提取到 CloudWatch 中,您可以使用 CloudWatch 代理。 这提供了一种将日志从 EC2 实例推送到 CloudWatch 的简单方法。

CloudWatch 代理是一个可在您的服务器上自主持续运行的软件包。您可以安装和配置 CloudWatch 代理以收集来自 EC2 实例、本地主机和容器化应用程序的系统和应用程序日志。CloudWatch 处理和存储 CloudWatch 代理收集的日志,这进一步有助于监控您的基础设施和应用程序的性能和运行状况。

在这篇文章中,我们创建了一个 EMR 集群并将任务的 EMR 步骤日志集中在 CloudWatch 中。这将使您更轻松地管理 EMR 集群、排除问题和监控性能。如果您想使用 CloudWatch 收集和可视化实时日志、指标和事件数据,从而简化基础设施和应用程序维护,则此解决方案特别有用。

解决方案概述

这篇文章中提出的解决方案基于特定的配置,其中 EMR 步骤并发级别设置为 1。这意味着一次只能在集群上运行一个步骤。请务必注意,如果将 EMR 步骤并发级别设置为大于 1 的值,则解决方案可能无法按预期运行。我们强烈建议您在实施本文中提出的解决方案之前验证您的 EMR 步骤并发 配置。

下图说明了解决方案架构。

Solution Architecture Diagram

工作流程包括以下步骤:

  1. 用户启动 Apache Spark EMR 作业,在 EMR 集群上创建一个步骤。使用 Apache Spark,工作负载分布在 EMR 集群的不同节点上。
  2. 在集群的每个节点(EC2 实例)中,CloudWatch 代理监视不同的日志目录,捕获日志文件中的新条目并将其推送到 CloudWatch。
  3. 用户可以从 CloudWatch 控制台查看访问不同日志组的步骤日志。由 Amazon EMR 编写的步骤日志如下:
    • 控制器 — 有关步骤处理的信息。如果您的步骤在加载时失败,则可以在此日志中找到堆栈跟踪。
    • stderr — Spark 处理该步骤时的标准错误通道。
    • stdout — Spark 处理步骤时的标准输出通道。请注意,对于 Spark 应用程序,驱动程序的日志输出仅出现在以客户端模式运行的应用程序的步骤日志中。更多详细信息可以在 EMR 提交步骤文档 中找到。

我们在这篇文章中提供了一 个 亚马逊云科技 CloudFormation 模板作为一般指南。该模板演示了如何在亚马逊 EMR 上配置 CloudWatch 代理以将 Spark 日志推送到 CloudWatch。您可以根据需要对其进行查看和自定义,以包括您的 Amazon EMR 安全配置。作为最佳实践,我们建议在模板中包含您的 Amazon EMR 安全配置,以 加密传输 中的数据

您还应该意识到,此堆栈部署的某些资源在继续使用时会产生成本。

在接下来的部分中,我们将完成以下步骤:

  1. 创建引导脚本并将其上传到 Amazon Simple Storage Servic e (Amazon S3) 存储桶。
  2. 使用 CloudFormation 模板创建以下资源:
    • 适用于 Amazon EMR 的 亚马逊云科技 身份和访问管理 (IAM) 实例配置文件角色。
    • 带有 Cloud Watch 代理配置的 亚马逊云科技 Systems Manager 参数。
    • 以 Spark 作为已安装应用程序的 EMR 集群。
    • 一份 Spark 任务。
  3. 在 CloudWatch 控制台上监控 Spark 日志。

先决条件

这篇文章假设你有以下几点:

  • 一个 亚马逊云科技 账户
  • 用于存储引导脚本的 S3 存储桶。
  • 亚马逊虚拟私有云 (亚马逊 VPC) 中创建的 VPC,您的 EMR 集群将在其中启动。
  • 默认 IAM 服务角色,用于获取 亚马逊云科技 服务和资源的亚马逊 EMR 权限。您可以在 亚马逊云科技 命令行接口 ( AWS CLI) 中使用 aws emr create-default-role s 命令 创建这些角色
  • 如果您计划通过 SSH 而不是 亚马逊云科技 Systems Manager 会话管理器 连接到集群,则可选的 EC2 密钥对 。

创建引导脚本并将其上传到 S3 存储桶

有关更多信息,请参阅 上传对象 和在 服务器 上 安装和运行 CloudWatch 代理

要创建并上传引导脚本,请完成以下步骤:

  1. 使用以下内容创建名为 bootstrap_cloudwatch_agent.sh 的本地文件:
    
    #!/bin/bash echo-e '正在安装 CloudWatch 代理...\n 'sudo rpm-Uvh--force https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm echo-e '正在启动 CloudWatch Agent...\n 'sudo amazon-cloudwatch-agent-ctl-a fetch-config-m ec2-c ssm: Amazoncloudwatch-config.json-s 
     
    
  2. 在亚马逊 S3 控制台上,选择您的 S3 存储桶。
  3. 对象 选项卡上,选择 上传
  4. 选择 “ 添加文件 ” ,然后选择引导脚本。
  5. 选择 上传 ,然后选择文件名: bootstrap_cloudwatch_agent.sh
  6. 选择 复制 S3 URI 。我们在后面的步骤中使用这个值。

使用 CloudFormation 模板配置资源

选择 L aunch St ack 在您的账户中启动 CloudFormation 堆栈并部署模板:

此模板创建 IAM 角色、IAM 实例配置文件、系统管理员参数和 EMR 集群。集群启动 Spark PI 估算示例应用程序 。如果您使用此模板创建堆栈,则需要为使用的 亚马逊云科技 资源付费。

CloudFormation 向导将要求您修改或提供以下参数:

  • 实例类型 -所有 实例组 的实例 类型 。默认为 m4.xlarge。
  • InstanceCountCore — 核心 实例组中的实例数量。默认值为 2。
  • emrReleaseLabel — 您要使用的 亚马逊 EMR 版本 标签。 默认值为 emr-6.9.0。
  • bootstrapScriptPath — 您之前复制的 CloudWatch 代理安装引导脚本的 S3 路径。
  • 子网 -启动集群的 EC2 子网。您必须提供此参数。
  • ec2keyPairName — 用于连接集群节点的可选 EC2 密钥对,作为会话管理器的替代方案。

监控日志流

成功部署 CloudFormation 堆栈后,在 CloudWatch 控制台上,选择导航窗 格 中的日志组 。然后按前缀 /aws/emr/ master 筛选日志组。

choose Log groups in the navigation pane

日志组中的 ID 对应于 EMR 主节点的 EC2 实例 ID。如果您有多个 EMR 集群,则可以使用此 ID 根据主节点 ID 来识别特定的 EMR 集群。

在日志组中,您将找到三种不同的日志流。

In the log group, you will find the three different log streams.

日志流包含以下信息:

  • stepstdout — Spark 处理该步骤 时的标准输出通道。
    The standard output channel of Spark while it processes the step
  • step-stderr — Spark 处理该步骤 时的标准错误通道。
    The standard error channel of Spark while it processes the step.
  • 步进控制器 -有关步骤处理的信息。如果您的步骤在加载时失败,则可以在此日志中找到堆栈跟踪。
    Information about the processing of the step.

清理

为避免将来您的账户产生费用,请删除您在本演练中创建的资源。只要集群处于活动状态,EMR 集群就会产生费用,因此完成后请将其停止。

  1. 在 CloudFormation 控制台的导航窗格中,选择 堆栈。
  2. 选择你启动的堆栈( EMR-Cloudwatch-demo ),然后选择删除。
  3. 清空 您创建的 S3 存储桶
  4. 删除 您创建的 S3 存储桶

结论

现在您已经完成了本演练中的步骤,您已经在集群主机上运行了 CloudWatch 代理并配置为将 EMR 步骤日志推送到 CloudWatch。使用此功能,您可以有效地监控在 Amazon EMR 上运行的 Spark 作业的运行状况和性能,实时检测关键问题并快速确定根本原因。

您可以通过 CloudFormation 模板打包和部署此解决方案,例如此示例模板,该模板创建 IAM 实例配置文件角色、系统管理员参数和 EMR 集群。

为了更进一步,可以考虑在 CloudWatch 警报中使用这些日志,以获取 日志组 指标筛选器上的警报。 您可以将它们与其他警报一起收集到 复合警报中, 也可以配置警报 操作,例如发送 Amazon 简单通知服务 (Amazon SNS) 通知以触发事件驱动的流程,例如 亚马逊云科技 Lambda 函数 。


作者简介

Ennio Pa stor e 是 亚马逊云科技 数据实验室团队的高级数据架构师。他热衷于与新技术有关的一切事物,这些新技术会对企业和一般生计产生积极影响。Ennio 在数据分析方面拥有 10 多年的经验。他帮助公司定义和实施跨行业的数据平台,例如电信、银行、游戏、零售和保险。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。