【问题标题】:Consolidate Spark Logs整合 Spark 日志
【发布时间】:2014-04-28 18:52:57
【问题描述】:

我希望能够全面了解我的 spark 作业。

我在创建 RDD 的机器上使用 log4j,并且分发的各种作业也使用 log4j。这最终得到一个本地日志文件,然后是作业分发到的每个节点上的日志文件。

是否有一些内置方法可以将所有这些日志组合在一起?必须同时查看服务器机器 + 每个节点是很痛苦的。

我环顾了一下,可能有两种选择:

  1. 使用 JobLogger 之类的工具(使用 Spark 侦听器)。
  2. 使用套接字附加程序,或类似 Flume 的东西

大家在处理分布式日志方面有什么经验?

【问题讨论】:

  • 你试过LogMX吗?它可以在一个视图中合并多个日志文件并实时监控这个合并的视图(支持SCP/FTP/SFTP/HTTP/...)
  • 也许可以使用类似的东西——但如果可能的话,我真的想找到一些以 Spark 为中心的东西,或者是 Spark 世界中最常见的做法,来做到这一点。现在,我创建了一个程序,我可以传递应用程序作业 ID,它将转到我集群中的所有节点(通过 ssh)并将 stdout 和 stderr 文件复制到本地......
  • 嗨,格雷格,您找到解决问题的方法了吗?我有类似的要求,任何见解都会有所帮助。谢谢。
  • 我最终创建了一个自定义脚本来执行此操作 - 传入主机列表,它会提取所有日志。

标签: log4j apache-spark


【解决方案1】:

如果你真的想要这个,你可以尝试将日志放在某个共享目录中,但我认为这不是一个好的解决方案。我不知道你为什么需要这样的功能——来自不同执行程序的混合日志,甚至来自不同应用程序的混合日志会使你的日志变得非常混乱。

【讨论】:

  • 我正在为多个工人运行一项工作。我想对所发生的事情有一个统一的看法(例如,一条日志消息可能只在一个工作人员的日志上)。
【解决方案2】:

如果您创建一个记录器并将其与进程一起传递给您的工作人员,工作人员可以写入主节点上的合并文件。 Python 中的一个示例(使用显式多处理):

import logging
from multiprocessing.pool import ThreadPool
LOG_FILENAME = '/home/hadoop/logs/filename.log'    logging.basicConfig(filename=LOG_FILENAME,level=logging.INFO)
logger = logging.getLogger('pyspark')

p = ThreadPool(numNodes)

logDFs = p.map(lambda x: foo(logger, ...), listOfStuff)


def foo(logger, vars):
     #do stuff
     logger.info('This appears in your consolidated log on master.')

在 pyspark 框架中运行,worker 拾取进程,函数foo 将记录器传递给它。您可以在主节点的日志文件夹中查看工作人员的日志语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多