복붙노트

[HADOOP] 맵리 듀스 로그를 통합

HADOOP

맵리 듀스 로그를 통합

디버깅 하둡 맵 줄일 작업은 고통입니다. 나는 표준 출력으로 출력 할 수 있지만, 이러한 로그는 MR 작업이 실행 된 다른 모든 시스템에 표시됩니다. 나는 JobTracker를 이동 내 일을 찾아, 그 작업 로그에 도착하는 각 개별 매퍼를 클릭,하지만 당신은 20 개 이상의 매퍼 / 감속기가있을 때이 매우 복잡 할 수 있습니다.

나는 내가 매퍼 / 감속기의 각 다시 그들이 함께 cat'ed 될 수있는 하나 개의 중앙 위치에 로그 scp를에 다음 실행 어떤 기계 파악하는 작업 추적기를 통해 촉각 근 것입니다 스크립트를 작성해야 할 수도 있다고 생각했다. 내가이 일을 내 시간을 낭비하기 전에, 누군가가 작업의 맵퍼 및 감속기에 대해 하나의 통합 된 표준 출력 로그를 얻을 수있는 더 좋은 방법을 알고 있나요?

해결법

  1. ==============================

    1.나는이에게 다음과 같은 방법을 수행합니다

    나는이에게 다음과 같은 방법을 수행합니다

    일반적으로 디버깅 (작업이 작동 즉 테스트)를 위해 나는 데이터의 작은 샘플로 내 로컬 컴퓨터에 독립형 모드에서 하둡을 실행합니다. 이 방법 하둡은 다른 자바 응용 프로그램으로 작동하고 콘솔에서 매퍼 또는 감속기의 표준 출력을 보여줍니다.

    특정 버그의 경우 (즉, 작업은 내 로컬 컴퓨터에서 잘 실행하지만, 생산에 사망) 난 그냥 디버깅 할 때 나는 일반적으로 표준 출력에 보낼 것입니다 무슨 작업의 출력으로 넣어 코드를 조정할. 당신은 통찰력을 디버깅 작업의 결과를 확인할 수 있습니다 그런 식으로. 이 아니지만, 꽤 잘 작동합니다.

    또 다른 옵션은 JobTracker에있는 노드의 로그를 확인하는 것입니다. 그들은 모든 표준 출력 및 표준 오류가 있습니다. 그러나 여러 가지 이유로 나는이 솔루션 (로그 잠시 후 삭제, 여러 노드에 대해 등을보고) 위에서 설명한 것이 훨씬 복잡한 것으로 나타났습니다

  2. ==============================

    2.그래서 난 그냥 이렇게 파이썬 스크립트를 작성 끝났다. 끔찍하지 않았다. 여기에 다른 사람이 그것을 사용하고자하는 경우에는 스크립트입니다. 분명히 더 많은 오류 검사가 아닌 하드 코딩 된 URL 등을 필요로하지만 당신은 아이디어를 얻을. 참고, 당신은 아름다운 수프를 다운로드해야

    그래서 난 그냥 이렇게 파이썬 스크립트를 작성 끝났다. 끔찍하지 않았다. 여기에 다른 사람이 그것을 사용하고자하는 경우에는 스크립트입니다. 분명히 더 많은 오류 검사가 아닌 하드 코딩 된 URL 등을 필요로하지만 당신은 아이디어를 얻을. 참고, 당신은 아름다운 수프를 다운로드해야

    #!/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)
    
  3. ==============================

    3.내 경험은 당신이 로그를 검사 할 문제의 원인을지도 축소 / 시도 정확히 알 때 / 20 +지도 클릭을 통해 출력 링크를 줄일 필요가 없다는 것입니다. 난 항상 Context.setStatus를 사용하는 이유는 내가 의심을 제기 할 수있다 예외 또는 증가 카운터를 던질 때 ( "여기에 메시지를 경고")입니다.

    내 경험은 당신이 로그를 검사 할 문제의 원인을지도 축소 / 시도 정확히 알 때 / 20 +지도 클릭을 통해 출력 링크를 줄일 필요가 없다는 것입니다. 난 항상 Context.setStatus를 사용하는 이유는 내가 의심을 제기 할 수있다 예외 또는 증가 카운터를 던질 때 ( "여기에 메시지를 경고")입니다.

    대해 setStatus에 대한 자세한 : 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 (제는 작업을 디버깅)

  4. from https://stackoverflow.com/questions/18518983/consolidate-mapreduce-logs by cc-by-sa and MIT license