关于python:hadoop streaming:应用程序日志在哪里?

hadoop streaming: where are application logs?

我的问题类似于:hadoop streaming:如何查看应用程序日志?
(答案中的链接目前无法正常工作。所以我必须再次发布一个问题)

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

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

reducer.py -

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

我无法在stderr中看到任何日志(警告,错误)。

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

附加问题:

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

reducer.py -

1
2
3
4
5
6
7
8
9
....
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这样的分布式环境中实现这一目标吗?如果是这样,怎么能实现呢?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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流媒体作业中实现日志记录。

谢谢


试试这个HDFS路径:
/纱线/应用/&安培;{USER_NAME} /日志/应用_$ {APPID} /

一般来说:

Where to store container logs. An application's localized log directory will be found in ${yarn.nodemanager.log-dirs}/application_${appid}. Individual containers' log directories will be below this, in directories named container_{$contid}. Each container directory will contain the files stderr, stdin, and syslog generated by that container.

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


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