25
처처 처처처 Oozie Workflow, Coordinator 2014. 07. 02 처처처

처음 접하는 Oozie Workflow, Coordinator

  • Upload
    kim-log

  • View
    1.075

  • Download
    1

Embed Size (px)

DESCRIPTION

oozie workflow와 coordinator를 처음 접하는 사람들을 대상으로하는 간단하고 쉬운 설명

Citation preview

Page 1: 처음 접하는 Oozie Workflow, Coordinator

처음 접하는 OozieWorkflow, Coordinator

2014. 07. 02김회록

Page 2: 처음 접하는 Oozie Workflow, Coordinator

Workflow?

• Oozie 를 통해 실행할 action 들과 action 관련 속성들을 정의

• action?

– Map-Reduce java

– Map-Reduce Streaming, Pipe

– Pig

– Hive

– Java application

– Shell script

– User defined action

• 상세 설명

– http://oozie.apache.org/docs/4.0.1/WorkflowFunctionalSpec.html

• 작성법은 뒤에서 더 설명…

Page 3: 처음 접하는 Oozie Workflow, Coordinator

Job properties

• Workflow 가 위치한 디렉토리 경로 정의

• Workflow 에서 사용할 속성들의 값을 정의

• 단순 text 파일 , 변수는 ${variable_name} 로 표기

• 예제 # hadoop configurationnameNode=hdfs://your.namenodejobTracker=your.jobtracker.address.com:8032queueName=default

serviceDir=/user/alex/hello

# oozie configurationoozie.wf.application.path=${nameNode}${serviceDir}/workflow # job directory informationinputDir=${serviceDir}/inputoutputDir=${serviceDir}/output # user informationuser.name=alexgroup.name=hadoop # job configurationreduceNum=2

Page 4: 처음 접하는 Oozie Workflow, Coordinator

Workflow 배포

• 배포된 상태에서의 hdfs 경로 구조

• hello/workflow/workflow.xml

– Action 이 정의된 Workflow 파일

– Properties 파일에서는 디렉토리까지만 지정

• hello/workflow/lib/

– 사용할 java application, library (only jar)

– 실행할 Map-reduce application jar 도 이곳에 배포

– Streaming 작업이라면 이곳에 hadoop-streaming.jar 넣어줘야 함

Page 5: 처음 접하는 Oozie Workflow, Coordinator

Workflow 실행

• Oozie client 를 이용해 실행

• 실행 예– bash$ oozie job –oozie http://your.oozie.address.com:11000/oozie -config ./hello.properties –

run

• hello.properties

– 앞서 살펴 본 job properties 파일

– Oozie 를 통해 실행할 workflow 의 위치와 관련 값들을 정의

Page 6: 처음 접하는 Oozie Workflow, Coordinator

Workflow again

• Workflow

– 실행할 작업 (Task) 들을 나열

– Xml 로 표기

– Control flow nods

• Workflow 의 시작 , 종료 등을 정의하는 node – start, end, kill

• Workflow 의 흐름을 제어하는 node – decision, fork, join

– Action nodes

• 실행할 작업 (task) 을 정의

• action node 의 작업은 oozie 밖에서 실행 – MR, Streaming, Pig, Hive, …

• 2 가지 전이 단계를 가짐 – ok, error

• 변수 사용

– 표기 : ${param-name}

– 변수의 값은 Job properties 파일에서 정의

– 추후에 살펴 볼 coordinator 에서도 정의

Page 7: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 – start/end

• Node 마다 이름을 명시 – “내가 그의 이름을 불러 주기 전에는…”

– 빨간색 영역은 사용자가 마음대로 넣을 수 있는 값

• Start node 에서 시작할 node 의 이름을 명시

• End node 는 workflow job 을 종료시킴 . 성공적인 종료 .

• Kill node 는 workflow job 을 스스로 죽임 . Error 종료 .

<workflow-app name=“hello_workflow” xmlns=“uri:oozie:workflow:0.4> <start to=“start_node”/> <action name=“start_node”> … <ok to=“next_node”> <error to=“error_node”> </action> … <kill name=“error_node”> … </kill> <end name=“end_node”/></workflow-app>

Page 8: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 – Map-Reduce

• Map-Reduce Acition 정의 <action name=“start_node”> <map-reduce> <job-tracker>jobtracker.address:port</job-tracker> <name-node>namenode.address:port</name-node> <!-- task 시작 전에 실행 --> <prepare> <delete path=“/where/is/my/output”/> </prepare> <!-- jobConf 정의 --> <configuration> <!-- new-api (hadoop2 설정 ) 사용하려면 미리 new-api 를 true 로 설정 --> <property> <name>mapred.mapper.new-api</name> <value>true</value> </property> <property> <name>mapred.reducer.new-api</name> <value>true</value> </property> … </configuration> </map-reduce> <ok to=“next_node”> <error to=“error_node”> </action>

Page 9: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 – Map-Reduce

• Configuration - jobConf <property> <name>mapreduce.job.queue.name</name> <value>default</value> </property> <property> <name>mapreduce.job.reduces</name> <value>512</value> </property> <property> <name>mapreduce.input.fileinputformat.inputdir</name> <value>/where/is/my/inputdir</value> </property> <property> <name>mapreduce.output.fileoutputformat.outputdir</name> <value>/where/is/my/outputdir</value> </property> </property> <name>mapreduce.job.map.class</name> <value>your.mapper.class</value> </property> <property> <name>mapreduce.job.reduce.class</name> <value>your.reducer.class</value> </property>

Page 10: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 – Map-Reduce

• Configuration – jobConf <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>your.job.output.value.class</value> </property> <property> <name>mapreduce.output.fileoutputformat.outputdir</name> <value>/where/is/my/outputdir</value> </property> <!– 이하 안 적으면 default 설정 . 보통 TextInputFormat, TextOutputFormat --> </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>

Page 11: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 – file/archive

• File/archive 방법

<action name=“start_node”> <map-reduce> … <configuration> … </configuration> <!-- 상대 경로일 경우 work dir(properties 에서 설정한 거 ) 을 기준으로 한다 . --> <file>/your/file/path1</file> <!-- # 뒤에 alias 붙일 수 있다 . --> <file>/your/file/path2#file_alias2</file> <archive>/your/archive/path1</archive> <archive>/your/archive/path2#archive_aliash2</archive> </map-reduce> <ok to=“next_node”> <error to=“error_node”> </action>

Page 12: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 - Streaming

• Map-Reduce Streaming <action name=“start_node”> <map-reduce> <job-tracker>jobtracker.address:port</job-tracker> <name-node>namenode.address:port</name-node> <!-- task 시작 전에 실행 --> <prepare> <delete path=“${outputDir}”/> </prepare> <streaming> <mapper>your.mapper.script arg1 arg2 …</mapper> <reducer>your.reducer.script arg1 arg2 …</reducer> </streaming> <!-- jobConf 정의 --> <configuration> … </configuration> <file>your.mapper.script</file> <file>your.reducer.script</file> </map-reduce> <ok to=“next_node”> <error to=“error_node”> </action>

Page 13: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 – job-xml

• Configuration 의 jobConf 를 별도 파일로 작성 – job-xml

– <job-xml>your.jobConf.path.xml</job-xml>

• 로딩 순서

– streaming(streaming job 일 경우 ) -> Job-conf -> configuraton

– Configuration 에 중복된 설정 있을 경우 configuration 내용대로

• 여러 job.xml 파일 입력 가능

Page 14: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 - Shell

• Shell action

<action name=“shell_node”> <shell xmlns=“uri:oozie:shell-action:0.1”> <job-tracker>jobtracker.address:port</job-tracker> <name-node>namenode.address:port</name-node> <!-- task 시작 전에 실행 --> <prepare> <delete path=“/do/u/wanna/delete/something”/> </prepare> <exec>bash</exec> <argument>your.script</argument> <argument>your.arg1</argument> <argument>your.arg2</argument> … <argument>your.arg#</argument> <file>/your/script/path</file> <!-- capture-output 이 있으면 stdout 으로 출력된 param_name=value 를 oozie workflow 에서 아래처럼 사용 가능 ${wf:actionData(‘node_name’)[‘param_name’]} --> <capture-output/> </shell> <ok to=“next_node”> <error to=“error_node”> </action>

Page 15: 처음 접하는 Oozie Workflow, Coordinator

Workflow 작성 - Java

• Java action

– map-reduce job 으로 작동하므로 queue 를 꼭 지정

<action name=“java_node”> <java> <job-tracker>jobtracker.address:port</job-tracker> <name-node>namenode.address:port</name-node> <prepare> <delete path=“/where/is/my/output”/> </prepare> <configuration> <property> <name>mapred.queue.name</name> <value>default</value> </property> </configuration> <main-class>your.main.class</main-class> <!-- configuraton 에서 mapred.child.java.opts 로 지정해도 동일한 효과 --> <java-opts>-Dblah</java-opts> <arg>arg1</arg> <arg>arg2</arg> </java> <ok to=“next_node”> <error to=“error_node”> </action>

Page 16: 처음 접하는 Oozie Workflow, Coordinator

Coordinator?

• Crontab 처럼 반복적으로 workflow 를 실행

• Properties

– oozie.coord.application.path 정의

• oozie.wf.application.path 는 정의하지 않음

• 정의된 위치 내 coordinator.xml 사용

• workflow path 는 coordinator.xml 에서 지정

• 실행– $ oozie job -oozie http://your.oozie.host:11000/oozie -config ./coord.properties –

run

• 상세 설명

– http://oozie.apache.org/docs/4.0.1/CoordinatorFunctionalSpec.html

Page 17: 처음 접하는 Oozie Workflow, Coordinator

coordinator – 시각 표시

• Datetime

– 분 (minute) 단위까지 지정 가능

– UTC

• YYYY-MM-DDTHH:MMZ

• 2014-07-01T00:10Z

– GMT offset

• YYYY-MM-DDTHH:MM+0900 ( 한국 )

• 2014-07-01T09:10+0900

– 한국 시각으로 14 년 7 월 1 일 오전 9 시 10 분

– 위의 UTC 로 표기된 시각과 동일

• timezone 표시

– NON-DST : GMT[+/-]HH:MM

– DST support(by JAVA jdk) : America/Los_Angeles

Page 18: 처음 접하는 Oozie Workflow, Coordinator

coordinator – 시각 함수들

• ${coord:minutes(int n)} = n

• ${coord:hours(int n)} = n*60

• ${coord:days(int n)} = 현재 날짜로부터 n 일이 전부 지날

때까지 분

• ${coord:months(int n)} = 현재 날짜로부터 n 달이 지날 때까지

– DST(daylight saving time) 때문에 timezone 에 따라 변동

Page 19: 처음 접하는 Oozie Workflow, Coordinator

coordinator 구성

• controls

– timeout, concurrency, execution, throttle 등등 지정

– timeout – 실현된 action 이 다른 조건을 기다릴 때까지의 최대 시간 ( 분 ). Default -1 (no timeout)

– concurrency – 최대 동시 실행 action 개수 (default 1)

– execution – 동시에 여러 개가 실행될 때 실행 순서 ( FIFO, LIFO, LAST_ONLY, default FIFO )

– throttle – waiting 단계에서 기다릴 최대 action 개수 (default 12)

• dataset

– 논리적 이름을 갖는 데이터 (URI) 집합

– dataset instance – dataset 의 특정한 발현으로 , 중복 없는 URI 들의 집합

– name – dataset 의 이름

– frequency – 생성 주기

– initial-instance – 초기 data 의 생성 시각

– Uri-template – dataset 을 명시하고 , dataset instance 로 구체화될 상수 / 변수로 이루어진 uri template

– done-flag – data set 을 위한 done file 명 . 기본은 _SUCCESS. 빈 칸으로 설정할 경우 directory 의 유무를 이용 .

• input-events

– coordinator action 을 실행하기 위한 input 조건 . 생성된 모든 dataset instance 가 준비되어야 함

• output-events

– 결과를 위한 dataset instance

• action

– workflow 와 property 설정

Page 20: 처음 접하는 Oozie Workflow, Coordinator

coordinator – action

• 하루 주기로 7 월 2 일 00:00 에 시작 , 7/8 00:00 에 종료

• app-path 로 workflow.xml 이 있는 경로 설정

<coordinator-app name=“hello-coord” frequency=“${coord:days(1)}” start=“2014-07-02T00:00+0900” end=“2014-07-08T00:00+0900” timezone=“UTC” xmlns=“uri:oozie:coordinator:0.4”> <action> <workflow> <app-path>hdfs://bar:8020/usr/joe/logprocessor</app-path> </workflow> </action></coordinator-app>

Page 21: 처음 접하는 Oozie Workflow, Coordinator

coordinator - dataset

• 1 시간 주기의 searchlogs, clicklogs 와 하루 주기의 joinlogs 라는 dataset

• uri-template

– ${YEAR}, ${MONTH}, ${DAY}, ${HOUR}, ${MINUTE} 같은 상수 (EL Time Constants) 사용

가능

– job properties 에 정의된 변수도 ${variable_name} 처럼 사용 가능<coordinator-app name=“hello-coord” frequency=“${coord:days(1)}” start=“2014-07-02T00:00+0900” end=“2014-07-08T00:00+0900” timezone=“UTC” xmlns=“uri:oozie:coordinator:0.4”> <datasets> <dataset name=“searchlogs” frequency=“${coord:hours(1)}” initial-time=“2014-06-20T00:00+0900” timezone=“GMT+09:00”> <uri-template>hdfs://bar:8020/data/srchlogs/${YEAR}${MONTH}/${DAY}/${HOUR}/data</uri-template> </dataset> <dataset name=“clicklogs” frequency=“${coord:hours(1)}” initial-time=“2014-06-20T00:00+0900” time-zone=“GMT+09:00”> <uri-template>hdfs://bar:8020/data/clcklogs/${YEAR}${MONTH}/${DAY}/${HOUR}/data</uri-template> </dataset> <dataset name=“joinlogs” frequency=“${coord:days(1)}” initial-time=“2014-07-01T05:00+0900” time-zone=“GMT+09:00”> <uri-template>hdfs://bar:8020/data/joinlogs/${YEAR}{$MONTH}/${DAY}/data</uri-template> </dataset> </datasets> …</coordinator-app>

Page 22: 처음 접하는 Oozie Workflow, Coordinator

coordinator – input/output events

• dataset 으로부터 dataset-instance 를 생성

• start-instance 와 end-instance 를 이용해 최근 24 시간에 해당하는 24 개 instance 생성

– Data 가 준비될 때까지 기다림 . 단 , initial-time 보다 앞선 data 가 필요할 경우엔 해당 data 무시

• output 은 1 개 instance 생성 ( 참고로 , coord:current 는 dataset 의 frequency 와 간격이

일치 )<coordinator-app name=“hello-coord” frequency=“${coord:days(1)}” start=“2014-07-02T00:00+0900” end=“2014-07-08T00:00+0900” timezone=“UTC” xmlns=“uri:oozie:coordinator:0.4”> <datasets> … </datasets> <input-events> <data-in name=“in_srch” dataset=“searchlogs”> <start-instance>${coord:current(-24)}</start-instance> <end-instance>${coord:current(-1)}</end-instance> </data-in> <data-in name=“in_clck” dataset=“clicklogs”> <start-instance>${coord:current(-24)}</start-instance> <end-instance>${coord:current(-1)}</end-instance> </data-in> </input-events> <output-events> <data-out name=“out_join” dataset=“joinlogs”> <instance>${coord:current(0)}</instatnce> </data-out> </output-events></coordinator-app>

Page 23: 처음 접하는 Oozie Workflow, Coordinator

coordinator – action again

• app-path 로 workflow.xml 이 있는 경로 설정

• data-in, data-out 에서 정의한 이름을 이용해 필요한 data 설정

– workflow.xml 에서 ${srchlogs}, ${clcklogs}, ${outdir} 로 사용 가능

… </output-events> <action> <workflow> <app-path>hdfs://bar:8020/usr/joe/logprocessor</app-path> <configuration> <property> <name>srchlogs</name> <value>${coord:dataIn(‘in_srch’)}</value> </property> <property> <name>clcklogs</name> <value>${coord:dataIn(‘in_clck’)}</value> </property> <property> <name>outdir</name> <value>${coord:dataOut(‘out_join’)}</value> </property> </configuration> </workflow> </action></coordinator-app>

Page 24: 처음 접하는 Oozie Workflow, Coordinator

Coordinator - Materialization

• Coordinator 의 Job Frequency 에 따라 action 이 생성되어 실행됨

• dataset instance 가 구체화됨

• 앞 예에서 7/1 24:00 에 실행될 job 에서 property 들 값

– srchlogs = hdfs://bar:8020/data/srchlogs/201407/01/23/

data,hdfs://bar:8020/data/srchlogs/201407/01/22/data,...,hdfs://

bar:8020/data/srchlogs/201407/01/00/data

– clcklogs = hdfs://bar:8020/data/clcklogs/201407/01/23/

data,hdfs://bar:8020/data/clcklogs/201407/01/22/data,...,hdfs://

bar:8020/data/clcklogs/201407/01/00/data

– outdir = hdfs://bar:8020/data/joinlogs/201407/01/data

• initial-time + frequency(24 시간 ) 가 안 지났기 때문에 07/01 이

current(0)

Page 25: 처음 접하는 Oozie Workflow, Coordinator

End

• 더 자세한 내용은 http://oozie.apache.org/ 에서 !!!

• Yahoo! 에서 작성한 use cases

– https://github.com/yahoo/oozie/wiki/Oozie-WF-use-cases

– https://github.com/yahoo/oozie/wiki/Oozie-Coord-Use-Cases