【问题标题】:hadoop streaming: where are application logs?hadoop 流:应用程序日志在哪里?
【发布时间】:2015-06-02 03:00:12
【问题描述】:

我的问题类似于:hadoop streaming: how to see application logs? (答案中的链接目前不起作用。所以我必须再次发布它并提出一个额外的问题)

我可以在我的 /usr/local/hadoop/logs 路径上看到所有 hadoop 日志

但是我在哪里可以看到应用程序级别的日志?例如:

reducer.py -

import logging
....
logging.basicConfig(level=logging.ERROR, format='MAP %(asctime)s%(levelname)s%(message)s')
logging.error('Test!')  
...

我在 stderr 中看不到任何日志(警告、错误)。

在哪里可以找到应用程序的日志语句?我正在使用 Python 并使用 hadoop-streaming。

补充问题:

如果我想使用文件来存储/聚合我的应用程序日志,例如:

reducer.py -

....
logger = logging.getLogger('test')
hdlr = logging.FileHandler(os.environ['HOME']+'/test.log')
formatter = logging.Formatter('MAP %(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.ERROR)
logger.error('please work!!')
.....

(假设我在我的 hadoop 集群中的主服务器和所有从服务器的 $HOME 位置有 test.log)。我可以在像 Hadoop 这样的分布式环境中实现这一点吗?如果是这样,怎么能做到这一点?

我尝试了这个并运行了一个示例流作业,但只看到以下错误:

Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:330)
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:543)
    at org.apache.hadoop.streaming.PipeReducer.close(PipeReducer.java:134)
    at org.apache.hadoop.io.IOUtils.cleanup(IOUtils.java:237)
    at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:484)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:397)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:170)

Container killed by the ApplicationMaster.
Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143

请帮助我了解如何在 hadoop 流作业中实现日志记录。

谢谢

【问题讨论】:

  • 我知道这是一个重复的问题,我在问题的第一行也提到过。但是答案中的链接已损坏,而且当我使用上述伪代码时,我仍然无法在 stderr 中看到警告/错误日志。另外我还有一个关于在文件中聚合日志的问题。

标签: python hadoop logging mapreduce hadoop-streaming


【解决方案1】:

试试这个 HDFS 路径: /yarn/apps/&{user_name}/logs/application_${appid}/

一般:

容器日志的存储位置。应用程序的本地化日志目录将在 ${yarn.nodemanager.log-dirs}/application_${appid} 中找到。各个容器的日志目录将在此之下,在名为 container_{$contid} 的目录中。每个容器目录都将包含该容器生成的文件 stderr、stdin 和 syslog。

如果你打印到 stderr,你会在我上面提到的这个目录下的文件中找到它。每个节点应该有一个文件。

【讨论】:

  • 谢谢。我最近发现了这一点并部分回答了我的问题,即现在我可以在 stdout 和 stderr 中看到日志语句。
【解决方案2】:

您必须知道 Hadoop-streaming 使用标准输出将数据从映射器传输到减速器。因此,如果您的日志系统写入标准输出,您将遇到麻烦,因为它很可能会破坏您的逻辑和您的工作。 一种记录方式是写入标准错误,因此您将在错误日志中看到您的日志。

【讨论】:

  • 我也尝试了错误和警告日志,但仍然无法在标准错误中看到它们。不好,我会编辑问题以避免混淆。
  • 我不懂Python,但你确定你是用stderr写的吗?
  • 是的,我在我的 python 代码中使用了 - logging.basicConfig(level=logging.ERROR, format='MAP %(asctime)s%(levelname)s%(message)s') logging.error('Test!') 代码 sn-p,如果它是一个普通的 python 脚本,它工作得很好。在这种情况下,我可以在 stderr 中看到日志语句。但是当我在 hadoop reducer.py 中使用相同的代码 sn-p 时,它不起作用。标准错误为空。
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 2011-04-09
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多