Big Data/Apache Oozie

예제로 알아보는 Oozie Coordinator - 1

Data Engineer 2017. 10. 9. 11:17

예제로 알아보는 Oozie Coordinator - 1

이전 포스트에서 우리는 다양한 workflow 패턴에 대해 알아보았습니다. workflow는 여러 액션들을 정의하고 액션들에 실행 관계를 포함해서 실행할 수 있습니다. 그러나 우리는 workflow가 특정 시간에 주기적으로 혹은 데이터가 존재하면 실행하길 원합니다. 이러한 요구사항을 수용해서 Oozie에서는 workflow를 스케줄할 수 있는 Coordinator 기능을 제공합니다. 이러한 스케줄링 기능을 통해 강력한 Orchestration 기능을 제공합니다. Oozie는 기본적으로 time interval 기반의 스케줄링과 data availability 기반의 스케줄링을 제공합니다. 또한 외부 이벤트에 의해서도 실행될 수 있습니다.

Oozie에서 Coordinator는 coordinator.xml이라는 xml 포맷으로 정의된 파일을 Oozie 서버로 전달하여 실행됩니다. 기본적으로 우지 서버는 UTC 시간대로 작동하지만 사용자는 자신의 시간대에 맞춰서 사용할 수 있습니다. 즉, 다양한 시간대와 DST를 지원합니다.

이번 포스트에서는 예제를 통해 Oozie가 어떠한 방식으로 스케줄링 기능을 제공하는지 알아보도록 하겠습니다.

Time interval scheduling

<coordinator-app name="hourly-aggregation" frequency="${coord:minutes(60)}" start="2017-10-09T08:00+0900" end="2017-10-10T08:00+0900" xmlns="uri:oozie:coordinator:0.4"> <action> <workflow> <app-path>hdfs://nameservice1/app/workflows/hourly-aggregation </app-path> </workflow> </action> </coordinator-app>

바로 예제를 통해 알아보도록 하겠습니다. Time interval 혹은 frequency scheduling은 가장 단순한 coordinator 유형입니다. 위 예제는 시간별로 집계를 위해서 60분마다 워크플로우를 실행합니다. 그러면 한번 예제를 하나씩 살펴 보도록 하겠습니다.
코디네이터 설정 부분을 한번 살펴볼까요?

<coordinator-app name="hourly-aggregation" frequency="${coord:minutes(60)"
start="2017-10-09T08:00+0900" end="2017-10-10T08:00+0900"
xmlns="uri:oozie:coordinator:0.4">
  ...
</coordinator-app>

코디네이터의 이름은 hourly-aggregation입니다. 그리고 실행 주기는 ${coord:minutes(60)와 같이 정의되어 있습니다. 실행주기에 처음 보는 코드가 들어가있군요. 하지만 충분히 추측할 수 있습니다. '60분마다 실행해라'라는 의미란걸 말이죠. 위와 같이 Expression Language(EL)로 정의를 할 수 있습니다. Oozie에서는 JSP Expression Language로 다양한 기능을 제공하고 있습니다. 주로 코디네이터에서는 ${coord:함수}로 제공합니다. 자세한 사항은 Oozie 문서에서 Coordinator 부분을 참고하시기 바랍니다.
그 다음으로 정의되어 있는 것이 start(시작 시간)과 end(종료 시간)입니다. 이 부분에는 시간 정보를 넣게되어 있는데 시간의 마지막에 +0900을 붙인 이유는 한국 시간을 반영하기 위해서입니다. Oozie는 UTC기준으로 동작을 하는데 사용자 입장에서 보기엔 헷깔릴 수 있기 때문에 위와 같이 정의 하였습니다. +0900은 GMT+0900을 나타내는 것으로 한국 시간을 시간을 나타내죠. (참고: GMT와 UTC는 같은 시간입니다.)
Oozie에서는 coordinator-app을 정의할 때 timezone을 설정할 수 있습니다.

<coordinator-app name="hourly-aggregation" frequency="${coord:minutes(60)"
start="2017-10-08T00:00Z" end="2017-10-10T00:00Z" timezone="Asia/Seoul"
xmlns="uri:oozie:coordinator:0.4">
...
</coordinator-app>

바로 위의 예제와 같이 정의를 할 수 있습니다. 위 코디네이터는 2017년 10월 8일 KST(대한민국 표준시) 오전 9시(UTC로는 오전 12시)에 시작하게 됩니다.
마지막에 Z 접미사를 붙인 것은 바로 timestamp가 UTC(세계협정시) 기준임을 나타내는 기호입니다. 그리고 이어서 timezone을 정의하고 있습니다. timezone은 다양한 형태로 정의될 수 있습니다. 위 예제에서는 timezone을 Asia/Seoul로 정의하였습니다. 서울의 타임존은 KST(Korea Standard Time)를 사용합니다. UTC와의 차이는 +09:00입니다. 9시간의 시차를 나타내는 것이죠. timezone을 Asia/Seoul로 나타내면 UTC+09:00을 나타내게 됩니다. timezone과 관련된 더 자세한 사항은 Timezone wiki를 보시기 바랍니다.

다시 원래 예제를 살펴보도록 하겠습니다.

<coordinator-app name="hourly-aggregation" frequency="${coord:minutes(60)"
start="2017-10-09T08:00+0900" end="2017-10-10T08:00+0900"
xmlns="uri:oozie:coordinator:0.4">
  ...
</coordinator-app>

그래서 위의 coordinator job의 첫번째 워크플로우 인스턴스는 2017년 10월 9일 오전 9시(KST)에 실행하고 마지막 인스턴스는 2017년 10월 10일 오전 7시(KST)에 실행합니다. 종료 시간(위의 예제에서는 2017년 10월 10일 오전 8시)에는 인스턴스를 실행하지 않습니다.
우지에서는 frequency를 cron 문법으로도 정의할 수 있도록 해줍니다.

이번 포스트에서는 Oozie coordinator의 기본 형태중의 하나인 Time interval 기반의 코디네이터 예제를 살펴보았습니다. 다음 포스트에서는 이어서 data 기반의 스케줄링에 대해 알아보도록 하겠습니다.

references


'Big Data > Apache Oozie' 카테고리의 다른 글

예제로 알아보는 Oozie Coordinator - 2  (0) 2017.10.14
Oozie classpath 정의하기  (0) 2017.10.06
Oozie workflow 파라미터  (0) 2017.10.03
Oozie workflow pattern - 3  (0) 2017.10.03
Oozie workflow pattern - 2  (0) 2017.09.28