合并mapreduce日志

ippsafx7  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(394)

调试hadoop map reduce作业是一件痛苦的事。我可以打印到stdout,但是这些日志显示在运行mr作业的所有不同机器上。我可以去jobtracker,找到我的工作,然后单击每个Map器来访问它的任务日志,但是当你有20多个Map器/还原器时,这是非常麻烦的。
我在想,我可能需要编写一个脚本,通过job tracker找出每个mapper/reducer运行在哪台机器上,然后scp日志回到一个中心位置,在那里它们可以被分类在一起。在我浪费时间做这件事之前,有没有人知道一个更好的方法,为作业的Map器和还原器获得一个统一的标准输出日志?

fkvaft9z

fkvaft9z1#

我的经验是,当您确切地知道是什么map/reduce尝试导致了要通过日志检查的问题时,您不需要单击20+个map/reduce输出链接。这就是为什么我总是在抛出异常或递增计数器时使用context.setstatus(“warn message here”)来引起怀疑。
有关设置状态的更多信息:http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/taskinputoutputcontext.html#setstatus(java.lang.string)
https://www.inkling.com/read/hadoop-definitive-guide-tom-white-3rd/chapter-5/running-on-a-cluster (调试作业部分)

w46czmvw

w46czmvw2#

我是这样做的:
对于一般调试(即测试作业是否正常工作),我在本地计算机上以独立模式运行hadoop,并提供少量数据样本。通过这种方式,hadoop与其他java应用程序一样工作,并在控制台中显示Map器或还原器的标准输出。
对于特定的bug(例如,作业在本地机器上运行良好,但在生产中会死掉),我只需调整代码,将调试时通常发送给stdout的内容作为作业的输出。这样您就可以检查作业的结果以获得调试细节。这不漂亮,但效果很好。
另一个选项是在jobtracker中检查节点的日志。他们有所有的标准和标准。但是,由于几个原因,我发现这比上面描述的解决方案要复杂得多(日志在一段时间后被删除,需要查找几个节点,等等)

htzpubme

htzpubme3#

所以我最终只是创建了一个python脚本来实现这一点。这并不可怕。这是剧本,以防别人用。显然,它需要更多的错误检查,而不是硬编码的网址,等等,但你得到的想法。注意,你需要下载靓汤


# !/usr/bin/python

import sys
from bs4 import BeautifulSoup as BS
from urllib2 import urlopen
import re

TRACKER_BASE_URL = 'http://my.tracker.com:50030/'
trackerURLformat = TRACKER_BASE_URL + 'jobtasks.jsp?jobid=%s&type=%s&pagenum=1' # use map or reduce for the type

def findLogs(url):
    finalLog = ""

    print "Looking for Job: " + url
    html = urlopen(url).read()
    trackerSoup = BS(html)
    taskURLs = [h.get('href') for h in trackerSoup.find_all(href=re.compile('taskdetails'))]

    # Now that we know where all the tasks are, go find their logs
    logURLs = []
    for taskURL in taskURLs:
        taskHTML = urlopen(TRACKER_BASE_URL + taskURL).read()
        taskSoup = BS(taskHTML)
        allLogURL = taskSoup.find(href=re.compile('all=true')).get('href')
        logURLs.append(allLogURL)

    # Now fetch the stdout log from each
    for logURL in logURLs:
        logHTML = urlopen(logURL).read()
        logSoup = BS(logHTML)
        stdoutText = logSoup.body.pre.text.lstrip()
        finalLog += stdoutText

    return finalLog

def main(argv):
    with open(argv[1] + "-map-stdout.log", "w") as f:
        f.write(findLogs(trackerURLformat % (argv[1], "map")))
        print "Wrote mapers stdouts to " + f.name

    with open(argv[1] + "-reduce-stdout.log", "w") as f:
        f.write(findLogs(trackerURLformat % (argv[1], "reduce")))
        print "Wrote reducer stdouts to " + f.name

if __name__ == "__main__":
    main(sys.argv)

相关问题