hadop 로그 단순 분석

개술
본 고 는 0.19.1 분석 을 바탕 으로 알 리 바 바 hadop 의 최적화 부분 이 있다.본 고 는 jobtracker 와 nodename 메타 데이터 의 부분 과 관련 되 지 않 습 니 다. 본 고 는 계산 단계 에서 대체적으로 발생 하 는 로그 와 로그 의 문 제 를 다 루 고 있 습 니 다.
일지
모든 데 몬 이 일어 난 후에 (간단하게 보기 위해 서 우 리 는 의사 분포 모드 를 사용 하고 한 기계 로 만 들 었 습 니 다) 대체적인 디 렉 터 리 구 조 는 다음 과 같 습 니 다.
[dragon.caol@hd19-vm1 logs]$ tree
.
|-- hadoop-dragon.caol-datanode-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-datanode-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-jobtracker-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-jobtracker-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-namenode-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-namenode-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-secondarynamenode-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-secondarynamenode-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-tasktracker-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-tasktracker-hd19-vm1.yunti.yh.aliyun.com.out
|-- history
`-- userlogs
    `-- toBeDeleted

3 directories, 10 files
이때 조심 하 세 요.
이 중 로그 설정 은 설정 파일 log4j. properties 에서 설정 되 었 으 나, 일부 설정 항목 은 셸 명령 으로 시 작 될 때 확 정 됩 니 다.
예:
307 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.log.dir=$HADOOP_LOG_DIR"
308 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.log.file=$HADOOP_LOGFILE"
309 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.home.dir=$HADOOP_HOME"
310 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.id.str=$HADOOP_IDENT_STRING"
311 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.root.logger=${HADOOP_ROOT_LOGGER:-INFO,console}"
312 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.root.logger.appender=${HADOOP_ROOT_LOGGER_APPENDER:-console}"
313 HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.root.logger.level=${HADOOP_ROOT_LOGGER_LEVEL:-info}"
시작 후 jobtracker 의 jvm 인 자 는 다음 과 같 습 니 다.
5537 JobTracker -Xmx1000m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote -Xdebug -Xrunjdwp:transport=dt_socket,address=1314,server=y,suspend=n -Dhadoop.log.dir=/home/dragon.caol/hadoop-0.19.1-dc/bin/../logs -Dhadoop.log.file=hadoop-dragon.caol-jobtracker-hd19-vm1.yunti.yh.aliyun.com.log -Dhadoop.home.dir=/home/dragon.caol/hadoop-0.19.1-dc/bin/.. -Dhadoop.id.str=dragon.caol -Dhadoop.root.logger=INFO,RFA -Dhadoop.root.logger.appender=RFA -Dhadoop.root.logger.level=info -Djava.library.path=/home/dragon.caol/hadoop-0.19.1-dc/bin/../lib/native/Linux-amd64-64
이 설정 을 사용 하여 log4j 의 설정 을 공동으로 조립 합 니 다.
간단 한 작업 을 수행 한 후 logs 디 렉 터 리 의 로그 구 조 는 다음 과 같 습 니 다.
[dragon.caol@hd19-vm1 logs]$ tree
.
|-- hadoop-dragon.caol-datanode-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-datanode-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-jobtracker-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-jobtracker-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-namenode-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-namenode-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-secondarynamenode-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-secondarynamenode-hd19-vm1.yunti.yh.aliyun.com.out
|-- hadoop-dragon.caol-tasktracker-hd19-vm1.yunti.yh.aliyun.com.log
|-- hadoop-dragon.caol-tasktracker-hd19-vm1.yunti.yh.aliyun.com.out
|-- history
|   |-- h1_1348474254849_job_201209241610_0001_conf.xml
|   `-- h1_1348474254849_job_201209241610_0001_dragon.caol_word+count
|-- history.idx
|-- job_201209241610_0001_conf.xml
`-- userlogs
    |-- job_201209241610_0001
    |   |-- attempt_201209241610_0001_m_000000_0
    |   |   |-- log.index
    |   |   |-- stderr
    |   |   |-- stdout
    |   |   `-- syslog
    |   |-- attempt_201209241610_0001_m_000001_0
    |   |   |-- log.index
    |   |   |-- stderr
    |   |   |-- stdout
    |   |   `-- syslog
    |   |-- attempt_201209241610_0001_m_000002_0
    |   |   |-- log.index
    |   |   |-- stderr
    |   |   |-- stdout
    |   |   `-- syslog
    |   `-- attempt_201209241610_0001_r_000000_0
    |       |-- log.index
    |       |-- stderr
    |       |-- stdout
    |       `-- syslog
    `-- toBeDeleted

8 directories, 30 files
우 리 는 history, userlogs 에 하위 파일 이 있 고 더 많아 졌 습 니 다. history.idx、job_201209241610_0001_conf. xml 파일.이 파일 들 은 사실 프레임 워 크 가 서로 다른 시기 에 만들어 진 것 이다.어떤 것 은 색인 파일 이 고, 기본적으로 페이지 를 조회 하기 위 한 것 이다.일정 시간 후에 삭 제 됩 니 다.
사용자 로그 userlogs
우리 가 주목 하 는 것 은 userlogs 파일 입 니 다. 그 안에 저 장 된 것 은 대부분 고객 의 코드 이기 때문에 고객 이 코드 에 system. out 을 기록 하면 로그 가 해당 하 는 attempt 에 나타 납 니 다.YYYYMMDDHHMM_000x_(r/m)_000000_x/stdout 파일 에 err 는 * */stderr 에 나타 납 니 다.log 4 j 라면 나타 납 니 다.
해당 syslog 중.
로그 가 왜 위 치 를 정 했 는 지, System. err/out 의 로 그 는 셸 스 크 립 트 가 자바 로 호출 되 었 을 때 표준 입력 흐름 과 표준 출력 흐름 을 파일 로 바 꾸 었 습 니 다.log4j 에 대해 서 는 앞서 말 한 것 을 취한 다.
log4j. properties 와 TaskRunner 가 확정 한, log4j 는 hadop 이 스스로 실현 한 org. apache. hadop. mapred. TaskLogAppender 를 채택 했다.TaskLogAppender 는 여기에서 제한 적 인 일 을 했 습 니 다. mapred. userlog. limit. kb 설정 이 0 이상 이면 tail - c 모드 를 취 했 습 니 다. 즉, FIFO 를 사용 하여 나 가서 직접 버 립 니 다. task 가 끝 날 때 대기 열 로 그 는 모두 flush 를 디스크 에 저장 합 니 다.
현재 System. out/err 에 대해 제한 이 없습니다. 저 는 제한 방안 을 채택 합 니 다. 코드 는 다음 과 같 습 니 다. 기본 적 인 사 고 는 다음 과 같 습 니 다. LimitOutputSteam 은 System. out/err 를 다시 장식 하여 크기 를 제한 하고 초과 하면 이상 을 던 집 니 다. 이렇게 하면 사용자 측 이 감지 합 니 다.사실 시스템. out/err 를 사용 하여 로 그 를 인쇄 하 는 것 을 권장 하지 않 습 니 다.
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * limit writing data. if writing data size has reached limit,system writes log
 * message and throws IOException
 * 
 * @author dragon.caol
 * @date 2012-09-21
 * 
 */
public class LimitOutputSteam extends FilterOutputStream {
  private long remaining;
  private String msg;
  private boolean limit = Boolean.FALSE;
  private boolean isRestriction = Boolean.FALSE;

  public LimitOutputSteam(OutputStream out, long maxSize) {
    super(out);
    if (maxSize > 0) {
      this.isRestriction = Boolean.TRUE;
      this.remaining = maxSize;
      this.msg = "
Exception:Written to stdout or stderr cann't exceed " + ((float) maxSize / 1024) + "kb.
"; } } public void write(int b) throws IOException { if (isRestriction) { if (!limit) { if (remaining-- > 0) { super.write(b); } else { for (int i = 0; i < msg.length(); i++) { super.write(msg.getBytes()[i]); } this.limit = Boolean.TRUE; throw new LimitOutputSteamException(msg); } } } else { super.write(b); } } }

3. HDFS 의 JobHistroy 로그
두 부분 으로 나 뉘 는데, 한 부분 은 jobclient 가 제출 한 job. xml 를 저장 하고, 일 부 는 실행 과정 중의 데 이 터 를 저장 합 니 다. 이 로 그 는 나중에 전체 job 가 실행 되 는 과정 을 되 돌아 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기