放置在位于 EC2 实例 运行 脚本上的 S3 中的 EMR 日志在哪里?
Where are the EMR logs that are placed in S3 located on the EC2 instance running the script?
问题:假设我 运行 在 EMR - assert 1 == 2
上有一个非常简单的 Python 脚本。此脚本将失败并显示 AssertionError
。日志包含包含 AssertionError
的回溯将被放置(如果启用日志)在我在设置时指定的 S3 存储桶中,然后我可以在这些日志获取时读取包含 AssertionError
的日志掉进了S3。但是,这些日志在 在 被放入 S3 之前存在于何处?
我假设它们将存在于特定脚本 运行 所在的 EC2 实例上。假设我已经连接到该 EC2 实例和脚本 运行 具有 ID s-EXAMPLE
的 EMR 步骤。如果我这样做:
[n1c9@mycomputer cwd]# gzip -d /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr.gz
[n1c9@mycomputer cwd]# cat /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr
然后我会得到一个带有典型 20/01/22 17:32:50 INFO Client: Application report for application_1 (state: ACCEPTED)
的输出,您可以在 stderr
日志文件中看到,您可以在 EMR 上访问:
所以我的问题是:日志 (stdout
) 在哪里可以查看实际提出的 AssertionError
?它被放置在我的 S3 存储桶中,指示在脚本 fails/completes 后约 5-7 分钟进行记录,那么在此之前它在 EC2 中存在于何处?我问是因为在将这些错误日志放入 S3 之前获取这些错误日志可以节省我很多时间 - 基本上每次我编写失败的脚本时只需 5 分钟,这比我承认的要多!
到目前为止我已经尝试过: 我已经尝试在上面代码示例的路径中检查 EC2 机器上的 stdout
,但是 stdout
文件始终为空:
我很难理解的是,如果 AssertionError
分钟后 S3 上有可用的回溯,stdout
文件怎么会是空的(我是不是误解了这个过程的工作原理?)。我还尝试查看 PySpark 构建的一些临时文件夹,但也没有成功。此外,我已经在 EMR 上打印了 EC2 实例 运行ning 的控制台输出,包括核心和主实例,但其中 none 似乎有我想要的相关信息。
我还查看了 boto3
的一些 EMR 方法并尝试了此处记录的 describe_step
方法:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.describe_step - 对于失败的步骤,有一个 FailureDetails
json 听写响应。不幸的是,这只包括一个 LogFile
键,它链接到 S3 上的 stderr.gz
文件(即使该文件还不存在)和一个 Message
键,它包含一个通用的 Exception in thread..
消息,而不是 stdout
。我对这些日志的存在有什么误解吗?
如果您需要更多信息,请随时告诉我!
使用日志收集代理很正常,实际的日志文件实际上并没有增长,但它们只是拦截 stdout
以执行它们需要的操作。
很可能当您配置为将 S3 用于日志时,代理被配置为读取和删除您的实际日志文件,或者可能创建日志文件到其他地方的符号链接,因此当任何进程打开时该文件实际上永远不会被写入它用于写入。
也许可以尝试检查那里是否有任何符号链接
find -L / -samefile /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr
但它可能与符号链接有所不同以实现相同的逻辑,而且我在 AWS 文档中找不到任何东西,所以很可能不是为了让您同时拥有 S3 和文件,也许您找不到它
如果您希望能够更频繁地检查日志,您可能需要考虑安装第三方日志收集器(logstash、beats、rsyslog、fluentd)并将日志发送到 SolarWinds Loggly,logz.io, 或者设置一个 ELK (Elastic search, logstash, kibana)
你可以查看这个article from Loggly, or create a free acount in logz.io and check the lots of free shippers that they support
问题:假设我 运行 在 EMR - assert 1 == 2
上有一个非常简单的 Python 脚本。此脚本将失败并显示 AssertionError
。日志包含包含 AssertionError
的回溯将被放置(如果启用日志)在我在设置时指定的 S3 存储桶中,然后我可以在这些日志获取时读取包含 AssertionError
的日志掉进了S3。但是,这些日志在 在 被放入 S3 之前存在于何处?
我假设它们将存在于特定脚本 运行 所在的 EC2 实例上。假设我已经连接到该 EC2 实例和脚本 运行 具有 ID s-EXAMPLE
的 EMR 步骤。如果我这样做:
[n1c9@mycomputer cwd]# gzip -d /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr.gz
[n1c9@mycomputer cwd]# cat /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr
然后我会得到一个带有典型 20/01/22 17:32:50 INFO Client: Application report for application_1 (state: ACCEPTED)
的输出,您可以在 stderr
日志文件中看到,您可以在 EMR 上访问:
所以我的问题是:日志 (stdout
) 在哪里可以查看实际提出的 AssertionError
?它被放置在我的 S3 存储桶中,指示在脚本 fails/completes 后约 5-7 分钟进行记录,那么在此之前它在 EC2 中存在于何处?我问是因为在将这些错误日志放入 S3 之前获取这些错误日志可以节省我很多时间 - 基本上每次我编写失败的脚本时只需 5 分钟,这比我承认的要多!
到目前为止我已经尝试过: 我已经尝试在上面代码示例的路径中检查 EC2 机器上的 stdout
,但是 stdout
文件始终为空:
我很难理解的是,如果 AssertionError
分钟后 S3 上有可用的回溯,stdout
文件怎么会是空的(我是不是误解了这个过程的工作原理?)。我还尝试查看 PySpark 构建的一些临时文件夹,但也没有成功。此外,我已经在 EMR 上打印了 EC2 实例 运行ning 的控制台输出,包括核心和主实例,但其中 none 似乎有我想要的相关信息。
我还查看了 boto3
的一些 EMR 方法并尝试了此处记录的 describe_step
方法:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.describe_step - 对于失败的步骤,有一个 FailureDetails
json 听写响应。不幸的是,这只包括一个 LogFile
键,它链接到 S3 上的 stderr.gz
文件(即使该文件还不存在)和一个 Message
键,它包含一个通用的 Exception in thread..
消息,而不是 stdout
。我对这些日志的存在有什么误解吗?
如果您需要更多信息,请随时告诉我!
使用日志收集代理很正常,实际的日志文件实际上并没有增长,但它们只是拦截 stdout
以执行它们需要的操作。
很可能当您配置为将 S3 用于日志时,代理被配置为读取和删除您的实际日志文件,或者可能创建日志文件到其他地方的符号链接,因此当任何进程打开时该文件实际上永远不会被写入它用于写入。
也许可以尝试检查那里是否有任何符号链接
find -L / -samefile /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr
但它可能与符号链接有所不同以实现相同的逻辑,而且我在 AWS 文档中找不到任何东西,所以很可能不是为了让您同时拥有 S3 和文件,也许您找不到它
如果您希望能够更频繁地检查日志,您可能需要考虑安装第三方日志收集器(logstash、beats、rsyslog、fluentd)并将日志发送到 SolarWinds Loggly,logz.io, 或者设置一个 ELK (Elastic search, logstash, kibana)
你可以查看这个article from Loggly, or create a free acount in logz.io and check the lots of free shippers that they support