일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Spring
- elastic search
- design pattern
- intellij
- docker
- Linux
- 제주
- Java
- DDD
- 엘라스틱서치
- Gradle
- Storm
- Spring XD
- hadoop
- hdfs
- Domain Driven Design
- elasticsearch
- apache storm
- spark
- Spring Batch
- Angular2
- Spring Boot
- SBT
- Clean Code
- Hbase
- nginx
- 스프링 배치
- scala
- hibernate
- 도메인주도설계
- Today
- Total
욱'S 노트
Spring XD - Modules 본문
소개
Spring XD는 stream을 정의하여 데이터를 획득하는 것을 지원한다. Stream은 module로 구성된다. Module은 캡슐화된 작업 단위를 재활용가능한 컴포넌트로 만든 것이다. Spring XD의 job 또한 모듈로서 구현되어야 한다.
모듈은 타입에 따라 분류될 수 있다. 타입은 일반적으로 모듈의 역할과 기능을 나타낸다. 현재 Spring XD 모듈의 타입은 source, sink, processor 그리고 job이다. 타입은 스트림에서 모듈이 어떻게 조합될지 혹은 배치 작업으로 디플로이 될 떄 사용될 지 여부를 결정한다.
- Source는 외부 리소스로 또는 이벤트로 부터 트리거되어 output을 제공한다. stream의 첫번째 모듈은 반드시 source여야 한다.
- Processor는 입력 메시지를 사용하여 어떤 작업을 수행한 후 새로운 메시지를 생성한다. 그래서 입력과 출력이 모두 요구된다.
- Sink는 입력 메시지를 소비하여 외부 리소스에 데이터를 출력한다. 그리고 stream을 종료시킨다.
- Job은 Spring XD에서 사용가능한 Spring Batch 작업이다.
Spring XD에서는 stream으로 조합할 수 있는 빌트인 모듈을 제공한다. File, HDFS, Spark, Kafka, http, syslog, GemFire 등등. 또한 사용자는 복잡한 빅데이터 어플리케이션을 이러한 모듈들을 자바코드 없이 조합해 만들 수 있다. Spring XD의 모듈을 생성하기 위해서는 Spring, Spring Integration 또는 Spring Batch에 대한 지식은 필수적이다. 다음 내용들은 이러한 주제들에 대해 이미 알고 있다고 가정한다.
- Source는 poller나 trigger가 설정된 inbound adapter로부터 데이터를 제공받는 output으로 명명된 direct channel을 포함한 유효한 메시지 플로우이다.
- Processor는 input으로 명명된 direct channel과 output으로 명명된 subscribable channel(direct or publish subsrcibe)을 포함한 유효한 메시지 플로우 이다. 일반적으로 입력 메시지를 기반으로 새로운 메시지를 생성하는 transformation을 수행ㅎ나다.
- Sink는 input channel과 외부 리소스에 메시지를 전달하기 위한 outbound adapter 또는 service activator를 포함한 유효한 메시지 플로우이다.
- 어플리케이션 컨텍스트 설정 : application context 설정을 위한 xml이나 groovy파일이 있어야 한다. 만약 설정클래스를 사용한다면 설정 파일에 표현되어야 한다.
- 모듈 프로퍼티 파일 : 모듈이 어떤 옵션을 제공해야 한다면 프로퍼티 파일을 사용할 수 있다. 프로퍼티 파일은 Module Options Metadata 클래스의 fully qualified 클래스명을 포함한 option_class프로퍼티를 제공한다. 또한 프로퍼티 파일은 in-line module option descriptor를 제공할 수도 있다.
Uber-jar로 모듈을 패키징 할때 컴파일 및 테스트를 위해 필요한 Spring XD 라이브러리를 제공하는 빌드 지원 툴은 각각의 지원툴은 Spring Boot Maven Plugin 또는 Spring Boot Gradle Plugin이다.
모듈은 Spring XD Container로 부터 제공되니 않는 디펜던시를 포함해야 한다. 이러한 사항들은 module이 디플로이 될 때 module class loader에 의해 로딩된다. 라이브러리 디렉토리에 포함되는 않는 jar는 ClassDefNotFoundException을 발생시킬 것이다. 게다가 모듈 Spring XD 클래스패스에 다른 버젼의 라이브러리가 존재한다면 confliect나 class loading 이슈가 발생할 수도 있을 것이다. 그러나 걱정할 필요는 없다.
- Spring Boot 패키징 레이아웃은 uber-jar에 제공된 디펜던시가 포함되지 않는 것을 보장해준다. Spring XD 모듈 빌드는 제공된 디펜던시는 spring-xd-dirt로 정의하고 해당 클래스들을 모듈 개발시 제공한다.
- 만약 Spring XD runtime 디펜던시를 포함한 uber-jar라면 해당 디펜던시를 제거해준다.
빌드 지원 툴은 spring-xd-dirt와 spring-xd-test를 정의된 디펜던시를 지원한다. spring-xd-test는 모듈 개발에 유용하다.
- 자바로 정의된 Module Options Metadata
- In-Container 모듈 테스팅 - 임베디드 싱글 노드 컨테이너를 구동, 모듈 배포 및 결과 검증
Testing a Module Project
자세한 테스트 예제는 각각 타입별 모듈 섹션에서 제공한다. 모듈을 빌드하기 위해서는 다음과 같은 커맨드를 수행한다.
$mvn clean package
$gradlew clean test bootRepackage
Registering a Module
Spring XD Module Registry에 모듈을 등록해보자. 모듈은 stream이나 job으로 배포되기 전에 등록되어야 한다. 모듈이 패키징 되었다면 쉘의 업로드 커맨드를 통해서 등록을 할 수 있다.
xd:>module upload --file [path-to]/mymodule-1.0.0.BUILD-SNAPSHOT.jar --name mymodule --type processor
모듈정의는 모듈을 유니크하게 식별하기 위해 다음과 같은 속성을 요구한다.
name - 컴포넌트명, 모듈의 목적을 나타내는 한 단어
type - 모듈 타입, source, sink, processor 그리고 job
모듈은 Spring XD에 modules 디렉토리에 위치한다. 그리고 Module Registry는 타입과 일치하는 서브 디렉토리에 따라 구성된다.
modules
### job
### processor
### sink
### source
Spring XD는 ModuleRegistry라는 전략 인터페이스를 제공한다. 현재 Spring XD ResourceModuleRegistry를 구현하여 제공한다.
Custom 모듈은 독립 모듈과 분리해서 위치한다. Custom 모듈은 위치를 변경할 수도 있다. severs.yml의 xd.customModule.home의 위치를 수정하면 된다. 디폴트 위치는 ${xd.home}/custom-modules이다. 그러나 custom module이 production에서 사용된다면 네트워크 파일시스템으로 세팅해라. 두가지 이점이 있다. 첫번째, custom 모듈은 XD Admin을 포함한 모든 노드의 XD 컨테이너에서 접근가능해야 된다. 이러면 모든 컨테이너의 해당 모듈이 디플로이 될 수 있을 것이다. 두번째 Spring XD의 설치본에 등록되어 있다면 Spring XD 업그레이드시 사라질 것이다.
Module Class Loading
모듈은 독립된 클래스 로더를 사용하여 모듈의 라이브러리 디렉토리로부터 클래스를 로딩한다. 만약 해당 클래스를 찾을수 없다면 Spring XD에서 일반적으로 사용되는 parent 클래스 로더의 클래스를 로딩할 것이다. 그러나 두가지 사항에 유의하자.
- Spring XD 클래스패스에서 제공된 jar 파일을 modules lib에 넣는것은 피하자. ClassCastException이나 class loading 이슈가 발생할 수 있다.
- 메시지로의 payload 타입에 대한 참조를 가진 클래스는 xd/lib에 설치되어야 한다. 그래야 Producer 및 Consumer 모듈에서 접근이 가능하다.
스프링 프로퍼티로 query, language, consumerKey 그리고 consumerSecret이 제공되고 있다. Spring XD는 이러한 프로퍼티들을 각 모듈 인스턴스에 옵션으로서 제공된다. 이러한 모듈의 노출된 옵션은 TwitterSearchOptionsMedataa.java에 정의되어 있다.
예를 들면 아래와 같이 옵션에 따른 두가지 다른 stream을 생성할 수 있다.
xd:> stream create --name tweettest --definition "twittersearch --query='java' | file"
xd:> stream create --name tweettest2 --definition "twittersearch --query='spring' --language=en --consumerKey='mykey' --consumerSecret='mysecret' | file"
추가적으로 옵션은 모듈에서 Spring Bean 찹조가 될 수 있다. 각 모듈 인스턴스는 빈의 다른 구현을 인젝션할 수 잇을 것이다. 이러한 기능을 통해 같은 모듈 정의를 다른 설정과 함께 자신의 어플리케이션 컨텍스트를 생성할 수 있게 된다. 이러한 유용한 기능의 결과로 input, output과 같은 단순한 프로퍼티 이름을 빈의 표준 아이디로 사용할 수 있게 되는 것이다.
위의 예에서 디폴트값을 사용한 것을 확인 할 수 있다. 때때로 디폴트는 stream명, module명 또는 runtime context로 대체될 수 있다. 예를들면 file source는 디렉토리를 필요로 한다. 적당한 방법은 공통의 input 패스를 디폴트로 정의하는 것이다. 그리고 Stream 정의에서 dir옵션을 통해 디렉토리를 변경하는 것이다. 이러한 사항들은 module info 커맨드를 통해 확인할 수 있다.
또한 Spring XD에서는 모든 모듈에 아래와 같은 공통적인 PlaceHolder를 제공한다.
모듈은 재활용가능한 Spring Integration 혹은 Spring Batch application context이다. 이들은 module options을 통해 동적으로 설정될 수 있다.
모듈 옵션은 stream이나 작업 정의로 부처 설정된 어떤값이다. 되도록이면 사용가능한 옵션을 metadata로서 제공해야 한다. 옵션값을 할당하는 우선순위는 다음과 같다.
1. stream정의에서 제공된 값
2. platform-wide 디폴트 값
3. 모듈의 메타 데이터에서 제공된 디폴트값
Platform-wide 디폴트는 다음과 같은 기준으로 할당된다.
1. <moduletype>.<modulename>.<optionname>로 명명된 system property
2. <moduletype>.<modulename>.<optionname>로 명명된 환경변수
3. <root>/<moduletype>/<modulename>/<modulename>.properties 프로퍼티 파일의 <optionname>이 key인 프로퍼티
4. <root>/ <module-config>.yml의 <moduletype>.<modulename>.<optionname>
Composing Modules
Stream은 모듈의 순서를 정의한 것이다. 때때로 stream는 공통 처리 chain을 공유하고 싶을때가 있다. Composite 모듈은 똑같은 정의 중복을 피하는 방법으로 사용될 수 있다. 그리고 더욱 중요한 것은 성능을 증가하는 방식으로 사용될 수 있다. Stream에 표현된 각 모듈은 디플로이의 단위가 된다. Singlenode 런타임에서는 모듈간 통신을 In-memory 채널을 이용하지만 분산환경에서는 메시징 미들웨어를 통한다. 많은 경우 stream는 미들웨어 전송 및 오브젝트 마샬링을 피하기 위해 함께 배포되는 것이 성능이 더 나을 수 있다.
Composite 모듈을 생성하기 위한 간단한 커맨드를 보면 다음과 같다.
xd:> module compose foo --definition "filter --expression=payload.contains('foo') | file"
잘 생성이 되었는지 확인해보자.
Composite 모듈은 Sink로 나타난다. 이유는 이론적으로 sink로 동작하기 때문이다. 그리고 (c) prefix가 붙은 걸 확인할 수 있다.
다음은 두 개의 processor를 composite 해보자. 이런 경우에는 processor로 분류된다.
xd:> module compose myprocessor --definition "splitter | filter --expression=payload.contains('foo')"
다음은 source와 processor를 결합하자. 이것은 source로 분류된다.
xd:> module compose mysource --definition "http | filter --expression=payload.contains('foo')"
Composite 모듈의 logical 타입에 근거하여 stream에서 사용할 수 있다. 다음은 사용예이다.
xd:> stream create httpfoo --definition "http | foo" --deploy
xd:> stream create filefoo --definition "file --outputType=text/plain | foo" --deploy
더 이상 composite 모듈을 사용하고 싶지 않다면, delete 커맨드로 삭제할 수 있다. 하지만 이 경우 모듈이 stream에서 사용중에 있다면 먼저 stream을 destroy한 다음 delete를 수행하여야 한다.
xd:> stream destroy --name filefoo
Destroyed stream 'filefoo'
xd:> stream destroy --name httpfoo
Destroyed stream 'httpfoo'
xd:> module delete --name sink:foo
Successfully destroyed module 'foo' with type sink
모듈을 생성하거나 삭제할 때 타입별로 똑같은 이름이 존재한다면 타입 필터를 사용할 수 있다. (<type>:<module_name>)
'Programming > Spring XD' 카테고리의 다른 글
Spring XD - DIRT(Distributed Runtime) 시작하기 (0) | 2015.03.12 |
---|---|
Spring XD - Source Module 개발하기 (0) | 2015.03.05 |
Spring XD - Streams (0) | 2015.03.03 |
Spring XD - Job Module 개발하기 (0) | 2015.02.05 |
Spring XD - Batch Jobs (0) | 2015.02.02 |