[데이터 플랫폼 운영 / 개발] - Oozie

Chan hae OH·2023년 8월 12일
0

1. 시작말


안녕하세요.

데이터 엔지니어링 & 운영 업무를 하는 중 알게 된 지식이나 의문점들을 시리즈 형식으로 계속해서 작성해나가며

새로 알게 된 점이나 잘 못 알고 있었던 점을 더욱 기억에 남기기 위해 글을 꾸준히 작성 할려고 합니다.

반드시 글을 읽어 주실 때 잘 못 말하고 있는 부분은 정정 요청 드립니다.

저의 지식에 큰 도움이 됩니다. :)



2. Oozie 란?



Oozie 는 Hadoop 기반의 작업 스케줄러 입니다. 스케줄링을 하는 도구이기 때문에 배치나 순서가 있는 작업들을 처리하기 위해 사용합니다.

아래는 Oozie 에 대한 공식 문서에서의 설명입니다.


" Oozie is a workflow scheduler system to manage Apache Hadoop jobs.

Oozie Workflow jobs are Directed Acyclical Graphs (DAGs) of actions.

Oozie Coordinator jobs are recurrent Oozie Workflow jobs triggered by time (frequency) and data availability.

Oozie is integrated with the rest of the Hadoop stack supporting several types of Hadoop jobs out of the box (such as Java map-reduce, Streaming map-reduce, Pig, Hive, Sqoop and Distcp) as well as system specific jobs (such as Java programs and shell scripts).

Oozie is a scalable, reliable and extensible system. "

Oozie 공식 문서



3. Oozie 구성


Oozie 는 워크플로우 엔진으로 Java servlet-container 로 뜨는 웹 어플리케이션 입니다.

작업 구성은 XML 로 구성이 됩니다.

Oozie 에서는 작업의 종류를 Action 이라고 부르며 다양한 형태의 Action 들을 제공합니다.

  • Email Action
  • Shell Action
  • Hive Action
  • Hive 2 Action
  • Sqoop Action
  • Ssh Action
  • DistCp Action
  • Spark Action
  • Git Action
  • Writing a Custom Action Executor

Oozie 는 DAG(Directed Acyclic Graph) 를 작성하여 작업을 진행합니다. 작업이 동작하게 되면 YARN 에 해당 작업이 MapReduce로 먼저 올라가 작업 순서에 맞게 Action 들을 처리합니다.

Action 마다 작업이 처리되면 Call-back 을 받은 후 다음 작업을 처리할 지 에러로 인식할 지 구분하게 됩니다.



4. Oozie Job 예제


Oozie 는 작업 방법을 XML 로 작성합니다.

저의 경우 주로(처음부터 쓰던 방식이라) Shell Action 을 사용하고 있지만, 필요시에는 다른 Action 을 활용 할 수도 있을 듯 합니다.

<workflow-app name="test" xmlns="uri:oozie:workflow:0.5">
    <start to="test1"/>
    <kill name="Kill">
        <message>작업 실패, 오류 메시지[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <action name="test1">
        <shell xmlns="uri:oozie:shell-action:0.1">
            <job-tracker>resourceManager</job-tracker><!--YARN resourceManager-->
            <name-node>${nameNode}</name-node><!--Hadoop NameNode-->
            <exec>ssh</exec><!--실행할 명령-->
              <argument>id@domain</argument><!--인자1-->
              <argument>spark-submit --master yarn --deploy-mode cluster --queue queueName --py-files hdfs://hadoopcluster/user/user1/my1/assets/spark/my2/src.zip hdfs://hadoopcluster/user/user1/my1/assets/spark/my2/test.py ${param}</argument><!--인자2-->
              <capture-output/>
        </shell>
        <ok to="End"/>
        <error to="Kill"/>
    </action>
    <end name="End"/>
</workflow-app>

참고 : https://oozie.apache.org/docs/5.2.1/DG_ShellActionExtension.html



5. Oozie Job properties 예제


Oozie Job 작성 후 해당 작업의 변수들을 모아두는 Properties 파일을 제출해야 해당 Job 을 실행 시킬 때 가져와 동작 시킬 수 있습니다.

아래는 예제 입니다.

<configuration>
  <property>
    <name>oozie.libpath</name>
    <value>hdfs://clusterName:8020/user/user1/share/lib/</value>
  </property>
  <property>
    <name>oozie.use.system.libpath</name>
    <value>true</value>
  </property>
  <property>
    <name>dryrun</name>
    <value>False</value>
  </property>
  <property>
    <name>security_enabled</name>
    <value>False</value>
  </property>
  <property>
    <name>user.name</name>
    <value>user1</value>
  </property>
  <property>
    <name>mapreduce.job.user.name</name>
    <value>user1</value>
  </property>
  <property>
    <name>mapreduce.job.queuename</name>
    <value>mainQueue</value>
  </property>
  <property>
    <name>master</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mode</name>
    <value>cluster</value>
  </property>
  <property>
    <name>oozie.wf.application.path</name>
    <value>hdfs://clusterName:8020/user/user1/oozie/test</value>
  </property>
  <property>
    <name>queueName</name>
    <value>mainQueue</value>
  </property>
  <property>
    <name>jobTracker</name>
    <value>YarnResourceManagerName</value>
  </property>
  <property>
    <name>wfAppPath</name>
    <value>hdfs://clusterName:8020/user/user1/oozie/test/</value>
  </property>
  <property>
    <name>nameNode</name>
    <value>hdfs://clusterName:8020</value>
  </property>
  <property>
    <name>resourceManager</name>
    <value>resouceManager:8032</value>
  </property>
  <property>
    <name>param</name>
    <value>"{'message' : 'Hello World'}"</value>
  </property>
</configuration>



6. Oozie 동작


Oozie 서버에서 Oozie 명령어를 활용하여 동작시키는 방법도 있습니다.
하지만 저는 Oozie 를 컨트롤 하는 어플리케이션들이나 작업 서버가 모두 Oozie 서버 외부이기 때문에 Rest API 를 활용하여 Oozie를 동작 시킵니다.

curl -X POST -H "Content-Type: application/xml;charset=UTF-8" "oozieServer:port/oozie/v1/jobs?action=start&queue=queueName" -d @job_properties.xml | python3 -m json.tool



7. Oozie Coordinator


Oozie 는 작업을 순서에 맞게 실행시키는 역할도 하지만 정기적인 배치 작업을 수행하는 역할 또한 있습니다.

이 때 사용하는 것이 Coordinator 입니다.

저의 경우는 Hue 에서 GUI 로 Coordinator 를 작성하기 때문에 XML로 컨트롤 해본적은 없습니다.

아래의 공식 문서를 확인하면 실행 방법은 찾아볼 수 있을 듯 합니다.

Coordinator 참고 : https://oozie.apache.org/docs/5.2.1/CoordinatorFunctionalSpec.html



8. 맺음말


모든 작업들이 꼭 그렇지는 않겠지만, 보통의 작업들에는 순서가 있습니다. 또는 정해진 시간에 작업이 실행되어야 합니다.

이를 가능하게 만들어주는 것들을 스케줄러라고 우리는 부릅니다.

Oozie 는 스케줄링을 지원하는 어플리케이션이며, YARN 에 작업을 수행하는 controller 를 띄워서 작업을 처리할 수 있습니다. 많은 작업이 들어왔을 때 Oozie 서버의 자원이 아닌 YARN 의 Resource 를 사용할 수 있기 때문에 상당히 효율적이라고 보입니다.

하지만 XML 작성과 찾기 힘든 예제들 때문에 기피감은 여전한 듯 합니다.

가능하다면 Airflow 로 스케줄러를 테스트 후 교체할 수 있는 방향을 정해보고 싶습니다.



profile
Data Engineer

0개의 댓글