블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


Spring for Apache Hadoop Project


얼마전에, Spring에서 Hadoop과 통합을 지원하는 프로젝트를 발표하였습니다. Hadoop 자체뿐만 아니라, Hadoop echo system Hive, Pig, Cascade등을 함께 지원하며, 기존 Spring Spring Batch(배치 작업 수행 및 워크 플로우 관리)와의 통합을 지원합니다.

이번 글에서는 Spring Data Apache Hadoop (이하 SHDP-Spring for Apache Hadoop Project)에 대해 설명한다 ( Spring Hadoop에 대한 기본적인 이해가 선행되어야 한다. )

전체적으로의 느낌은 Spring을 컨테이너의 개념으로 보고, Hadoop을 그 컨테이너 안에서 실행 시키는 것과 같은 느낌을 준다. Hadoop 자체와 아주 Tight하게 통합 된것은 아니면서, 외부 명령어나 Library invoke 하듯이 Hadoop을 실행하며, 단순히 Map & Reduce Job 뿐만 아니라, Job을 수행하기 위해서 통상적으로 Hadoop에서 수행하는 Shell Script 처리까지 프레임웍에서 지원하도록 했다. 또한 각 Job이나 이런 Script들을 순차적으로 batch처럼 수행하기 위해서 Tasklet을 제공함으로써 Spring Batch와의 통합을 지원한다. Hadoop job, tool,script들을 모두 spring configuration내의 element로 다 맵핑을 한후에, Spring batch와 통합을 통하여, hadoop을 수행하는데 모든 필요한 순차적인 작업을 shell command나 여타의 작업이 필요 없이 spring만 가지고도 수행할 수 있도록 지원한다.


현재 지원 버전 참고

Spring for Apache Hadoop requires JDK level 6.0 (just like Hadoop) and above, Spring Framework 3.0 (3.2 recommended) and above and Apache Hadoop0.20.2 (1.0.4 recommended) and above. SHDP supports and is tested daily against various Hadoop distributions, such as Cloudera CDH3 (CD3u5) and CDH4 (CDH4.1u3 MRv1) distributions and Greenplum HD (1.2). Any distro compatible with Apache Hadoop 1.0.x should be supported

 Job 기반의 기본적인 Hadoop Map & Reduce 실행

Hadoop Map & Reduce 에 대한 통합은 크게 3가지 관점으로 이루어 진다. Job,Tool 그리고 Hadoop jar 파일 자체

Job Map & Reduce의 단위로, 당연히 지원되어야 하고, Tool Hadoop이 지원하는 각종 유틸리티 들이다. 이 역시 Spring element로 지정이 되어 있다. 마지막으로 hadoop.jar 자체를 수행할 수 있는 기능을 지원한다. 3가지 기능을 모두 지원함으로써 hadoop으로 할 수 있는 거의 모든 것을 spring으로 mapping을 할 수 있다. 또한 이 각각에 대해서 Spring Batch 통합을 위하여 Tasklet을 제공한다.

Java 기반의 job 정의

<hdp:job id="mr-job"

  input-path="/input/" output-path="/ouput/"

  mapper="org.apache.hadoop.examples.WordCount.TokenizerMapper"

  reducer="org.apache.hadoop.examples.WordCount.IntSumReducer"/>

 

위의 예제는 default configuration을 사용하는 것으로 되어 있는데, 별도로 hadoop configuration을 명시적으로 지정할 수 도 있고, 아울러, Job 마다 custom property 를 이용하여, configuration을 명시적으로 지정할 수 있음. 아래 예제는 특정 job에 대해서 configuration property 파일로 지정한 형태. 또한 아래에서 볼 것중 하나는 jar 파일을 명시적으로 지정할 수 있다. spring load되는 classloader가 아니라, 별도의 class loader를 이용하여 job에 이용되는 클래스들을 로딩함으로써, 같은 클래스가 있을때 중복이나 충돌이 발생함을 방지해준다.

<hdp:job id="mr-job" 
  input-path="/input/" output-path="/ouput/"
  mapper="mapper class" reducer="reducer class"
  jar-by-class="class used for jar detection"
  properties-location="classpath:special-job.properties">
    electric=sea
</hdp:job>

 

Streaming job 정의

Streaming Job (일반 Command 명령어 방식)은 다음과 같이 정의한다.

<hdp:streaming id="streaming-env" 
  input-path="/input/" output-path="/ouput/"
  mapper="${path.cat}" reducer="${path.wc}">
  <hdp:cmd-env>
     EXAMPLE_DIR=/home/example/dictionaries/
     ...
  </hdp:cmd-env>
</hdp:streaming>

mapperreducer에 직접 command를 정의한다.

그리고 만약에, command에 넘겨야 하는 parameter들이 있다면 <hdp:cmd-env> 엘리먼트에 지정해서 넘긴다.

 Running a Hadoop Job

앞서와 같이 Hadoop Job의 정의가 끝나면, Spring에서는 “job-runner” 엘리먼트를 이용해서 특정 Job을 구동 시킬 수 있다.

<hdp:job-runner id="myjob-runner" pre-action="cleanup-script" post-action="export-results" job="myjob" run-at-startup="true"/>
 
<hdp:job id="myjob"  input-path="/input/" output-path="/output/"
         mapper="org.apache.hadoop.examples.WordCount.TokenizerMapper"
         reducer="org.apache.hadoop.examples.WordCount.IntSumReducer" />

위의 예제는 구동과 동시에 TokenizerMappe라는 java mapper InitSumReducer라는 java reducer를 가지고 있는 “myjob”이라는 job을 구동 시키는 설정이다. “myjob”을 구동하기 전에 “cleanup-script” 를 수행하고, job 실행이 끝나면 “export-results”라는 스크립트를 자동으로 수행한다.

또한 <hdp:job-runner> 엘리먼트에 job=”” 속성에, 순차적으로 1개 이상의 job id를 적으면, 여러개의 job을 순차적으로 수행하게 된다.

Job 실행의 Spring Batch와 통합

SHDPHadoop job 실행을 Spring Batch와 통합하기 위해서 hadoop job을 실행 시키는 tasklet을 제공한다.

<hdp:job-tasklet id="hadoop-tasklet" job-ref="mr-job" wait-for-completion="true" />

위와 같이 job tasklet으로 지정하여 spring batch work flow에 통합할 수 있다.

Hadoop Tool 실행

Hadoop에는 내부적으로 Map & reduce job을 수행 시키는 것 이외에도, 여러가지 툴(유틸리티)들이 포함되어 있는데, SHDP에서는 이러한 유틸리티를 수행할 수 있도록, “tool-runner” element를 지원한다.

<hdp:tool-runner id="someTool" tool-class="org.foo.SomeTool" run-at-startup="true">
   <hdp:arg value="data/in.txt"/>
   <hdp:arg value="data/out.txt"/>
   
   property=value
</hdp:tool-runner>

위와 같이 tool-runner element에서 수행하고자 하는 클래스를 tool-class로 지정하고, 필요한 parameter hdp:arg 엘리먼트로 정의하면 된다.

또한 하나의 tool만 실행하는 것이 아니라, 순차적으로 여러개의 tool tool-runner를 이용해서 수행할 수 있다.

<hdp:tool-runner id="job1" tool-class="job1.Tool" jar="job1.jar" files="fullpath:props.properties" properties-location="config.properties"/>
<hdp:tool-runner id="job2" jar="job2.jar">
   <hdp:arg value="arg1"/>
   <hdp:arg value="arg2"/>
</hdp:tool-runner>
<hdp:tool-runner id="job3" jar="job3.jar"/>
...

위와 같이 job1,job2,job3의 툴을 순차적으로 수행함으로써, hadoop 수행시 shell script에서 여러 도구를 수행하는 절차를 모두 Spring으로 통합할 수 있다.

Hadoop ToolSpring Batch 통합

Job과 마찬가지로 Tool 실행 역시 tasklet을 제공하여, Spring Batch과 통합 될 수 있도록 지원한다.

<hdp:tool-tasklet id="tool-tasklet" tool-ref="some-tool" />

 

Hadoop jar의 실행

마지막으로, hadoop.jar 자체를 수행할 수 있도록 지원한다.

<hdp:jar-runner id="wordcount" jar="hadoop-examples.jar" run-at-startup="true">
    <hdp:arg value="wordcount"/>
    <hdp:arg value="/wordcount/input"/>
    <hdp:arg value="/wordcount/output"/>
</hdp:jar-runner>

위의 예제는 아래 shell command를 그대로 수행하는 기능을 한다.

bin/hadoop jar hadoop-examples.jar wordcount /wordcount/input /wordcount/output

 

Hadoop jar 실행과 Spring Batch의 통합

Job이나 Hadoop tool과 마찬가지로 Spring 통합을 위해서 tasklet을 제공한다.

<hdp:jar-tasklet id="jar-tasklet" jar="some-jar.jar" />

 

다음 글에서는 Hive, Pig, Cascading, HDFS에 대한 SHDP 지원에 대해서 소개하고자 한다.

참고 자료 : http://static.springsource.org/spring-hadoop/docs/current/reference/html/hadoop.html

 

본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

댓글을 달아 주세요