욱'S 노트

Spring XD - DIRT(Distributed Runtime) 시작하기 본문

Programming/Spring XD

Spring XD - DIRT(Distributed Runtime) 시작하기

devsun 2015. 3. 12. 13:05

소개


Spring XD 분산환경(DIRT)는 다수의 노드간 작업 처리 분산을 지원한다.


Spring XD의 분산 런타임 환경은 다음과 같은 요소들로 구성된다.


  • Admin - Stream과 job 디플로이를 관리하고 사용자를 위해 런타인 상태, 시스템 정보등을 REST 서비스로 제공한다.
  • Container - Module과 배치 작업이 배포된 호스트
  • Zookeeper -  XD 클러스터의 모든 런타임 정보를 제공. 실행 컨테이너 트래킹(모듈 및 작업 배포, 스트림 정의, 디플로이 매니페스트)
  • Spring Batch Job Repository Database - 배치 작업을 위해 필요한 RDBMS.  HSQLDB가 제공되나 production에서는 적합하지 않다. JDBC를 지원하는 모든 데이터베이스면 가능하다.
  • A Message Broker - 데이터 전송을 위해 사용. XD data tranport는 pluggable하다. 현재  Rabbit MQ와 Redis를 지원하고 Kafka는 stream만 지원한다. 현재 Kafka는 사용할 수 없다.
  • Analytics Repository - XD에서는 집계와 측정을 위해 Redis를 사용한다. 


또한 XD는 CLI를 제공한다. 또한 XD-UI를 통해서도 XD Runtime과 통신할 수도 있다.




XD 배포판에서는 런타임 컴포넌트를 시작하기 위한 쉘스크립트를 제공한다. xd-admin, xd-container 혹은 xd-singlenode를 구동하던간에 명령뒤에 --help를 붙임으로써 도움을 얻을 수 있다.


toddsonui-MacBook-Pro:bin devsun$ ./xd-admin --help


 _____                           __   _______

/  ___|          (-)             \ \ / /  _  \

\ `--. _ __  _ __ _ _ __   __ _   \ V /| | | |

 `--. \ '_ \| '__| | '_ \ / _` |  / ^ \| | | |

/\__/ / |_) | |  | | | | | (_| | / / \ \ |/ /

\____/| .__/|_|  |_|_| |_|\__, | \/   \/___/

      | |                  __/ |

      |_|                 |___/

1.1.0.RELEASE                    eXtreme Data



Started : AdminServerApplication

Documentation: https://github.com/spring-projects/spring-xd/wiki


Usage:

 --analytics [redis]   : How to persist analytics such as counters and gauges

 --help (-?, -h)       : Show this help screen

 --httpPort <httpPort> : Http port for the REST API server

 --mgmtPort <mgmtPort> : The port for the management server

 --verbose (-v)        : Display all configuration properties


Xd-admin 옵션


analytics - 분석 데이터를 저장하기 위한 데이터스토어. 디폴트는 redis이다.

help - 도움말을 출력한다.

httpPort - REST API Server의 http port. 기본값은 9393

mgmtPort - management server 포트. 기본값은 어드민 서버 포트


XDAdmin을 위한 http port를 지정하는 것을 권고한다. 만약 랜던포트를 사용할 경우 admin 서버의 톰캣이 시작되었을 때, 로그를 통해 확인할 수 있다.


Xd-Container 옵션


analytics - 분석 데이터를 저장하기 위한 데이터스토어. 디폴트는 redis이다.

groups - 컨테이너를 포함시키려는 그룹의 멤버쉽. comma 구분자 리스트

hadoopDistro - HDFS를 사용하기 위한 Hadoop 배포판. 세팅하지 않으면 HDFS를 사용할 수 없다.

help - 도움말을 출력한다.

mgmtPort - management server 포트. 기본값은 컨테이너 서버 포트


RDBMS 세팅


RDMS 세팅을 위해 xd/config/servers.yml을 살펴보자.


Datasource 설정을 변경함으로써 배치 작업 리파지토리를 변경할 수 있다.


spring:

  datasource:

    url: jdbc:hsqldb:hsql://${hsql.server.host:localhost}:${hsql.server.port:9101}/${hsql.server.dbname:xdjob}

    username: sa

    password:

    driverClassName: org.hsqldb.jdbc.JDBCDriver

    validationQuery: select 1 from INFORMATION_SCHEMA.SYSTEM_USERS

    

spring:

  datasource:

    testOnBorrow: true

    validationInterval: 30000

    maxActive: 100

    maxIdle: 100

    minIdle: 10

    initialSize: 0

    maxWait: 30000

    testOnReturn: false

    testWhileIdle: false

    timeBetweenEvictionRunsMillis: 5000

    minEvictableIdleTimeMillis: 60000

    removeAbandoned: false

    removeAbandonedTimeout: 60

    logAbandoned: false

#Tomcat JDBC Enhanced Attributes

#    jmxEnabled: true

#    fairQueue: true

#    abandonWhenPercentageFull: 0

#    maxAge: 0

#    useEquals: true

#    suspectTimeout: 0

#    alternateUsernameAllowed: false    


다음은 Spring Batch Job Repository에 대한 설정이다. 주의할 점은 spring.batch.initializer.enabled는 기본값이 true이다. 이것은 Spring Batch schema가 생성되어있지 않을 경우 자동으로 생성시켜주는 옵션이다. 이미 테이블이 생성되어 있다면 이것은 무시된다. 


spring:

  batch:

 Configure other Spring Batch repository values.  Most are typically not needed

    isolationLevel: ISOLATION_SERIALIZABLE

    clobType:

    dbType:

    maxVarcharLength: 2500

    tablePrefix: BATCH_

    validateTransactionState: true

    initializer:

       enabled: false


Zookeeper 세팅

현재 XD는 Zookeeper를 탑재하고 있지 않다. 이 글을 쓰는 시점에 적합한 버젼은 3.4.6이다. ZooKeeper 앙상블은 적어도 3개의 멤버로 구성하는 것을 권고하지만, 싱글 서버는 모든 XD up and running을 가질 필요가 있다. XD cluster의 탑레벨 노드로 생성되어질 Zookeeper의 root path를 설정할 수 있다. 이는 당신이 single ZK 인스턴스를 공유하는 독립적인 다중 클러스터에서 수행하는 것을 허용한다. servers.yml에서 설정을 수정할 수 있으며, 내용은 다음과 같다.

추가적으로 시간에 관련된 세팅을 변경할 수 있는데 내용은 다음과 같다.

  • sessonTimeout - 세션 타임아웃
  • connectionTimeout - Connection 타임아웃
  • intialRetryWait - 실패 연결 후 재시도 대기시간
  • retryMaxAttempts - 실패 연결 후 최대 재시도 횟수

Redis 세팅

Redis는 분산 모드로 수행될 때, 기본 전송 수단이다.

만약 Redis 인스턴스가 이미 수행중이라면 Spring XD를 위해서 사용할 수 있다. 기본으로 Spring XD는 Redis를 사용하기 위해서 localhost에 port 6379를 사용한다. 만약 변경하고 싶다면 servers.yml을 수정하면 된다. 만약 기존재하는 Redis가 없다면 Spring XD가 다운로드 될 때 제공하는 인스턴스를 사용할 수 있다.  만약 Spring XD installation 디렉토리의 Redis를 설치하고 싶다면 아래와 같은 커맨드를 수행하자.

$ cd redis/bin
$ ./install-redis
이 명령은 Redis source tar를 컴파일 하고 redis/bin 하위에 수행가능한 Redis를 추가한다.
  • redis-check-dump
  • redis-sentinel
  • redis-benchmark
  • redis-cli
  • redis-server


다음 redis를 구동하자.


toddsonui-MacBook-Pro:bin devsun$ ./redis-server

[3872] 16 Mar 14:38:59.453 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf

[3872] 16 Mar 14:38:59.454 * Max number of open files set to 10032

                _._

           _.-``__ ''-._

      _.-``    `.  `_.  ''-._           Redis 2.8.3 (00000000/0) 64 bit

  .-`` .-```.  ```\/    _.,_ ''-._

 (    '      ,       .-`  | `,    )     Running in stand alone mode

 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379

 |    `-._   `._    /     _.-'    |     PID: 3872

  `-._    `-._  `-./  _.-'    _.-'

 |`-._`-._    `-.__.-'    _.-'_.-'|

 |    `-._`-._        _.-'_.-'    |           http://redis.io

  `-._    `-._`-.__.-'_.-'    _.-'

 |`-._`-._    `-.__.-'    _.-'_.-'|

 |    `-._`-._        _.-'_.-'    |

  `-._    `-._`-.__.-'_.-'    _.-'

      `-._    `-.__.-'    _.-'

          `-._        _.-'

              `-.__.-'


[3872] 16 Mar 14:38:59.455 # Server started, Redis version 2.8.3

[3872] 16 Mar 14:38:59.455 * The server is now ready to accept connections on port 6379


RabbitMQ 사용


만약 실행중인 RabbitMQ 인스턴스가 있다면 Spring XD에서 사용할 수 있다. Spring XD에서는 기본적으로 localhost 포트 5672로 접근을 수행한다. 기본적인 계정 인증은 guest/guest를 가정한다. 변경하고 싶다면 servers.yml을 수행할 수 있다. 


분산모드 시작하기


Spring XD는 두가지의 서버로 구성된다.


XDAdmin - 컨테이너로 모듈 배포를 관리

XDContainer - 모듈을 수행


아래와 같은 커맨드로 각각 시작할 수 있다.


xd/bin>$ ./xd-admin

xd/bin>$ ./xd


Spring XD는 모듈의 출력을 다음 모듈의 입력 데이터로 전송한다. 일반적으로 컨테이너 노드간에서는 리모트 전송이 요구된다. 또한 Admin 서버 또한 데이터 버스를 job launch channel을 이용해서 메시지를 전송해 작업을 실행하기 위해서 이용한다. Admin과 모든 컨테이너에의해 똑같은 전송이 공유되기 떄문에 전송 설정은 servers.yml에 있다. 기본 전송은 redis이다. 전송 방법을 변경하기 위해서는 rabiit이라고 전송방법을 명시하거나 다른 지원하는 전송방법을 변경하면 된다. 전송방법에 변경은 클러스터의 모든 XD node에 복제되어야 한다.


만약 다수의 XD 인스턴스가 하나의 RabbitMQ 서버를 공유하고 있다면 각 시스템이 같은 이름의 스트림을 포함하고 있다면 이슈가 될 수 있다. 각 시스템에 대한 다른 RabbitMQ virtual 호스트를 사용하는 것을 추천한다. servers.yml에  spring.rabbitmq.virtual.host 프로퍼티를 업데이트 함으로써 XD의 정확한 virual host를 지정할 수 있다.


기본적으로 XD 컨테이너는 분석 데이터를 redis에 저장한다. --analytic 옵션을 통해 다른 스토어를 지정할 수 있다.


또한 추가적인 설정 옵션은 다음과 같다. Spring XD 설치 위치를 지정하자. 


export XD_HOME=<Specific XD install directory>


XD Admin의 http port는 다음과 같이 명시한다.


xd/bin>$ ./xd-admin --httpPort <httpPort>


XD 컨테이너 노드는 기본적으로 server port 0 부터 시작한다. 이것은 사용가능한 http port를 스캔한다는 것을 의미한다. 만약 XD 컨테이너의 HTTP endpoint를 제거한다면 server.port=-1 로 세팅하면 된다. 단 이러한 경우는 PassS 환경에서 HTTP source 지원이 제대로 동작하지 않을 수 있다.  일반적으로 XD는 특정한 port로 바인드하도록 요구되기 때문이다. XDAdmin, XDContainer 프로세스는 server.port로 바인드 된다.


하둡 사용하기


Spring XD에서는 다음과 같은 Hadoop 배포판을 지원한다.

  • hadoop25 - Apache Hadoop 2.5.2

  • hadoop26 - Apache Hadoop 2.6.0 (default)

  • phd21 - Pivotal HD 2.1 and 2.0

  • cdh5 - Cloudera CDH 5.3.0

  • hdp22 - Hortonworks Data Platform 2.2


하둡 클라이언트 연결에 사용될 배포판 라이브러리를 명시하기 위해 --hadoopDistro 옵션을 사용한다.

xd/bin>$ ./xd-shell --hadoopDistro <distribution>
xd/bin>$ ./xd-admin
xd/bin>$ ./xd-container --hadoopDistro <distribution>



분산모드에서 쉘 사용하기


만약 XD-Shell이 admin server와 다른 서버에 배포되었다고 가정하자. 아래와 같이 admin server를 세팅할 수 있다.


shell/bin>$ ./xd-shell

admin config server <yourhost>:9393




'Programming > Spring XD' 카테고리의 다른 글

Spring XD - DIRT(Distributed Runtime)  (0) 2015.03.16
Spring XD - Source Module 개발하기  (0) 2015.03.05
Spring XD - Modules  (0) 2015.03.04
Spring XD - Streams  (0) 2015.03.03
Spring XD - Job Module 개발하기  (0) 2015.02.05
Comments