Hive 쿼리를 던지면 콘솔에 dag_1698...._0001_1 같은 DAG ID 만 찍히고 끝난다. yarn logs 는 애플리케이션 ID 를 받는데 손에 있는 것은 DAG ID 뿐이라 로그를 어디서 봐야 할지 막힌다.
식별자는 세 층으로 겹쳐 있다. 이 관계를 알면 어느 하나만 있어도 나머지를 끌어낼 수 있다.
| 식별자 | 예 | 발급 주체 |
|---|---|---|
| YARN 애플리케이션 ID | application_1698650000000_0123 |
ResourceManager |
| Tez DAG ID | dag_1698650000000_0123_1 |
Tez AM |
| Hive 쿼리 ID | hive_20231027094702_ab12cd34-... |
HiveServer2 |
DAG ID 의 가운데 두 토막이 그대로 애플리케이션 ID 다. dag_1698650000000_0123_1 이면 애플리케이션은 application_1698650000000_0123 이고, 끝의 _1 은 그 AM 안에서 몇 번째 DAG 인지를 가리킨다. Tez AM 하나가 세션을 재사용하며 여러 DAG 을 돌리므로 한 애플리케이션에 DAG 이 여럿 붙는다.
따라서 변환은 문자열 치환으로 끝난다.
# dag_1698650000000_0123_1 -> application_1698650000000_0123
yarn logs -applicationId application_1698650000000_0123 > dag.log
세션을 재사용한 AM 의 로그에는 다른 쿼리의 DAG 도 섞여 있다. DAG ID 로 걸러 읽는다.
yarn logs -applicationId application_1698650000000_0123 \
| grep -n 'dag_1698650000000_0123_1'
컨테이너 단위로 좁히려면 -containerId 나 -log_files 를 쓴다. 전체를 받으면 수백 MB 가 되기도 한다.
yarn logs -applicationId application_1698650000000_0123 -log_files syslog_dag_1698650000000_0123_1
yarn logs -applicationId application_1698650000000_0123 -show_application_log_info
HiveServer2 로그에는 쿼리 ID 와 그 쿼리가 제출한 애플리케이션 ID 가 함께 찍힌다. 쿼리 ID 만 알고 있다면 HiveServer2 로그를 먼저 건다.
grep -l 'hive_20231027094702_ab12cd34' /var/log/hive/hadoop-cmf-*-HIVESERVER2-*.log.out
grep -A5 'hive_20231027094702_ab12cd34' /var/log/hive/hiveserver2.log | grep -i 'application_'
Beeline 세션 안에서 지금 쿼리의 ID 를 직접 볼 수도 있다.
SET hive.query.id;
Tez UI 가 켜져 있으면 DAG ID 를 그대로 검색해 vertex 별 실패 지점을 볼 수 있다. Tez UI 는 YARN Timeline Server 에 쌓인 이벤트를 읽으므로, Timeline Server 가 죽어 있으면 화면이 비어 보인다.
Cloudera Manager 환경에서는 Hive on Tez 서비스의 쿼리 목록에서 쿼리 ID · DAG ID · 애플리케이션 ID 가 한 줄에 같이 나온다. 여기서 애플리케이션 ID 를 복사하는 것이 가장 빠르다.
yarn logs 는 로그 집계를 전제로 한다. yarn.log-aggregation-enable 이 꺼져 있으면 실행이 끝난 뒤 로그를 모으지 않으므로, 각 NodeManager 의 로컬 디렉터리를 직접 봐야 한다.
yarn node -list
ls /var/log/hadoop-yarn/container/application_1698650000000_0123/
애플리케이션이 아직 돌고 있다면 로컬에 있고, 끝났는데 집계가 꺼져 있으면 보존 기간이 지나는 대로 사라진다.
_1, _2 같은 꼬리표는 재시도 횟수가 아니라 그 AM 안에서의 DAG 순번이다. AM 재시도 횟수는 애플리케이션 ID 뒤에 붙는 attempt ID 로 따로 표기된다.
OTHER_VERTEX_FAILURE 는 결과이지 원인이 아니다. 같은 DAG 안에서 가장 먼저 실패한 vertex 를 찾아 그 쪽 태스크 로그를 읽어야 한다.
yarn application · yarn logs 사용법과 종료 코드 해석.