代码之家  ›  专栏  ›  技术社区  ›  Averell

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

  •  0
  • Averell  · 技术社区  · 6 年前

    我在AWS EMR 5.20上运行一个Flink(v1.7.1)流媒体作业,我希望所有任务管理器和作业管理器的工作日志都在S3中。根据Flink团队的建议使用Logback。

    1. 定期复制到S3
    2. 按时或按大小滚动(因为可能有大量日志)

    我试过的是:

    1. 在创建EMR集群时启用到S3的日志记录
    2. yarn.log-aggregation-enable、yarn.nodemanager.remote-app-log-dir、yarn.log-aggregation.retain-seconds、yarn.log-aggregation-enable,
    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纱线/容器/应用程序_1549236419773_0002/容器_1549236419773_0002_01_000002
      • S3中只有最后一个滚动日志文件可用

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

    你能帮我做这个吗?

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

    1 回复  |  直到 5 年前
        1
  •  0
  •   kkrugler    6 年前

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

    我自己也没试过,但如果必须的话,我可能会尝试以下方法:

    1. S3fs .
    2. 设置 logrotate (或等效)自动复制和清除日志文件。

    如果 S3fs系列 如果出现问题,则可以执行更多脚本并直接使用 aws s3