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


Archive»


 
 

Spring Batch (DB2File)

프로그래밍/Spring & Maven | 2013.06.27 23:36 | Posted by 조대협

1. 첨부된 파일의 ddl.sql을 mysql에서 수행

2. mysql의 연결 정보를 src/main/resources/applicationContext.xml 에서

<bean id="IF_Example2_Source"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://localhost:3306/development" />

<property name="username" value="developer" />

<property name="password" value="developer" />

</bean>

에 정의

3. run.cmd로 수행

4. c:\temp\user-output.txt가 생성됨



hellobatch2.zip



'프로그래밍 > Spring & Maven' 카테고리의 다른 글

Spring boot 살펴본 느낌  (2) 2014.11.25
Spring Batch (DB2File)  (0) 2013.06.27
Spring Batch 개념 정리  (0) 2013.06.27
SpringBatch HelloWorld  (0) 2013.06.27
Eclipse에서 Spring Maven 개발환경 설정하기  (0) 2013.03.19
Maven 스터디  (0) 2013.03.19

SpringBatch HelloWorld

프로그래밍/Spring & Maven | 2013.06.27 16:35 | Posted by 조대협

SpringBatch 2.0을 이용하여, HelloWorld를 출력하는 가장 기본적인 Job 만들기


hellobatch1.zip


Spring 3.1, SpringBatch 2.2 사용

maven으로 되어 있음

압축풀고 run.cmd 로 실행


'프로그래밍 > Spring & Maven' 카테고리의 다른 글

Spring Batch (DB2File)  (0) 2013.06.27
Spring Batch 개념 정리  (0) 2013.06.27
SpringBatch HelloWorld  (0) 2013.06.27
Eclipse에서 Spring Maven 개발환경 설정하기  (0) 2013.03.19
Maven 스터디  (0) 2013.03.19
Spring 프레임웍 Hadoop-Hive 통합  (0) 2013.03.19

Spring for Apache Hadoop Project #2

(Hive Integration)

Hive Apache 오픈 소스 프로젝트의 하나로, Hadoop 관련 프로젝트이다.

HDFS에 저장된 데이타를 마치 RDMS SQL처럼 쿼리하기 위한 솔루션으로, 복잡한 데이타 쿼리 연산에 있어서, Hadoop과 함께 사용하면 매우 유용하게 이용할 수 있다.

SHDP에서도 이 Hive를 지원한다. 크게 Hive의 기동과, Hive Script의 실행 그리고, Hive에서 제공하는 API를 수행할 수 있도록 지원하며, Hadoop 지원과 마찬가지로, Tasklet을 제공하여 Spring Batch와의 통합을 지원한다.

Hive Server의 기동

hive-server 엘리먼트로 정의하며, configuration file을 읽어서 기동할 수 있으며, 추가되는 configuration hive-server엘리먼트 안에 value로써 지정이 가능하다.

<hdp:hive-server host="some-other-host" port="10001" properties-location="classpath:hive-dev.properties" configuration-ref="hadoopConfiguration">
  someproperty=somevalue
  hive.exec.scratchdir=/tmp/mydir
</hdp:hive-server>

Thrift Client 를 이용한 Hive Script의 수행

Hive를 사용하기 위해서는 Hive Server에 접속하는 클라이언트를 생성해야 하는데, 첫번째 방법이 Thrift Client를 이용하는 방법이 있다. Thrift Client의 경우에는 Thread Safe 하지 않기 때문에, client factory를 리턴한다.

아래 설정을 보면 hive-client-factory hive서버의 ip,port를 지정하여 client를 생성하였다.

그리고, script 실행을 위해서 runner 를 지정한후에, 앞서 생성한 clientfactory reference하였다. 그리고 hive-runner에서 script location을 지정하여,password-analysis.hal 파일에 정의된 script가 실행되도록 정의하였다.

<hdp:hive-client-factory host="some-other-host" port="10001" />
<hdp:hive-runner id=”hiveRunner”hive-client-ref=”hiveClientFactory” run-at-startup=”false” pre-action=”hdfsScript”>
  <script location=”password-analysis.hal”/>
</hdp:/hiverunner>

실제 위의 Configuration을 가지고 수행하는 자바 코드를 보면 다음과 같다.

public class HiveAppWithApacheLogs {
 
         private static final Log log = LogFactory.getLog(HiveAppWithApacheLogs.class);
 
         public static void main(String[] args) throws Exception {
                 AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                                   "/META-INF/spring/hive-apache-log-context.xml"
, HiveAppWithApacheLogs.class);
                 log.info("Hive Application Running");
                 context.registerShutdownHook();    
 
 
                 HiveRunner runner = context.getBean(HiveRunner.class);                
                 runner.call();
 
         }
}

Hive client를 만들때는 각 client가 생성될때마다 자동으로 initialize script를 실행할 수 있다.

<hive-client-factory host="some-host" port="some-port" xmlns="http://www.springframework.org/schema/hadoop">
   <hdp:script>
     DROP TABLE IF EXITS testHiveBatchTable; 
     CREATE TABLE testHiveBatchTable (key int, value string);
   </hdp:script>
   <hdp:script location="classpath:org/company/hive/script.q">
       <arguments>ignore-case=true</arguments>
   </hdp:script>
</hive-client-factory>

위의 설정은 client가 생성될때 마다 DROP TABLE xx 스크립트와, script.q에 지정된 스크립트 두개를 자동으로 수행하도록 한다.

마찬가지로, runner에서도 순차적으로 여러개의 쿼리가 수행되도록 설정할 수 있다.

JDBC 를 이용한 스크립트 수행

Hive Thrift 이외에도, RDBMS에 사용하는 JDBC 드라이버를 사용할 수 있다. Spring에서도 이 JDBC를 통한 Hive 통합을 지원한다.

사용 방법은 일반적인 JDBC Template을 사용하는 방법과 동일하다.

먼저 hive-driver Hive JDBC 드라이버를 지정한후, 이를 이용하여, hive data source를 정의한후, Jdbc template을 이 data source와 연결하여 사용한다. (아래 예제 참고)

<beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:c="http://www.springframework.org/schema/c"
         xmlns:context="http://www.springframework.org/schema/context"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
         
    <!-- basic Hive driver bean -->
    <bean id="hive-driver" class="org.apache.hadoop.hive.jdbc.HiveDriver"/>
 
    <!-- wrapping a basic datasource around the driver -->
    <!-- notice the 'c:' namespace (available in Spring 3.1+) for inlining constructor arguments, 
         in this case the url (default is 'jdbc:hive://localhost:10000/default') -->
    <bean id="hive-ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"
       c:driver-ref="hive-driver" c:url="${hive.url}"/>
 
    <!-- standard JdbcTemplate declaration -->
    <bean id=" jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" c:data-source-ref="hive-ds"/>
         
    <context:property-placeholder location="hive.properties"/>
</beans>

위의 Configuration을 수행하는 자바 코드는 다음과 같다.

Hive template을 이용한 Hive API 실행

JDBC Template과 유사하게 Hive 실행도 Template을 제공한다.

다음과 같이 context 파일에서, hive-template을 만든후에, 해당 template SomeClass라는 클래스에 someBean이란 이름으로 생성해서 weaving하였다.

<hdp:hive-client-factory ... />
<!-- Hive template wires automatically to 'hiveClientFactory'-->
<hdp:hive-template />
         
<!-- wire hive template into a bean -->
<bean id="someBean" class="org.SomeClass" p:hive-template-ref="hiveTemplate"/>

SomeClass에서는 template을 받아서, hivetemplate.execute() 메서드를 수행한다.

public class SomeClass {
 
private HiveTemplate template;
 
public void setHiveTemplate(HiveTemplate template) { this.template = template; }
 
public List<String> getDbs() {
    return hiveTemplate.execute(new HiveClientCallback<List<String>>() {
       @Override
       public List<String> doInHive(HiveClient hiveClient) throws Exception {
          return hiveClient.get_all_databases();
       }
    }));
}}

 

Spring Batch Integration

마지막으로 Hadoop integration등과 마찬가지로 Spring Batch 통합을 위하여, tasklet을 제공한다.

<hdp:hive-tasklet id="hive-script">
   <hdp:script>
     DROP TABLE IF EXITS testHiveBatchTable; 
     CREATE TABLE testHiveBatchTable (key int, value string);
   </hdp:script>
   <hdp:script location="classpath:org/company/hive/script.q" />
</hdp:hive-tasklet>

 

 

 

 

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