본문 바로가기
Oozie

EL 함수를 활용한 일자 동적 변환

by heed159 2022. 6. 8.

배경

ETL을 수행하던 중 일부 시스템 연계 방안 고도화를 진행할 예정이다. 기존 시스템은 crontab으로 DA 적재 배치를 수행하였는데 이를 oozie를 사용하는 것으로 변경하려고 한다. 우지는 각각의 job들의 시작과 종결, 그 사이의 각종 분기 조건 등을 지정해 자동화하거나 스케줄링하도록 도와주는 빅데이터 솔루션이다.

 

EL 함수란

우지를 통해 작업흐름을 관리하는 방법으로서 워크플로우 job을 수행할 때 여러 가지 파라미터를 사용할 수 있다. 여기에는 wf job 속성의 정의하는 것(workflow job properties)과 표현 언어(expression language)를 이용하는 두 가지 방식이 존재하는데 그중 표현 언어(EL) 함수를 사용한 예를 살펴보려고 한다.

 

기존 처리 과정은 HIVE JOB을 수행한 후 해당 JOB이 정상적으로 실행되었는지 확인하기 위해 데이터베이스에 로그를 적재하는 방식이었다. 기존엔 python 코드 내에서 날짜를 생성해 job이 수행된 날짜를 적재하였는데 이러한 처리 방식을 코디네이터에서 워크플로우로 넘겨주는 프로퍼티 중에서 일자를 동적으로 변환시켜주는 함수를 사용하는 것으로 변경하였다.

 

일자를 동적으로 변환시켜주는 함수는 아래와 같다.

  • coord:dateOffset(String baseDate, int instance, String timeUnit) : 주어진 timeUnit과 instance 만큼의 시간을 변경
  • coord:dateTzOffset(String baseDate, String timezone) : 주어진 timezone 값의 시간으로 변경
  • coord:formatTime(String ts, String format) : 주어진 format으로 변경

 

이외에도 많은 함수들이 존재하지만 내가 필요한 건 yyyyMMdd 형식의 날짜 포맷이었다. 따라서 우지 스케줄러를 생성할 때 Parameter를 지정해 현재 날짜를 가져올 수 있게 하였다.

 

${coord:formatTime(coord:nominalTime(), 'yyyyMMdd')}

 

oozie 스케줄은 UTC 기준이기 때문에 한국시간보다 9시간 전으로 설정해주어야 하며 동적으로 받아오는 날짜는 빈도 설정에 설정된 날짜 기준이다.

예를 들어 스케줄을 지정한 날짜가 2022-06-01 ~ 2022-06-10이라고 가정할 때 today는 2022-06-01부터 시작되는 것을 유의하자.

 

스케줄러에서 생성한 파라미터는 아래와 같이 job에서 사용할 수 있게 된다. 처음에 스케줄러에서 파라미터를 생성하려고 하는데 파라미터가 저장이 되지 않았었다. 알고 보니 job에서 먼저 파라미터를 기재해주고 난 이후 스케줄러에서 파라미터를 생성해주어야 정상적으로 사용이 가능하였다.

 

 

이로써 기존 파이썬에서 날짜를 생성하는 것보다 실제 job이 실행한 시간을 우지에서 동적으로 받아와 처리하는 것이 가능해졌다.