Big Data/Apache Oozie

예제로 알아보는 Oozie Coordinator - 2

Data Engineer 2017. 10. 14. 12:44

예제로 알아보는 Oozie Coordinator - 2

이번 포스트에서는 예제를 통해서 data availability 기반의 스케줄링이 가능한 우지 코디네이터 사용법에 대해 알아보겠습니다. time interval 기반의 우지 코디네이터의 사용법이 궁금하신분들은 이전 포스트를 참고하시기 바랍니다.
Oozie를 통하여 workflow를 동작시킬 때의 조건으로 특정 데이터 셋의 준비가 되는 경우에 워크플로우가 실행되도록 하고 싶은 경우가 있습니다. 이때 사용할 수 있는 방법이 바로 data availability 혹은 data trigger 기반의 코디네이터입니다.
동작 원리는 간단합니다. 코디네이터에서 frequency 마다 지정된 위치의 데이터 셋이 존재하는지 확인합니다. 확인 후 데이터가 없으면 지정된 timeout 시간까지 기다렸다가 timeout까지 존재하지 않으면 워크플로우를 종료합니다. 그러면 바로 예제를 통해서 알아보도록 하겠습니다.

<coordinator-app name="hourly-aggregation" frequency="${coord:days(1)}"
start="2017-10-09T09:00+0900" end="2017-10-10T10:00+0900" timezone="Asia/Seoul"
xmlns="uri:oozie:coordinator:0.1">
  <dataset name="logs" frequency="${coord:days(1)}"
           initial-instance="2017-10-07T06:15Z" timezone="Asia/Seoul">
    <uri-template>
      hdfs://namenode/app/logs/${YEAR}${MONTH}/${DAY}
    </uri-template>
    <done-flag>_DONE</done-flag>
  </dataset>
  <input-events>
    <data-in name="input" dataset="logs">
      <instance>${coord:current(-1)}</instance>
    </data-in>
  </input-events>
  <action>
    <workflow>
       <app-path>hdfs://namenode/app/workflows/hourly-aggregation
       </app-path>
    </workflow>
  </action>
</coordinator-app>

한국 시간으로 오전 9시에 하루전의 시간별 데이터를 집계를 하는데 데이터 셋이 생성되는 경우에만 워크플로우를 실행시키는 예제입니다. 이제 예제를 분해해서 살펴보도록 하겠습니다.

<coordinator-app name="hourly-aggregation" frequency="${coord:days(1)}"
start="2017-10-09T09:00+0900" end="2017-10-10T10:00+0900" timezone="Asia/Seoul"
xmlns="uri:oozie:coordinator:0.1">
...
</coordinator-app>

코디네이터 설정입니다. 앞선 포스트에 위의 설정이 자세히 나와있으므로 간단하게만 설명하겠습니다. 코디네이터는 한국 시간으로 2017년 10월 9일 9시에 시작합니다. 주기는 하루에 한번씩 실행됩니다.

<dataset name="logs" frequency="${coord:days(1)}"
         initial-instance="2017-10-07T06:15Z" timezone="Asia/Seoul">
  <uri-template>
    hdfs://namenode/app/logs/${YEAR}${MONTH}/${DAY}
  </uri-template>
  <done-flag>_DONE</done-flag>
</dataset>

다음으로 dataset 부분입니다. dataset 필드는 워크플로우가 실행되기 전에 확인하는 데이터 셋입니다. 데이터셋의 frequency는 데이터셋이 생성되는 비율을 분으로 나타낸 것입니다. 위의 예제 데이터는 하루에 한번씩 생성되는 사실을 알 수 있습니다. 그래서 프리퀀시를 통해 과거의 데이터 셋의 인스턴스 개수를 알 수 있습니다.
initial-instance의 경우 데이터 셋의 가장 첫번째 인스턴스를 언제부터 사용할 것인지 지정해주는 것입니다. initial-instance 이전에 생성된 데이터 셋은 무시하게 됩니다.
그리고 uri-template을 통해서 데이터 셋이 HDFS의 어디에 위치하게 되는지 알려줍니다. URI 템플릿에 사용되는 YEAR, MONTH, DAY 변수는 우지가 자동으로 변환을 해주는데 이 시간의 기준은 우지가 수행되는 시간에 기초해서 변환됩니다. 여기서는 coordinator의 시작 시간에 맞춰서 2017, 10, 09로 변환이 될 것입니다. URI에서 사용될 수 있는 변수는 Oozie 사용자 문서에 더 자세히 나와있습니다.
done-flag 필드를 통해서 코디네이터가 해당 데이터 셋이 처리될 준비가 되었는지를 알려줍니다. 여기서는 데이터 셋이 위치한 디렉토리 내에 _DONE이라는 파일이 존재하는 경우 데이터가 사용가능한 상태가 되겠습니다.

<input-events>
  <data-in name="input" dataset="logs">
    <instance>${coord:current(-1)}</instance>
  </data-in>
</input-events>

input-events 필드에서는 워크플로우를 실행하기 위해 필요한 인풋을 정의해줍니다. 여기서는 logs란 이름을 가진 dataset에서 하루 전 데이터 셋이 생성되면 워크플로우를 실행합니다. 이 예제에서는 첫번째로 실행되는 데이터는 app/logs/201710/08 데이터가 되겠습니다. 즉 코디네이터가 2017년 10월 9일 9시에 실행을 하면서 app/logs/201710/08 안에 _DONE 파일이 존재하는 경우 해당 워크플로우는 app/logs/201710/08의 데이터를 기준으로 실행된다는 뜻이죠.

코디네이터 control 설정

앞서 설명 드린바와 같이 dataset에 대한 timeout 설정에 맞춰서 데이터가 생성되는 것을 기다리거나 워크플로우를 종료시킨다고 하였습니다. 여기서는 위 예제에서는 timeout을 지정하지 않았기 때문에 데이터 셋의 인스턴스를 사용할 수 없는 경우 우지 서버에서 데이터 셋의 인스턴스가 사용가능해질 때까지 워크플로우에서 무한정 대기합니다. 즉 timeout이 기본 값인 -1이기 때문입니다. 이러한 설정들을 통해서 코디네이터의 작업의 동시 실행, 스로틀링, 수행 스케줄링을 어떻게 할 것인지를 직접 지정해줄 수 있습니다. 코디네이터에서 이러한 컨트롤 설정을 어떻게 하는지 예제를 통해 알아보도록 하겠습니다.

<coordinator-app ...>
  <controls>
    <timeout>1440</timeout>
    <execution>FIFO</execution>
    <concurrency>5</concurrency>
    <throttle>5</throttle>
  </controls>
  <dataset ....>
.
.
</coordinator-app>
  • timeout : 데이터 셋을 언제까지 기다릴 것인지에 대한 설정입니다. 여기서는 1440을 지정하였는데 하루동안 기다린다는 의미가 되겠습니다. timeout이 0인 경우 기다리지 않고 바로 워크플로우를 종료합니다.
  • execution : 코디네이터에서 작업 인스턴스가 두개 이상 대기 중인 실행 순서를 어떻게 해줄지 지정해줄 수 있습니다. execution의 기본 설정은 FIFO(순서대로 실행)이고, FIFO 외에 LIFO(가장 나중에 들어온 것부터 실행), LAST_ONLY(마지막 작업만 실행하고 나머지 작업은 실행하지 않음)로 지정할 수 있습니다.
  • concurrency : 이 설정은 동시에 실행시키는 작업의 수를 의미합니다. 기본 설정은 1입니다.
  • throttle : 이설정은 특정 시점에 실행 대기 중인 작업의 수입니다. 기본 설정은 1입니다.

이런 다양한 설정들을 통해서 사용자가 원하는 작업의 스케줄링을 실행할 수 있습니다. 다양한 기능들을 우지에선 제공하고 있습니다. 이외에 다양한 방법으로 활용을 할 수 있습니다. 더 세밀한 방식으로 데이터 트리거 기반으로 코디네이터를 작성하고 싶은 분들은 우지 사용자 문서를 참고 하시기 바랍니다.

references


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

예제로 알아보는 Oozie Coordinator - 1  (0) 2017.10.09
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