当前位置: 首页 > 知识库问答 >
问题:

如何将EMR流式作业日志复制到S3和清除EMR核心节点磁盘上的日志

欧阳英彦
2023-03-14

日安,

    null
  1. 在创建EMR群集时启用了对S3的日志记录
  2. 配置纱线轧制日志时使用:yarn.log-aggregate-enable,yarn.nodemanager.remote-app-log-dir,yarn.log-aggregathtml" target="_blank">ion.retrain-seconds,yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds
  3. 在logback.xml中配置滚动日志:
    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.file}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>%d{yyyy-MM-dd HH}.%i.log</fileNamePattern>
            <maxFileSize>30MB</maxFileSize>    
            <maxHistory>3</maxHistory>
            <totalSizeCap>50MB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
        </encoder>
    </appender>

到目前为止我所得到/观察到的是:

  • (1)有助于定期将日志文件复制到S3
  • (2)对我来说直到现在都是无用的。日志仅在流作业结束时聚合,没有观察到滚动。
  • (3)产生了一些结果,但尚未接近要求:
    • 滚动日志位于某个缓存文件夹(/mnt/yarn/usercache/hadoop/appcache/application_1549236419773_0002/container_1549236419773_0002_01_000002)
    • 通常的纱线日志文件夹(/mnt/var/log/hadoop-yarn/containers/application_1549236419773_0002/container_1549236419773_0002_01_000002)
    • 中只有最后的滚动日志文件可用
    • 在S3中只有最后一个滚动日志文件可用

    简而言之,在我得到的3个要求中,我只能(1)或(2&3)。

    你能帮我处理一下这个吗?

    感谢并致以最良好的问候,

共有1个答案

于嘉许
2023-03-14

据我所知,EMR支持的日志到S3的自动备份只在作业结束时起作用,因为它基于AWS最初为批处理作业实现的后台日志加载器。也许有一种方法可以让它对滚动原木起作用,我只是从来没有听说过。

我自己还没试过,但如果必须的话,我可能会试一下下面的方法:

  1. 通过s3fs在EC2实例上挂载S3。
  2. 设置logrotate(或等效项)以自动复制和清理日志文件。

您可以使用引导操作来自动设置上述所有操作。

如果s3fs给您带来问题,那么您可以多编写一些脚本,直接使用awss3命令来同步日志,然后在复制日志后将其删除。

 类似资料:
  • 我有一个EMR集群,运行一个火花流作业成功了几天。但几天后,群集因步骤失败而终止。我查了日志上面写着 对于此错误,我进行了检查,发现对于JRE内存不足。 我发现集群创建EMR steps日志并存储在路径/mnt/var/logs/hadoop/steps/step_id/上,在创建集群时,我给出了一个logUri路径,日志根据该路径复制到s3位置。所以我的猜测是,由于这些日志,步骤失败正在发生。

  • 问题内容: 我使用以下命令读取了Docker容器日志输出 我通过调用来将大量数据记录到node.js应用程序的日志中。我需要清理日志,因为它太长了,并且该命令首先运行日志的现有行,然后结束。我该如何清洁使其再次变短?我想查看类似的命令: 但是它似乎不存在。 问题答案: 首先,如果只需要查看较少的输出,则可以让docker只向您显示更新的行: 或者,您可以限制一些行: 要删除Docker for L

  • 问题内容: 编辑:由于似乎没有解决方案,或者我正在做一些人都不知道的非标准操作-我将修订我的问题,并问:当python应用正在制作日志时,完成记录的最佳方法是什么?很多系统调用? 我的应用程序有两种模式。在交互模式下,我希望所有输出都转到屏幕以及日志文件中,包括所有系统调用的输出。在守护程序模式下,所有输出进入日志。守护程序模式使用时效果很好。我找不到在不修改每个系统调用的情况下以交互方式将所有输

  • 问题内容: 我试图捕获与表单一起发送的文件,并在对其进行保存之前对其执行一些操作。因此,我需要在temp目录中创建此文件的副本,但是我不知道如何到达它。Shutil的功能无法复制此文件,因为没有路径。那么,是否有其他方法可以执行此操作? 我的代码: 引起: 和调试: 问题答案: 这是类似的问题,可能会有所帮助。

  • 我们有多个Apache Spark作业,为了调试和排除故障,我们需要记录任务执行的一些事件和参数。 在Apache Spark工作代码中进行日志记录的做法是什么? 显而易见的解决方案是:使用Spark的loginfo(和其他方法,但不推荐使用)、一些日志记录框架(如log4s)或简单的println。 在我的Java开发人员背景下,我觉得直接将日志写入控制台是一种不好的做法。我们总是为它使用日志框

  • 我有一个flink作业,它使用logback作为日志框架,因为日志需要发送到logstash,logback有一个logstash appender(logstash logback appender)。appender工作正常,当flink作业从Eclipse这样的IDE运行时,我可以在logstash中看到应用程序日志。日志记录配置文件logback。xml放在src/main/resourc