Impala 의 TIMESTAMP 는 타임존 정보를 담지 않는다. 저장된 값은 그대로이고, 해석은 세션과 서버 설정이 정한다. 기본 세션 타임존은 코디네이터 호스트의 OS 타임존이다.
SELECT now();
SELECT from_utc_timestamp(now(), 'Asia/Seoul');
질의 옵션으로 세션 타임존을 지정한다.
SET TIMEZONE='Asia/Seoul';
SELECT now();
이 옵션은 비교적 최근에 추가된 것이라 오래된 배포판에서는 없을 수 있다. 사용하는 버전에서 동작하는지 먼저 확인한다.
impalad 에 거는 플래그 중 타임스탬프 해석에 영향을 주는 것은 두 가지다. Cloudera Manager 에서는 Impala Daemon 의 안전 밸브(Advanced Configuration Snippet)에 넣는다.
| 플래그 | 효과 |
|---|---|
--use_local_tz_for_unix_timestamp_conversions=true |
unix_timestamp() · from_unixtime() 을 UTC 가 아니라 로컬 타임존 기준으로 해석 |
--convert_legacy_hive_parquet_utc_timestamps=true |
Hive 가 UTC 로 기록한 Parquet 타임스탬프를 읽을 때 로컬 타임존으로 변환 |
두 번째 플래그는 Hive 와 Impala 가 같은 Parquet 테이블을 읽을 때 값이 9시간 어긋나는 문제를 해결한다. 켜면 변환 비용이 붙어 스캔이 느려지므로, 문제가 실제로 나타나는 환경에서만 켠다.
클러스터 전체를 특정 타임존으로 운영하려면 호스트의 OS 타임존을 맞추는 것이 가장 단순하다. 노드마다 다르면 코디네이터가 누구냐에 따라 결과가 달라지는 사고가 난다.
timedatectl set-timezone Asia/Seoul
Hue 는 조회 결과를 브라우저 타임존 기준으로 표시하는 화면이 있고, 엔진이 돌려준 값을 그대로 보여 주는 화면이 있다. Hue 에서 본 값과 impala-shell 에서 본 값이 다르면 표시 계층의 변환을 의심한다. 기준을 맞추려면 impala-shell 결과를 기준으로 삼는다.
저장은 UTC 로 통일하고 표시 단계에서만 변환하는 방식이 가장 사고가 적다. 혼재된 환경이라면 컬럼 이름에 기준을 남긴다(created_at_utc 처럼).