데이터실무

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

Oozie 실습

데이터 저장
Oozie
Oozie 실습
작성자
admin
작성일
2021-02-15 13:56
조회
2041

Hello World 예제

가장 단순한 예로서 우지에서 하나의 "Hello World" job을 수행하고자 한다.


작업 흐름의 정의

우선 하둡과 우지가 설치된 상태에서 "HelloWorldTest"라는 이름의 디렉터리를 만들고 그 안에 다음 항목들이 존재하도록 한다.


  • lib 디렉터리
  • job.properties 파일
  • workflow.xml 파일

lib 디렉터리 안에는 문자열의 인자값을 출력하는 System.out.println()을 갖는 HelloWorld.java 파일을 작성해 저장한다. 이어서 다음 명령을 통해 HelloWorld.jar 파일을 lib 디렉터리에 저장한다.

$ jar cvf HelloWorld.jar HelloWorld.class

job.properties 파일에는 위의 class 파일을 다음과 같이 지정한다.

nameNode=hdfs://localhost:9000 jobTracker=localhost:9001 quenueName=default oozie.wf.application.path=${nameNode}/user/${user.name}/HelloWorldTest

workflow.xml 파일에는 다음과 같은 내용을 기록한다.

<workflow-app xmls="uri:oozie:workflow:0.2" name="hello-world-wf"><start to="java-node"/><action name="java-node"><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.queue.name</name><value>default</value></property></configuration><main-class>HelloWorld</main-class><arg>arg1</arg><arg>arg2</arg></java><ok to="end"/><error to="fail"/></action><kill name="fail"><message>Hello World failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message></kill><end name="end"/></workflow-app>


HDFS로의 이동

이제 다음 명령을 통해 HelloWorldTest를 hdfs로 옮겨 놓는다.

<Hadoop-dir>$ ./bin/hadoop fs -put HelloWorldTest HelloWorldTest

하둡의 start-all.sh 을 수행하고 우지에서 다음의 명령을 수행한다.

$ oozie job -oozie http://localhost:11000/oozie -config job.properties -run job: 0000001-120828184247504-oozie-test-W


결과확인

수행된 job의 상태코드를 웹 콘솔(브라우저)에서 체크하거나 hdfs job tracker에서 해당 job-id를 클릭해 map task가 성공적으로 완료했는지를 알아본다. 성공적으로 진행됐다면 System.out.println 문장을 통한 결과가 작업의 로그 파일에 저장된 것을 확인할 수 있다.


WordCount 예제

하둡의 WordCount 예제에 우지를 적용하는 모습이다.


작업 흐름의 정의

다음은 이러한 word count 작업의 workflow.xml 파일 지정 내용이다.

<workflow-app xmls='uri:oozie:workflow:0.1' name='java-main-wf'><start to='mapreduce-wordcount-example' /><action name='mapreduce-wordcount-example'><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>org.apache.hadoop.examples.ExampleDriver</main-class><arg>wordcount</arg><arg>${inputDir}</arg><arg>${outputDir}</arg></java><ok to ="end" /><error ro="fail" /></action><kill name="fail"><message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode()))}]</message></kill><end name='end' /></workflow-app>


HDFS로의 이동과 하둡 설정

우선 다음 명령을 통해 HDFS로 이동시킨다.

$ hadoop dfs -ls /user/training/oozie/workflow/wordcount

한편 하둡의 job.properties 파일 모습은 다음과 같다.

nameNode=hdfs://localhost:8020 jobTracker=localhost:8021 queueName=default inputDir=${nameNode}/data.in outputDir=${nameNode}/out user.name=training oozie.wf.application.path=${nameNode}/user/${user.name}/oozie/workflow/wordcount/


우지에서의 명령어 수행

우지 클라이언트 콘솔에서 다음 명령을 통해 job을 수행(submit)한다.

$ oozie job -oozie=http://localhost:11000/oozie/ -config oozie/wordcount-demo/workflow/job.properties-run;


MapReduce방식의 데이터 병합 예제

두 개의 맵리듀스 처리 작업(job)이 있는 경우를 상정한다. 첫째 맵리듀스 작업에서는 데이터를 가져와서 HDFS에 입력하는 것이고, 둘째 맵리듀스 작업에서 이 파일들을 읽어서 특정 데이터 타입별로 합병(merge) 작업을 한다고 가정한다.


작업 흐름의 정의

<workflow-app xmlns='uri:oozie:workflow:0.1' name='OWN-datafeed'><start to='datafeed' /> ① <action name='datafeed'><java><job-tracker>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>net.openwith.MapReduce.ips.IPSLoader</main-class><arg>${driveID}</arg></java><ok to="merging" /> <error to="fail" /> </action><fork name="merging"> ② <path start="mergeA" /><path start="mergeB" /></fork><action name='mergeA'><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>net.openwith.hdfs.merge.MergerLoager</main-class><arg>-drive</arg><arg>${driveID}</arg><arg>-type</arg><arg>A</arg><arg>-chunk</arg><arg>${AChunk}</arg></java><ok to="completed" /><error to="fail" /></action><action name='mergeB'><java><job-tracker>${jobTracker}</job-tracker><name-node>${namdNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>default</value></property></configuration><main-class>net.openwith.hdfs.merge.MergeLoader</main-class><arg>-drive</arg><arg>${driveID}</arg><arg>-type</arg><arg>MultiCam</arg><arg>-chunk</arg><arg>${BChunk}</arg></java><ok to="completed" /><error to="fail" /></action><join name="completed" to="end" /><kill name="fail"><message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message></kill><end name='end' /></workflow-app>

위 예에서는 start 노드(①)에서 datafeed 작업을 먼저 수행하도록 했다. 이것이 완료되면 fork 노드(②)에서 mergeA와 mergeB의 두 개 action이 각각 동시에(concurrently) 수행되도록 지정됐다.
이들은 모두 맵리듀스 형태로 진행된다.


HDFS로의 이동과 하둡 설정

우선 HDFS로 이동한 후config-default.xml 파일에 다음과 같이 반영한다.

<configuration><property><name>jobTracker</name><value>sachin003:2010</value></property><property><name>nameNode</name><value>hdfs://sachicn001:8020</value></property><property><name>queueName</name><value>default</value></property></configuration>


우지 명령어 수행

이들 설정파일을 기초로 다음과 같은 명령을 통해 지정된 작업순서에 의거해 해당 job이 수행되도록 한다.

$ oozie job - oozie http://sachidn002.hq.navteg.com:11000/oozie/-D driveID=729-PP0002-2011-02-08-09-59-34 -D lidarChunk=4 -D signageChunk=20 -config.job.properties -run

우지를 설치하면 oozie-examples.tar.gz라는 예제 파일이 함께 제공된다. 이것을 풀면 apps 디렉터리에 aggregator, sqoop 등 20여 개의 예제 설정파일(workflow.xml)이, java 디렉터리에 DateList.java 등 10여 개의 예제 java 프로그램이 데이터와 함께 들어 있으므로 이를 참조할 수 있다.