Hadoop 세부 사항 및 로그
- Posted at 2008/07/08 23:59
- Filed under project/lucene_hadoop
Hadoop에서 System.out.println() 또는 LOG.debug() 등이 어디로 저장/출력되는지는 Hadoop의 동작원리를 정확하게 이해하고 있어야만 알 수 있다.
다음 그림은 Hadoop의 동작 내용을 설명한 그림이다. 그림에서 파란색 바탕의 박스는 Node(Server)를 나타내고 초록색 박스는 JVM을 나타낸다.
Client Node에서 사용자는 수행할 Job 프로그램을 수행한다. 이때 Client Node는 JobTracker가 수행중인 Node이거나 TaskTracker가 수행중인 노드이거나, 아니면 Hadoop 클러스터에 참여하지 않는 다른 노드라도 상관없다. 심지어는 Windows라도 상관없다.
Client Node에서는 사용자가 만든 main() 메소드가 있는 일반 자바 클래스를 수행하는 것과 동일하다. 단 Hadoop 관련 클래스, 환경 변수 등이 classpath 에 설정되어야 하는데 bin/hadoop 명령을 이용하는 경우에는 이미 이런 환경 변수가 설정되었기 때문에 bin/hadoop 명령을 이용해서 수행시키는 것이 편리하다. 하지만 사용자가 만든 Job 클래스는 main() 메소드를 가지고 있기 때문에 java MyJob 형태로 수행시키는 것도 가능하다.

사용자가 만든 main() 메소드가 수행되면서 JobClient 클래스의 runJob()을 호출하게 되면 JobClient에서는 다음과 같은 작업을 수행한다.
1. jobConf에 설정된 정보를 이용하여 job.xml을 구성한 다음 HDFS에 저장
2. 사용자의 Job 클래스 또는 Job 클래스가 있는 jar 파일을 job.jar로 묶어 HDFS에 저장
3. InputFormat의 getSplit() 메소드를 호출하여 반환되는 값을 이용하여 job.split 파일을 HDFS에 저장
따라서 main() 메소드와 InputFormat의 getSplit() 또는 validate() 등의 메소드에서 출력하는 메세지는 Client Node의 표준 출력 또는 Client Node에서 설정된 log4j 구성대로 출력된다.
JobClient에 의해 JobTracker의 submitJob()이 호출되면 HDFS의 job.xml, job.split 정보를 이용하여 map/reduce task를 생성한 후 job queue에 추가한다.
TaskTrasker는 주기적으로 JobTracker에 heartbeat() 메세지를 보내는데 이 heartbeat 메세지를 이용하여 JobTracker는 TaskTracker의 상태 정보를 파악한다. heartbeat() 호출의 return 값에 TaskTracker가 수행할 Task의 목록이 전달된다. 따라서 Hadoop는 JboTracker가 직접 TaskTracker에 Task를 할당하는 것이 아니라 queue에 넣어 두면 TaskTracker가 가져가는 방식이다.
TaskTracker는 Task를 받으면 HDFS로 부터 job.jar 파일을 읽어 로컬 디스크에 저장한 다음 Task를 fork한다. 그림에서 보면 UserTask라고 되어 이는 부분이 있는데 이것은 TaskTracker Node에서 수행되지만 TaskTracker와는 별도의 JVM으로 수행된다. 따라서 User Task에서의 println(), LOG.debug() 등은 TaskTracker와는 다른 경로로 출력된다.
UserTask의 경우 main() 메소드를 사용자가 정의해 주지는 않았다. 실제로는 TaskTracker내에 있는 Child 클래스가 main() 메소드를 가지고 있고 TaskTracker는 Client 클래스를 fork 시키면서 표준출력(stdout), 표준에러(stderr), log4j 출력 등을 특정 파일로 리다이렉션 시킨다.
Client 클래스의 main()에는 다음과 절차로 사용자의 Map, Reduce task를 수행시킨다.
1. 사용자가 정의한 InputFormat의 getReader() 메소드를 가져온다.
2. while() 문 내에서 Reader의 next() 메소드를 호출하면서 false를 반환할때 까지 반복한다.
3. next()에서 가져온 값을 이용하여 사용자가 정의한 map() 메소드를 호출한다.
마지막으로 hadoop의 로그 관련 내용을 정리하면 다음과 같다.
1. JobTracker, TaskTracker
JobTracker, TaskTracker가 수행하면서 발생하는 info, warn 등의 로그 정보는 각 노드의 $HADOOP_HOME/logs에 각 서버명별로 파일로 저장된다.
2. 사용자 Job의 main()
사용자 Job의 main() 메소드 내에 있는 System.out, LOG.info()는 job을 수행하는 ClientNode에 나타난다.
3. InputFormat의 getSplit()
job을 수행하는 ClientNode에 나타난다.
4.map(), reduce(), InputFormat.next(), close() 등에서의 출력은 각 Task가 수행되는 TaskTraker노드의 $HADOOP_HOME/logs/userlogs/{TASK_ID}/sdtout, sdterr, syslog 파일에 저장된다.
직접 TaskTracker의 노드에 접속해서 볼수도 있지만 브라우저에서도 확인할 수 있다.
http://jobtracker_hostname:50030에서 특정 job을 선택한 다음 계속 링크를 따라 가면 로그를 볼 수 있다.
Posted by 김형준
- Response
- No Trackback , 3 Comments

pig_hadoopsummit.pdf






