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

时间:2019-02-04 04:53:45

标签: logging streaming yarn amazon-emr flink-streaming

美好的一天,

我正在AWS EMR 5.20上运行Flink(v1.7.1)流作业,并且我希望在S3中拥有我的作业的所有task_managers和job_manager的日志。 Flink团队建议使用Logback。 由于这是一项长期的工作,因此我希望日志为:

  1. 定期复制到S3
  2. 按时间或按大小滚动,或同时按大小滚动(因为可能会有大量的日志)
  3. 从EMR节点的内部磁盘中清理(否则磁盘将装满)

我尝试过的是:

  1. 在创建EMR集群时启用了记录到S3的功能
  2. 配置的纱线滚动日志,其中包括: yarn.log-aggregation-enable,yarn.nodemanager.remote-app-log-dir,yarn.log-aggregation.retain-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
    • 通常的YARN日志文件夹( / mnt / var / log / hadoop-yarn / containers / application_1549236419773_0002 / container_1549236419773_0002_01_000002 )中只有最后一个滚动日志文件可用
    • 在S3中只有最后一个滚动日志文件可用

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

您能帮我吗?

感谢和问候,

Averell

1 个答案:

答案 0 :(得分:0)

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

我自己还没有尝试过,但是如果需要的话,我可能会尝试以下操作:

  1. 通过S3fs在EC2实例上安装S3。
  2. 设置logrotate(或同等功能)以自动复制和清理日志文件。

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

如果S3fs给您带来了问题,那么您可以做更多的脚本编写,直接使用aws s3命令来同步日志,然后在复制日志后将其删除。