hadoop流:应用程序日志在哪里?

lndjwyie  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(435)

我的问题类似于:hadoop流:如何查看应用程序日志(答案中的链接当前不起作用。所以我不得不再发一个问题)
我可以在我的/usr/local/hadoop/logs路径上看到所有hadoop日志
但在哪里可以看到应用程序级日志?例如:
异径管.py-

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

我在stderr中看不到任何日志(警告、错误)。
在哪里可以找到应用程序的日志语句?我正在使用python和hadoop流媒体。
附加问题:
如果我想使用一个文件来存储/聚合我的应用程序日志,例如:
异径管.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集群中master和all slave的$home location中有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流作业中实现日志记录。
谢谢您

dbf7pr2w

dbf7pr2w1#

尝试以下hdfs路径:/yarn/apps/&{user\u name}/logs/application${appid}/
一般来说:
存储容器日志的位置。应用程序的本地化日志目录位于${yarn.nodemanager.log dirs}/application${appid}。单个容器的日志目录将位于此目录下,位于名为container{$contid}的目录中。每个容器目录将包含由该容器生成的文件stderr、stdin和syslog。
如果您打印到stderr,您将在我上面提到的目录下的文件中找到它。每个节点应该有一个文件。

2lpgd968

2lpgd9682#

您必须知道hadoop流使用stdout将数据从Map器传输到还原器。因此,如果您的日志系统在stdout中写入,您将遇到麻烦,因为它很可能会破坏您的逻辑和工作。记录日志的一种方法是在stderr中写入,这样您就可以在错误日志中看到日志。

相关问题