配置集群日志记录和调试 - Amazon EMR

配置集群日志记录和调试

在规划集群时要确定的事项之一是您希望提供多少调试支持。当首次开发数据处理应用程序时,我们建议您在集群上测试该应用程序,处理一小部分但具有代表性的数据子集。执行此操作时,您可能希望利用 Amazon EMR 提供的所有调试工具,如将日志文件存档到 Amazon S3。

在完成开发和将数据处理应用程序投入全面生产后,您可以选择缩减调试。这样做可以节省在 Amazon S3 中存储日志文件存档的成本,并降低数据库上的处理负载,因为不再需要向 Amazon S3 写入状态。当然,如果这样做,在出现错误时可用于调查问题的工具则会相对较少。

默认日志文件

默认情况下,每个集群都会将日志文件写到主节点上。这些文件将写入 /mnt/var/log/ 目录。如 使用 SSH 连接到主节点 中所述,您可以通过使用 SSH 连接到主节点来访问这些日志。

注意

如果使用 Amazon EMR 6.8.0 发行版或更早版本,集群终止期间日志文件会保存到 Amazon S3,因此主节点终止后,将无法访问日志文件。如果使用 Amazon EMR 6.9.0 发行版及更高版本,集群缩减期间日志文件会存档到 Amazon S3,因此即使在节点终止后,集群上生成的日志文件仍然存在。

您无需启用任何功能或工具即可将日志文件写到主节点上。这是 Amazon EMR 和 Hadoop 的默认行为。

一个集群可产生多种类型的日志文件,包括:

  • 步骤日志 – 这些日志由 Amazon EMR 服务生成,包含集群的相关信息和每个步骤的结果。日志文件存储在主节点上的 /mnt/var/log/hadoop/steps/ 目录中。每个步骤都将其结果记录在单独编号的子目录中:第一步的子目录为 /mnt/var/log/hadoop/steps/s-stepId1/,第二步为 /mnt/var/log/hadoop/steps/s-stepId2/,依此类推。13 个字符的步骤标识符 (如 stepId1、stepId2) 对集群来说是唯一的。

  • Hadoop 和 YARN 组件日志 – 与 Apache YARN 和 MapReduce 关联的组件日志包含在 /mnt/var/log 中的单独文件夹中。/mnt/var/log 下 Hadoop 组件的日志文件位置有:hadoop-hdfs、hadoop-mapreduce、hadoop-httpfs 和 hadoop-yarn。hadoop-state-pusher 目录用于 Hadoop 状态推送进程的输出。

  • 引导操作日志 – 如果您的任务使用引导操作,则会记录这些操作的结果。日志文件存储在主节点上的 /mnt/var/log/bootstrap-actions/ 中。每个引导操作都将其结果记录在单独编号的子目录中:第一个引导操作的子目录为 /mnt/var/log/bootstrap-actions/1/、第二个引导操作为 /mnt/var/log/bootstrap-actions/2/,依此类推。

  • 实例状态日志 – 这些日志提供有关 CPU、内存状态和节点的垃圾收集器线程的信息。日志文件存储在主节点上的 /mnt/var/log/instance-state/ 中。

将日志文件归档到 Amazon S3

注意

您目前不能通过 yarn logs 实用工具对 Amazon S3 使用日志聚合。

如果使用 Amazon EMR 6.9.0 发行版及更高版本,集群缩减期间日志文件会存档到 Amazon S3,因此即使在节点终止后,集群上生成的日志文件仍然存在。此行为会自动启用,因此您无需执行任何操作即可将其打开。对于 Amazon EMR 发行版 6.8.0 及更早版本,您可以配置集群以定期将存储在主节点上的日志文件存档到 Amazon S3。这可确保集群终止后(无论是正常关闭或是由于错误所致),日志文件仍可用。Amazon EMR 每隔 5 分钟便将日志文件归档到 Amazon S3。

要将 Amazon EMR 发行版 6.8.0 及更早版本的日志文件存档到 Amazon S3,您必须在启动集群时启用此功能。您可以使用控制台、CLI 或 API 执行此操作。默认情况下,使用控制台启动的集群已启用日志存档。对于使用 CLI 或 API 启动的集群,必须手动启用到 Amazon S3 的日志记录。

注意

我们重新设计了 Amazon EMR 控制台,以便其易于使用。请参阅 控制台中的新增功能,以了解有关新旧控制台体验差异的信息。

New console
使用新控制台将日志文件存档到 Amazon S3
  1. 登录 AWS Management Console 并打开 Amazon EMR 控制台,网址为 https://console.aws.amazon.com/emr

  2. 在左侧导航窗格中的 EMR on EC2 下,选择 Clusters(集群),然后选择 Create cluster(创建集群)。

  3. Cluster logs(集群日志)下,选中 Publish cluster-specific logs to Amazon S3(将集群特定日志发布到 Amazon S3)复选框。

  4. Amazon S3 location(Amazon S3 位置)字段中,键入(或浏览到)存储日志的 Amazon S3 路径。如果键入的文件夹名称在存储桶中不存在,Amazon S3 将创建该文件夹。

    设定此值后,Amazon EMR 会将日志文件从集群中的 EC2 实例复制到 Amazon S3。这可以防止在集群终止及托管集群的 EC2 实例终止时丢失日志文件。这些日志在排除故障时非常有用。有关更多信息,请参阅查看日志文件

  5. (可选)选中 Encrypt cluster-specific logs(加密集群特定的日志)复选框。然后,从列表中选择 AWS KMS 密钥,输入密钥 ARN 或创建新密钥。此选项仅适用于 Amazon EMR 5.30.0 及更高版本(不包括 6.0.0)。要使用此选项,请为您的 EC2 实例配置文件和 Amazon EMR 角色向 AWS KMS 添加权限。有关更多信息,请参阅使用 AWS KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件

  6. 选择适用于集群的任何其他选项。

  7. 要启动集群,选择 Create cluster(创建集群)。

Old console
使用旧控制台将日志文件存档到 Amazon S3
  1. 导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 选择创建集群

  3. 选择 Go to advanced options (转到高级选项)

  4. 一般选项部分中的日志记录字段中,接受默认选项:已启用

    此字段决定 Amazon S3 是否将详细日志数据捕获到 Amazon EMR。您只能在创建集群时设置此选项。有关更多信息,请参阅查看日志文件

  5. S3 folder 字段中,键入(或浏览到)用于存储日志的 Amazon S3 路径。您也可以让控制台为您生成一个 Amazon S3 路径。如果键入的文件夹名称在存储桶中不存在,系统将创建该文件夹。

    设定此值后,Amazon EMR 会将日志文件从集群中的 EC2 实例复制到 Amazon S3。这可以防止在集群结束及托管集群的 EC2 实例终止时丢失日志文件。这些日志在排除故障时非常有用。

    有关更多信息,请参阅查看日志文件

  6. Log encryption (日志加密) 字段中,选择 Encrypt logs stored in S3 with an AWS KMS customer managed key (使用 Amazon KMS 客户托管密钥加密存储在 S3 中的日志)。然后,从列表中选择 AWS KMS 密钥或输入密钥 ARN。您也可以创建新的 AWS KMS 密钥。

    此选项仅适用于 Amazon EMR 5.30.0 及更高版本(不包括 6.0.0)。要使用此选项,请为您的 EC2 实例配置文件和 Amazon EMR 角色向 AWS KMS 添加权限。有关更多信息,请参阅使用 AWS KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件

  7. 按照计划和配置集群中所述继续创建集群。

CLI
使用 AWS CLI 将日志文件存档到 Amazon S3

要使用 AWS CLI 将日志文件归档到 Amazon S3,请键入 create-cluster 命令并使用 --log-uri 参数指定 Amazon S3 日志路径。

  1. 要将文件记录到 Amazon S3,请键入以下命令并将 myKey 替换为您的 EC2 密钥对的名称。

    aws emr create-cluster --name "Test cluster" --release-label emr-5.36.1 --log-uri s3://DOC-EXAMPLE-BUCKET/logs --applications Name=Hadoop Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3
  2. 如果不使用 --instance-groups 参数指定实例计数,则将启动单个主节点,其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。

    注意

    如果您之前未创建默认 Amazon EMR 服务角色和 EC2 实例配置文件,请先输入 aws emr create-default-roles 进行创建,然后键入 create-cluster 子命令。

使用 AWS KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件

利用 Amazon EMR 版本 5.30.0 及更高版本(Amazon EMR 6.0.0 除外),您可以使用 AWS KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件。要在控制台中启用此选项,请按照将日志文件归档到 Amazon S3中的步骤进行操作。您的 Amazon EC2 实例配置文件和 Amazon EMR 角色必须满足以下先决条件:

  • 用于您的集群的 Amazon EC2 实例配置文件必须有权使用 kms:GenerateDataKey

  • 用于您的集群的 Amazon EMR 角色必须有权使用 kms:DescribeKey

  • 必须将 Amazon EC2 实例配置文件和 Amazon EMR 角色添加到指定的 AWS KMS 客户托管密钥的密钥用户列表中,如以下步骤所示:

    1. https://console.aws.amazon.com/kms 打开 AWS Key Management Service(AWS KMS)控制台。

    2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

    3. 选择要修改的 KMS 密钥的别名。

    4. 在密钥详细信息页面的 Key Users (密钥用户) 下,选择 Add (添加)

    5. Add key users (添加密钥用户)对话框中,选择您的 Amazon EC2 实例配置文件和 Amazon EMR 角色。

    6. 选择 Add(添加)。

有关更多信息,请参阅 Amazon EMR 使用的 IAM 服务角色、《AWS Key Management Service 开发人员指南》中的使用密钥策略

使用 AWS CLI 在 Amazon S3 中聚合日志

注意

您目前不能通过 yarn logs 实用工具使用日志聚合。您只能使用此过程支持的聚合。

日志聚合 (Hadoop 2.x) 将日志从单个应用程序的所有容器汇总到单个文件中。要使用 AWS CLI 启用对 Amazon S3 的日志聚合,请在集群启动时使用引导操作启用日志聚合并指定用于存储日志的存储桶。

  • 要启用日志聚合,请创建名为 myConfig.json 的下列配置文件,其中包含以下内容:

    [ { "Classification": "yarn-site", "Properties": { "yarn.log-aggregation-enable": "true", "yarn.log-aggregation.retain-seconds": "-1", "yarn.nodemanager.remote-app-log-dir": "s3:\/\/DOC-EXAMPLE-BUCKET\/logs" } } ]

    请键入以下命令,将 myKey 替换为您的 EC2 密钥对的名称。您还可以将任何红色文本替换为自己的配置。

    aws emr create-cluster --name "Test cluster" \ --release-label emr-5.36.1 \ --applications Name=Hadoop \ --use-default-roles \ --ec2-attributes KeyName=myKey \ --instance-type m5.xlarge \ --instance-count 3 \ --configurations file://./myConfig.json

    如果不使用 --instance-groups 参数指定实例计数,则将启动单个主节点,其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。

    注意

    如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件,请先运行 aws emr create-default-roles 以创建它们,然后再运行 create-cluster 子命令。

有关在 AWS CLI 中使用 Amazon EMR 命令的更多信息,请参阅 AWS CLI 命令参考

日志位置

以下列表包括了所有日志类型及其在 Amazon S3 中的位置。您可以使用这些日志来排查 Amazon EMR 问题。

步骤日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/steps/<step-id>/

应用程序日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/containers/

此位置包含容器 stderr 以及 stdoutdirectory.infoprelaunch.outlaunch_container.sh 日志。

资源管理器日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hadoop-yarn/

Hadoop HDFS

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-hdfs/

此位置包含 NameNode、DataNode 和 YARN TimelineServer 日志。

节点管理器日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-yarn/

实例状态日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/daemons/instance-state/

Amazon EMR 预调配日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/provision-node/*

Hive 日志

s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hive/*

  • 要查找集群上的 Hive 日志,请删除星号(*)并将 /var/log/hive/ 附加上面的链接后。

  • 要查找 HiveServer2 日志,请删除星号(*)并将 var/log/hive/hiveserver2.log 附加上面的链接后。

  • 要查找 HiveCLI 日志,请删除星号(*)并将 /var/log/hive/user/hadoop/hive.log 附加上面的链接后。

  • 要查找 Hive Metastore Server 日志,请删除星号(*)并将 /var/log/hive/user/hive/hive.log 附加上面的链接后。

如果故障位置在 Tez 应用程序的主节点或任务节点上,请提供相应的 Hadoop 容器日志。

启用调试工具

借助调试工具,您可以更轻松地从 Amazon EMR 控制台浏览日志文件。有关更多信息,请参阅查看调试工具中的日志文件。当您对集群启用调试时,Amazon EMR 将日志文件存档到 Amazon S3,然后为这些文件建立索引。然后,您就可以使用控制台以直观的方式浏览集群的步骤、作业、任务和任务尝试日志。

要在 Amazon EMR 控制台中使用调试工具,您必须在使用控制台、CLI 或者 API 启动集群时启用调试。请注意,Amazon EMR 新控制台不提供调试工具。

Old console
使用旧控制台打开调试工具
  1. 导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 选择创建集群

  3. 选择 Go to advanced options (转到高级选项)

  4. Cluster Configuration (集群配置) 部分的 Logging (日志记录) 字段中,选择 Enabled (已启用)。不能在未启用日志记录的情况下启用调试。

  5. Log folder S3 location 字段中,键入用于存储日志的 Amazon S3 路径。

  6. Debugging (调试) 字段中,选择 Enabled (已启用)。此调试选项创建一个 Amazon SQS 交换,以将调试消息发布到 Amazon EMR 服务后端。将消息发布到此交换功能可能发生费用。有关更多信息,请参阅 Amazon SQS 产品页面

  7. 按照计划和配置集群中所述继续创建集群。

AWS CLI
使用 AWS CLI 打开调试工具

要使用 AWS CLI 启用调试,请键入带 --enable-debugging 参数的 create-cluster 子命令。您还必须在启用调试时指定 --log-uri 参数。

  • 要使用 AWS CLI 启用调试,请键入以下命令并将 myKey 替换为您的 EC2 密钥对的名称。

    aws emr create-cluster --name "Test cluster" \ --release-label emr-5.36.1 \ --log-uri s3://DOC-EXAMPLE-BUCKET/logs \ --enable-debugging \ --applications Name=Hadoop Name=Hive Name=Pig \ --use-default-roles \ --ec2-attributes KeyName=myKey \ --instance-type m5.xlarge \ --instance-count 3

    如果不使用 --instance-groups 参数指定实例计数,则将启动单个主节点,其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。

    注意

    如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件,请先键入 aws emr create-default-roles 创建它们,然后再键入 create-cluster 子命令。

API
使用 Amazon EMR API 打开调试工具
  • 使用以下 Java SDK 配置启用调试。

    StepFactory stepFactory = new StepFactory(); StepConfig enabledebugging = new StepConfig() .withName("Enable debugging") .withActionOnFailure("TERMINATE_JOB_FLOW") .withHadoopJarStep(stepFactory.newEnableDebuggingStep());

    在此示例中,new StepFactory() 使用 us-east-1 作为默认区域。如果您的集群是在其它区域中启动的,则需要使用 new StepFactory("region.elasticmapreduce")(例如,new StepFactory("ap-northeast-2.elasticmapreduce"))指定该区域。

调试选项信息

Amazon EMR 发行版 4.1.0 至 5.27.0 支持在所有区域进行调试。其他 Amazon EMR 版本不支持调试选项。自 2023 年 1 月 23 日起,Amazon EMR 将停用所有版本的调试工具。

Amazon EMR 创建一个 Amazon SQS 队列来处理调试数据。消息可能发生费用。但是,Amazon SQS 拥有含多达 100 万个请求的免费套餐。有关更多信息,请参阅https://aws.amazon.com/https://aws.amazon.com/sqs

调试需要用到角色;您的服务角色和实例配置文件必须让您能够使用所有的 Amazon SQS API 操作。如果您的角色挂载到 Amazon EMR 托管式策略,则您无需对角色做出任何修改。如果您有自定义角色,则需要添加 sqs:* 权限。有关更多信息,请参阅为 Amazon EMR 配置 IAM 服务角色对AWS服务和资源的权限