Hadoop의 로그파일은 어디에 있는가?

log_dir_change

시스템을 운영하면서 trouble shooting을 할때 제일 중요하면서, 먼저 확인을 해야하는 것은
당연히 log 파일 일 것입니다.

특히나 하둡 같은 경우는 많은 Daemon들이 유기적으로 동작을 하고, 또한
하둡 아키텍쳐 구성에 따라서 각 클러스터 노드들이 역할이 바뀌기 때문에
log 파일에 대한 정리를 하지 않으면 trace가 쉽지가 않습니다.

그래서 Hadoop Core에서 로깅되는 로그 파일들에 대해서 알아 보도록 하겠습니다.

1. Log를 생성하는 주체

하둡이 다소 복잡해 보이는 이유는 관리하는 Daemon들이 많다는 것일 것입니다.
Daemon들이 많다는 것은 그 만큼 로그들이 각자 존재 할 수 있다고
유추 할 수 있습니다.

사실 실제로 로그 파일을 생성하는 주체들은  Daemon들이 맞습니다.

그래서 하둡 코어 Daemon 인
NameNode, Job Tracker, DateNode, Task Tracker, Secondary Name
은 각자의 로그 정보를 갖고 있습니다.

이러한 Daemon들이 기록하는 로그 정보는 기동/중지/런타임 정보 뿐만 아니라
통계, 설정정보, 표준 출력, 표준 에러 출력등 다양한 정보를 로깅 합니다.
이러한 로깅 정보들은 현재 클러스터 노드들에 대한 상태에 대한
진단을 위해서 사용이 됩니다.

2.  Log 홈 디렉토리 설정

기본적으로 하둡의 Daemon 로그의 위치는 %HADOOP_HOME%/logs
저장이 됩니다.

하지만 하둡의 설치 방법도 다양하고, 버전별로 조금씩 디렉토리 구조가
틀립니다.  만약 하둡을 패키지로 설치할 경우
기본 로그 홈 디렉토리는 /var/log/hadoop 될 것입니다.

저 같은 경우는 운영 정책에 맞게 로그 디렉토리를 설정해야 하기 때문에
명시적으로 디렉토리 경로를 선언 합니다.

Note : 위와 같이 명시적으로 로그 디렉토리를 설정하는 것을 추천 드립니다.
만약 디렉토리를 찾지 못할 경우는 

find / -name ‘*namenode*.log’ 또는 find / -name ‘*datanode*.log’
로 검색해서 찾으시면 됩니다.

로그 디렉토리를 설정 하는 방법은 하둡 환경설정 쉘
hadoop-env.sh에  환경변수를 추가 하면 됩니다.

CDH3 같은 경우는 %HADOOP_HOME%/conf에 있고,
CDH4인 경우는 %HADOOP_HOME%/etc/hadoop에 있습니다.

추가할 환경 변수는 아래와 같습니다.

HADOOP_LOG_DIR :  log 홈 디렉토리

HADOOP_PID_DIR : 데몬 프로세스 id를 저장하는 디렉토리 .pid 형식으로 저장되며 파일 안에 내용은
pid 값이 저장되어 있습니다.

HADOOP_ROOT_LOGGER : 하둡은 내부적으로 log4j 로거를 사용 합니다. 기본값은 INFO,console 입니다.
좀더 자세한 정보를 원하거나, 또는 에러만 보고 싶을 경우 로그 레벨을 조정 합니다.

HADOOP_SECURITY_LOGGER : 보안 관련 로그 레벨 설정, 기본값은 INFO,NullAppender

HDFS_AUDIT_LOGGER : HDFS 감시 로그 레벨 설정, 기본값은 INFO,NullAppender

$ vi hadoop-env.sh
# 상단에 환경변수를 추가 합니다.
export HADOOP_LOG_DIR=/home/hadoop/logs/hadoop/core
export HADOOP_ROOT_LOGGE=INFO,console
export HADOOP_PID_DIR=$HADOOP_LOG_DIR
export HADOOP_SECURITY_LOGGER=INFO,NullAppender
export HDFS_AUDIT_LOGGER=INFO,NullAppender

하둡을 재기동 하면, HADOOP_LOG_DIR에 설정된 디렉토리로
Namenode, Secondary Namenode, Datanode, Job Tracker, Task Tracker
데몬들의 로그 파일이 생성 됩니다.

3.  Hadoop Deamon Logs

각각의 데몬들은 2개의 로그 파일 (.log, .out)을 로깅 합니다.
.out 파일은 데몬을 기동시 상태 정보를 출력하며, 정상적으로 완료가 되면
로깅 데이터를 truncate 시킵니다. 반면 .log 파일은 기동시 상태 정보
뿐만 아니라 지속적인 상태를 로깅 합니다.

Note : 만약 기동 상태 정보만 보고자 할경우는 .out 파일만 tailing 하시면 됩니다.

그래서 만약 의사분산모드(한대의 서버에 모든 데몬을 기동하는 모드) 일 경우에는
%HADOOP_LOG_DIR% 아래에 총 10개 (Daemon * 로그파일 수)의 파일이 생성 됩니다.

.log 파일경우는 rolling 되기 때문에 최신 로그를 확인 하기 위해서는
반드시 .log로 끝나는 파일을 tailing 하셔야 합니다.

또한 각 데몬들은 로그파일 명에 대한 명명규칙이 있으며 형식은
아래와 같습니다.

 hadoop-<user-running-hadoop>-<daemon>-<hostname>.<log|out>

예를 들면 호스트  beyondj2ee.pe.kr에서 OS 계정 hadoop 사용자가
namenode를 기동 시켰을 경우 아래와 같은 로그 파일이 생성 됩니다.

hadoop-hadoop-namenode-beyondj2ee.pe.kr.log
hadoop-hadoop-namenode-beyondj2ee.pe.kr.out

전체 Daemon을 실행 했을 경우

hadoop-hadoop-namenode-beyondj2ee.pe.kr.log
hadoop-hadoop-namenode-beyondj2ee.pe.kr.out

hadoop-hadoop-secondarynamenode-beyondj2ee.pe.kr.log
hadoop-hadoop-secondarynamenode-beyondj2ee.pe.kr.out

hadoop-hadoop-jobtracker-beyondj2ee.pe.kr.log
hadoop-hadoop-jobtracker-beyondj2ee.pe.kr.out

hadoop-hadoop-tasktracker-beyondj2ee.pe.kr.log
hadoop-hadoop-tasktracker-beyondj2ee.pe.kr.out

hadoop-hadoop-datanode-beyondj2ee.pe.kr.log
hadoop-hadoop-datanode-beyondj2ee.pe.kr.out

Note : 완전 분산 모드(Full Cluster)에서는 기동 데몬만 로그 파일이 생성 됩니다.
Master 서버에 Namenode만 기동될 경우 namenode만 로그파일이 생성되며
Worker 서버에는 datanode, tasktracker 로그파일만 생성 됩니다.
즉 각 서버에 기동 되는 데몬들을 잘 정리 하셔서 장애시 대응 하시길 바랍니다.

4. Job Configuration XML

Job(MapReduce)를 요청하면 JobTracker는 요청시 Configuration 정보를
아래의 두개의 디렉토리에 .xml 형태로 저장을 합니다.

(1) %HADOOP_LOG_DIR% 디렉토리
(2) %HADOOP_LOG_DIR%/history 디렉토리

이미지 1

Note : Job이 정상적으로 완료 되면
%HADOOP_LOG_DIR%/history/done 디렉토리 밑으로 파일을 이동 시킵 니다.

Job 실행 시 사용자 정의 파라미터 부터 하둡 파라미터
포함한 전체 파라미터 정보를 로깅 합니다.

그래서 수행 당시 어떤 설정으로 Job를 실행 했는지 알 수 있습니다.

해당 로그 파일은 순환 버퍼 처럼 기존 데이터를 삭제 하지 않으며,
rolling도 하지 않습니다.

운영을 위해서 정기적으로 파일을 삭제 또는 이동시
Hadoop 시스템에 영향을 미치지는 않습니다.

대신 현재 running 하는 Job에 관련된 파일을 삭제 하지 않도록 주의를 해야 합니다.
로그 파일명 규칙은 아래와 같습니다.

(1) %HADOOP_LOG_DIR%/ 밑에 생성된 conf 파일

job_<job_ID>_conf.xml

예를 들면 Job 아이디job_201305081144_0005일 경우
생성된 파일 명은 job_201305081144_0005_conf.xml 입니다.

(2) %HADOOP_LOG_DIR%/history 밑에 생성된 conf 파일

<hostname>_<epoch-of-jobtracker-start>_<job-id>_conf.xml

hostnameJobTracker가 구동중인 호스트 명이며,
epoch-of-jobtracker-startJobTracker가 구동 된
이후 현재까지의 시간을 말하며 타입은 long 형입니다.

그래서 실제로 생성된 파일 명은 (개인 테스트 서버 기준)
beyondj2ee.pe.kr_1367981080397_job_201305081144_0005_conf.xml 입니다.

마지막으로 해당 conf 파일은 Job Tracker가 구동중인 서버에서만
확인이 가능 하며,  Hadoop 관리자 보다는 Job (MR, Hive, Pig, Sqoop 등)를 개발하는 사람들에게
유용한 정보 입니다.

Note : Job 실행 환경에 따라서 conf 파일의 사이즈가 클수도 있고, 작을 수도 
있습니다.

5.  Job Statistics

JobTrackerJob 실행시 Configuration 정보 외에 Job에 대한 다양한
통계정보
(task의 시도횟수, 서플링 시간, input split 를 위한 task 시도 횟수, task 실행 시작 시간)를
로깅 합니다.

물론 http://jobtracker:50300 를 통해서도 정보를얻을수 있지만
좀더 자세하고 상세한 정보를 알기 위해서는 통계 로그파일을
볼 필요가 있습니다.

로그 위치는 %HADOOP_LOG_DIR%/history 이며,
로그 파일 포맷은 아래와 같고 확장명은 없습니다.

Note : Job이 정상적으로 완료 되면
%HADOOP_LOG_DIR%/history/done 디렉토리 밑으로 파일을 이동 시킵 니다.

job_<job-id>_<epoch-of-jobtracker-start>_<user-running-hadoop>_<job-name>

이미지 2

job 아이디가 201305081144_0005 이고 job 이름이 wordcount일 경우
job_201305081144_0001_1367987584403_hadoop_wordcount
파일명으로 생성 됩니다.

해당 로그 파일은 순환 버퍼 처럼 기존 데이터를 삭제 하지 않으며,
rolling도 하지 않습니다.

운영을 위해서 정기적으로 파일을 삭제 또는 이동시
Hadoop 시스템에 영향을 미치지는 않습니다.

대신 현재 running 하는 Job에 관련된 파일을 삭제 하지 않도록 주의를 해야 합니다.

Note : Job 실행 환경에 따라서  파일의 사이즈가 클수도 있고, 작을 수도 있습니다.

6. Standard Error

MapReduce 소스에 System.err.println(“some useful information”)  라고
코딩을 할 경우 TaskTracker는 해당 표준에러를 로그 파일에 출력 합니다.

디렉토리 및 파일 생성 규칙은 아래와 같습니다.

%HADOOP_LOG_DIR%/userlogs/<job-id>/attempt_<job-id>_<map-or-reduce>_<attempt-id>/stderr

map-or-reduce 는 만약 map task인 경우는 “m“으로, reduce task인 경우는 “r“로

생성 됩니다.

Note : 사실은 하둡 환경 변수 mapred.local.dir에 정의된 디렉토리이며,
심볼릭 링크로 되어 있습니다. 또한 각 task attempt id는
http://jobtracker:50030 웹 콘솔에서 확인 할 수 있습니다.

예를 들어서  job 아이디가 “job_201305081144_0009” 이고,
attempt 아이디가 “attempt_201305081144_0009_m_000000_0 ” 일경우

%HADOOP_LOG_DIR%/userlogs/job_201305081144_0009/attempt_201305081144_0009_m_000000_0/stderr

같이 파일이 생성이 됩니다.

실제 파일을 열어 보면 소스상에 작성한 메세지가 출력된 것을 확인 할 수 있습니다.

$ cat stderr
some useful information

Note :  mapred.userlog.retain.hours 설정 값에 따라서 파일이 덮어씌우기를 합니다.

7. Standard Out

Standard Error 와  매우 유사한 기능을 하며  System.out.println(“some useful information”)
를 소스상에 코딩을 하면 동일 디렉토리에 /stdout 파일로 출력이 됩니다.

Note :  mapred.userlog.retain.hours 설정 값에 따라서 파일이 덮어씌우기를 합니다.

8. Log4J Message

Standard Error 와  매우 유사한 기능을 하며  LOG.info(“some useful information“)
를 소스상에 코딩을 하면 동일 디렉토리에 /syslog 파일로 출력이 됩니다.

이미지 3

또한 얼마나 많은 레코드 버퍼를 읽고 있는지,
또는 얼마나 많은 리듀스 task가 수행되는지에 대한 정보를 얻을 수 있습니다.

Note :  mapred.userlog.retain.hours 설정 값에 따라서 파일이 덮어씌우기를 합니다.

9. Hadoop Logs Paths

지금 까지 로그 디렉토리 및 파일 정보를 정리 하면 아래와 같습니다.

%HADOOP_LOG_DIR%/*-namenode*.log <== namenode 데몬 로그 파일
%HADOOP_LOG_DIR%/*-secondarynamenode*.log <== secondarynamenode 데몬 로그 파일
%HADOOP_LOG_DIR%/*-jobtracker*.log <== jobtracker 데몬 로그 파일
%HADOOP_LOG_DIR%/*-datanode*.log <== datanode 데몬 로그 파일
%HADOOP_LOG_DIR%/*-tasktracker*.log <== tasktracker데몬 로그 파일

%HADOOP_LOG_DIR%/userlogs/**/stderr <== task 표준 에러 로그
%HADOOP_LOG_DIR%/userlogs/**/stdout <== task 표준 로그
%HADOOP_LOG_DIR%/userlogs/**/syslog <== task log4j 로그


Conclusion

지금까지 Hadoop 로그 파일들에 대해서 알아 봤습니다.  하둡 프로그래밍 (MapReduce, Hive, Pig, Sqoop 등)
을 개발할 때 처음 부터 많은 데이터를 full 분산 모드에 넣고 개발을 하지 말고
개발자 PC 또는 개발 서버에 간단하게 의사분산모드 또는 로컬 모드로 설치하고
10% 내외의 표본 데이터를 넣고 검증 테스트를 진행 한 후 실제 full 분산 모드 환경에
배포 하는 방식으로 가이드를 하고 있습니다.

(full 분산 모드에서 디버깅을 한다면 많은 task 로그들을 남겨서
디버깅이 어렵겠죠…)

어떻게 보면 웹 개발 방식 과 상당히 유사한 방법 입니다.
개발자 pc에서 톰캣으로 테스트를 하고, 실제 운영 환경 서버에
배포하는 것처럼 말입니다.

위에서 언급 한것 처럼 하둡 로그 홈 디렉토리를 기본 제공으로 사용하시지
마시고 HADOOP_LOG_DIR 환경 변수를 활용 해서 관리 및 운영을
용이하게 하는 것도 좋은 전략 입니다.

또한 각 데몬이 로깅하는 로그 파일은 주로 서버 기동/중지시 많은 도움이
될 것입니다. 그 전에 각 클러스터에 데몬들에 대한 역할 분담을
잘 관리 해야 할 것입니다.

맵리듀스 디버깅을 위해서 Reporter의 카운팅 기능을 사용 할수 있지만
표준 에러 출력, 표준 출력, Log4j 메세지를 이용 하면 Job이 러닝 중에
개발자가 원하는 로그를 남길 수 있습니다.

좀더 task들에 대한 자세한 정보를 보고 싶다면 
%HADOOP_CONF_DIR/log4j.properties 파일을 열어서 아래와 같이 
로깅 레벨을 설정 하시면 됩니다. 

log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG

하둡 운영 및 개발시 많은 도움이 되었으면 합니다.

참고 자료

Published by: beyondj2ee

Past SI AA, now I am pikicast developer in yellow mobile and daddy, Java, Spring, OpenSource, Application Architect :) Java Application Architect. mail : beyondj2ee@gmail.com twitter : twitter.com/beyondj2ee facebook : https:www.facebook.com/beyondj2ee blog: http:beyondj2ee.wordpress.com

Categories Architecture댓글 2개

2 thoughts on “Hadoop의 로그파일은 어디에 있는가?”

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중