Oozie 사용
    • PDF

    Oozie 사용

    • PDF

    Article Summary

    VPC 환경에서 이용 가능합니다.

    Oozie는 Apache Hadoop의 맵리듀스(MapReduce) 작업 흐름을 관리해주는 워크플로 스케줄러 시스템입니다. 잦은 맵리듀스 작업을 관리할 수 있고 주기적인 작업을 편리하게 수행할 수 있도록 도와줍니다. 이 가이드에서는 Oozie를 사용하여 워크플로를 작성하는 예제를 설명합니다.

    참고

    Oozie에 대한 상세한 설명은 Oozie 공식문서를 참조해 주십시오.

    Oozie CLI

    Oozie CLI는 Apache Oozie에서 제공하는 클라이언트입니다. Oozie CLI는 일부 기능에 대한 커스터마이징이 적용된 클라이언트로서, 작업 제출 후 바로 반환되어 작업 종료를 기다리지 않습니다.

    항목Oozie CLI
    실행 스크립트명/bin/oozie
    지원하는 옵션job, jobs, admin, validate..등 여러 옵션 가능
    명령어oozie job <OPTIONS> 형태의 명령 사용
    job operationrun, rerun, submit, suspend 등 operation이 가능

    워크플로

    워크플로는 XML 기반의 hPDL (hadoop Process Definition Language)로 정의합니다. 워크플로 정의는 흐름 제어 노드와 액션 노드로 구성된 DAG (Direct Acyclic Graph)이므로 유향 순환 그래프를 제공하지 않습니다.

    워크플로는 흐름 제어 노드와 액션 노드를 포함합니다.

    • 흐름 제어 노드: 워크플로의 시작과 끝을 정의(start, end, fail 노드)하고, 워크플로 실행 방향(decision, for, join 노드)을 제어하는 방법을 제공합니다. 워크플로는 ${inputDir} 와 같이 매개 변수를 사용할 수 있으며, 작업 제출 시 워크플로의 매개 변수 값을 job properties 파일로 작성해서 제공해야 합니다.
    • 액션 노드: 워크플로가 계산과 처리 태스크의 실행을 시작할 수 있게 해주며, Hadoop 맵리듀스, 파일 시스템, SSH, E-Mail, 서브-워크플로와 같은 다양한 액션을 제공합니다.

    워크플로 작성

    워크플로는 workflow.xml 에 작성합니다.

    워크플로로 정의한 DAG은 다음과 같이 동작합니다. 다음 그림을 참고하여 워크플로를 정의해 주십시오.

    df-eco-oozie_01_vpc_ko

    흐름 제어 노드로 start, end, kill 노드의 이름을 명시해 주십시오.

    # [ACTION-NODE-NAME], [NEXT-NODE-NAME], [END-NODE-NAME], [ERROR-NODE-NAME] 을 원하는 작업에 맞게 명시.
    
    <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
      <start to="[ACTION-NODE-NAME]"/>
    
      <action name="[ACTION-NODE-NAME]">
        ...
        <ok to="[END-NODE-NAME]">
        <error to="[ERROR-NODE-NAME]">
      </action>
    
      ...
    
      <kill name="[ERROR-NODE-NAME]">
        <message>[MESSAGE-TO-LOG]</message>
      </kill>
    
      <end name="[END-NODE-NAME]"/>
    </workflow-app>
    
    • start 노드
      워크플로가 실행될 때, 제일 처음에 시작되는 액션을 명시합니다. 액션은 정의된 순서가 아닌 start 노드에 명시된 순서로 실행됩니다. 액션 노드 작성 방법은 액션 노드 작성을 참조해 주십시오.
    • ok 노드
      액션의 이름을 명시하고 액션 수행이 정상적으로 종료된 경우 수행할 노드를 명시합니다. 위 예시에서는 [END-NODE-NAME] 라고 표시되었으나, 두 번째로 수행될 액션 노드 이름을 명시하는 것도 가능합니다.
    • error 노드
      액션 수행이 비정상적으로 종료된 경우 수행할 노드를 명시합니다. ok 노드와 마찬가지로 kill 노드 또는 다음에 수행할 액션 노드를 작성합니다.
    • kill 노드
      워크플로 작업을 스스로 종료시킬 수 있습니다. 작업은 에러로 종료됩니다(KILLED). message의 내용은 워크플로 작업의 종료 원인 로그로 남게 됩니다.
    • end 노드
      워크플로 작업의 끝으로, 작업을 성공적으로 완료한 것을 의미합니다(SUCCEEDED).
    참고

    설명된 노드 이외의 흐름 제어 노드에 대한 자세한 설명은 decisionfork and join를 참조해 주십시오.

    액션 노드 작성

    액션 노드를 정의해 주십시오.
    맵리듀스 액션 예시는 다음과 같습니다.

      <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
      ...
        <action name="[ACTION-NODE-NAME]">
            <map-reduce>
                <job-tracker>[ResourceManagerHostAddress:Port]</job-tracker>
                <name-node>[NameNodeHostAddress:Port]</name-node>
    
                <prepare>
                  <delete path="[OUTPUT_DIR]"/>
                </prepare>
    
                <!-- 스트리밍인 경우에만 streaming 정의를 넣어 줍니다. -->
                <streaming>
                  <mapper>[MAPPER]</mapper>
                  <reducer>[REDUCER]</reducer>
                </streaming>
    
                <configuration>
                    <property>
                        <name>mapred.mapper.new-api</name>
                        <value>true</value>
                    </property>
                    <property>
                        <name>mapred.reducer.new-api</name>
                        <value>true</value>
                    </property>
                    <property>
                        <name>[PROPERTY-NAME]</name>
                        <value>[PROPERTY-VALUE]</value>
                    </property>
                    ...
                </configuration>
                ...
                <!-- Distributed Cache를 사용하는 경우 -->
                <!-- 상대 경로인 경우, job properties의 application path를 기준으로 함 -->
                <file>[FILE-PATH]</file>
                <archive>[FILE-PATH]</archive>
                ...
            </map-reduce>
            <ok to="[END-NODE-NAME]"/>
            <error to="[ERROR-NODE-NAME]"/>
        </action>
        ...
        </workflow-app>
    

    맵리듀스(MapReduce) version2 (이하 MRv2)에서 각 액션 노드를 정의하는 방법은 다음과 같습니다.

    • job-tracker
      MRv2에서 ResourceManager의 주소로 지정합니다. ResourceManagerHostAddress:Port와 같이 작성합니다. Data Forest는 ResourceManager에 ID를 부여해서 사용하고 있으므로 rm1, rm2 중 하나를 사용합니다.
    • name-node
      NameNode 주소를 작성합니다. Data Forest는 두 개의 HDFS 네임스페이스를 제공하므로 hdfs://koya 또는 hdfs://tata 중 사용할 네임스페이스를 지정합니다.
    • prepare
      작업이 시작하기 전에 수행되는 작업을 작성합니다. 출력 디렉터리 삭제와 같은 작업을 작성합니다.
    • configuration
      작업에 대한 설정은 configuration 이후에 작성합니다. MRv2의 경우 mapred.[mapper|reducer].new-apitrue로 설정해야 합니다. 이외 작업에 필요한 설정을 모두 작성합니다.
    • file / archive
      Distributed Cache로 파일 배포를 하는 경우, file이나 archive 정의를 추가합니다.
    참고

    워크플로의 설정 내용은 ${NAME}과 같이 매개 변수로 정의할 수 있습니다. 작업 수행마다 설정 내용을 바꿔야 하는 경우, 매개 변수로 정의하면 워크플로의 수정 없이 여러 환경에서 작업 수행이 가능합니다.

    워크플로 예제

    흐름 제어 노드와 액션 노드를 정의한 후, Java와 Python으로 작성된 wordcount 프로그램을 워크플로로 작성해 주십시오.

    Java를 이용한 맵리듀스 예제

    <workflow-app name="WordCountWithJava" xmlns="uri:oozie:workflow:0.5">
    <start to="wordcount"/>
    <action name="wordcount">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${outputDir}" />
            </prepare>
            <configuration>
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapreduce.job.queuename</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>mapreduce.input.fileinputformat.inputdir</name>
                    <value>${inputDir}</value>
                </property>
                <property>
                    <name>mapreduce.output.fileoutputformat.outputdir</name>
                    <value>${outputDir}</value>
                </property>
                <property>
                    <name>mapreduce.job.reduces</name>
                    <value>${reduceNum}</value>
                </property>
                <property>
                    <name>mapreduce.task.timeout</name>
                    <value>0</value>
                </property>
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>
                <property>
                    <name>mapreduce.job.inputformat.class</name>
                    <value>org.apache.hadoop.mapreduce.lib.input.TextInputFormat</value>
                </property>
                <property>
                    <name>mapreduce.job.outputformat.class</name>
                    <value>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</value>
                </property>
            </configuration>
        </map-reduce>
        <ok to="end"/>
        <error to="fail"/>
    </action> <!--}}}-->
    
    <kill name="fail">
        <message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
    </workflow-app>
    

    스트리밍을 이용한 맵리듀스 예제

    <workflow-app name="WordCountStreaming" xmlns="uri:oozie:workflow:0.5">
        <start to="wordcount"/>
        <action name="wordcount">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${outputDir}" />
            </prepare>
            <streaming>
                    <mapper>python mapper.py</mapper>
                    <reducer>python reducer.py</reducer>
            </streaming>
            <configuration>
                <property>
                    <name>mapreduce.job.queuename</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>mapreduce.input.fileinputformat.inputdir</name>
                    <value>${inputDir}</value>
                </property>
                <property>
                    <name>mapreduce.output.fileoutputformat.outputdir</name>
                    <value>${outputDir}</value>
                </property>
                <property>
                    <name>mapreduce.job.reduces</name>
                    <value>${reduceNum}</value>
                </property>
                <property>
                    <name>mapreduce.task.timeout</name>
                    <value>0</value>
                </property>
            </configuration>
            <file>mapper.py</file>
            <file>reducer.py</file>
        </map-reduce>
        <ok to="end"/>
        <error to="fail"/>
    </action> <!--}}}-->
    
    <kill name="fail">
        <message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
    </workflow-app>
    

    워크플로 배포

    워크플로를 작성한 이후 실제로 작업을 수행하려면 HDFS 상에 워크플로와 실행에 필요한 라이브러리를 배포해야 합니다.
    작성된 워크플로를 HDFS의 작업 디렉터리에 업로드하고, lib 디렉터리에 작업 실행에 필요한 라이브러리(*.jar, *.so) 를 위치시켜 주십시오.

    ├── workflow.xml
    └── lib
        └── hadoop-mapreduce-examples-2.7.1.jar
    
    참고

    lib 디렉터리에 포함된 jar 파일은 자동으로 classpath에 추가됩니다. 추가로 필요한 jar 파일이나 네이티브 라이브러리를 file 엘리먼트에 명시하는 경우에는 lib 디렉터리에 위치시킬 필요는 없습니다.

    스트리밍 작업

    스트리밍 작업 방법은 다음과 같습니다.

    1. lib 디렉터리에 hadoop-streaming-<VERSION>.jar를 업로드해 주십시오.
    2. mapper와 reducer에 명시한 스크립트나 프로그램은 HDFS 경로에 업로드해 주십시오.
    ├── workflow.xml
    ├── mapper.py
    ├── reducer.py
    └── lib
        └── hadoop-streaming-2.7.1.jar
    

    워크플로 실행

    HDFS 상에 배포한 워크플로를 실행하기 전 job properties를 작성해야 합니다.

    job properties 작성

    워크플로의 매개 변수를 설정한 job properties 파일을 작성해 주십시오.

    # hadoop configuration
    nameNode=hdfs://koya
    jobTracker=rm1
    
    # oozie configuration
    oozie.wf.application.path=${serviceDir}/workflow
    
    # job directory information
    serviceDir=${nameNode}/user/test01/wordcount
    inputDir=${serviceDir}/input
    outputDir=${serviceDir}/output
    
    # user information
    user.name=test01
    
    # job configuration
    queueName=default
    reduceNum=2
    
    # NameNode, Jobtracker은 작업을 수행할 클러스터 정보를 넣어줍니다.
    # oozie.wf.application.path 는 수행할 작업의 워크플로가 배포된 위치를 적어줍니다.
    

    job properties 배포

    job properites 파일은 작성 후 HDFS나 기타 시스템에 배포할 필요가 없습니다. Oozie 명령을 수행할 장비에 위치시켜 주십시오.

    job properties 실행

    워크플로 배포 및 job properties 파일 작성이 완료된 후에 Oozie 작업을 수행해 주십시오.

    oozie job -oozie <oozie server> -config <job properties> <option>
    
    $ oozie job -oozie http://oozie.kr.df.naverncp.com:11000/oozie -config job.properties -run -doas test01
    

    이 문서가 도움이 되었습니까?

    What's Next
    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.