Heart's Develop Inside (WP)

Heart's Develop Blog in WordPress.com

Storm wiki : Concepts 정리

leave a comment »

Topologies

  • 실시간 어플리케이션 로직이 위치
  • M/R job 과 유사
    • M/R job 은 배치 데이터가 모두 처리되면 종료
    • Topology 는 (실행 종료시키기 전까지) 무한정 동작
  • spout 과 bolt 들이 stream grouping 들로 연결되어 있는 그래프
  • Resource (참고자료)

Streams

  • 끝이 없는(unbounded) 튜플(tuple) 순열(sequence)
  • 스키마
    • tuple 의 필드 명
  • tuple data type
    • 기본
      • integer, long, short, byte, string, double, float, boolean, byte array
    • custom type
      • serializer 를 정의하면 포함 가능
  • 선언 시 ID 부여
    • Stream 을 하나만 사용하는 spouts 과 bolts 가 자주 사용됨
      • OutputFieldsDeclarer 는 Stream id 를 지정하지 않는 하나의 Stream 을 선언 가능
        • stream id = “default” 가 됨
  • Resource (참고자료)

Spouts

  • Topology 내의 stream 들에 대한 공급자(source)
  • 외부 출처에서 tuple 들을 읽고 topology 로 방출(emit)
  • 신뢰성 유/무 구성
    • 신뢰성 있는(reliable)
      • Storm 에서 처리에 실패한 tuple 에 대해 재처리(replay) 가 가능
    • 신뢰성 없는(unreliable)
      • 방출한 tuple 을 잊어버림 (관리하지 않음)
  • 하나 이상의 Stream 을 방출할 수 있음
    • 여러 개의 Stream 들을 선언
      • OutputFieldsDeclarer.declareStream()
    • 방출 시 Stream 지정
      • SpoutOutputCollector.emit()
  • nextTuple()
    • 새로운 tuple 을 topology 로 방출
      • 방출할 새로운 tuple 이 없을 경우 바로 리턴
    • 반드시 실행 중 block 되면 안된다
      • Storm 은 spout 의 모든 메소드들을 같은 thread 로 호출
      • ack(), fail() 등의 타 메소드가 호출될 수 없음
  • ack() / fail()
    • spout 에서 방출된 tuple 이 성공적으로 처리되거나, 처리에 실패한 경우 호출됨
    • 신뢰성 있는 spout 에서만 호출됨
  • Resource (참고자료)

Bolts

  • Topology 내의 모든 처리는 bolt 에서 수행
    • filtering, functions, aggregations, joins, DB operation 등과 그 외의 모든 것
  • 간단한 stream 변환(transformation) 도 가능
    • 복잡한 stream 변환은 보통 여러 단계 처리를 요함
      • 단계 별로 bolt 가 필요할 수 있음
  • 하나 이상의 Stream 을 방출할 수 있음
    • 방법은 Spout 과 동일
    • SpoutOutputCollector -> OutputCollector 만 다름
  • input stream 들을 선언
    • 다른 컴포넌트(Spout, Bolt) 의 특정 stream 들을 구독(subscribe)
    • 여러 stream 들을 구독
      • stream 하나하나 각각 구독 필요
    • default stream id 로 선언된 stream 을 구독
      • InputDeclarer 는 syntactic sugar 를 제공
      • 컴포넌트 1 의 default stream 을 구독
        • declarer.shuffleGrouping(“1”)
        • declarer.shuffleGrouping(“1”, DEFAULT_STREAM_ID) 와 동일
  • execute()
    • 새로운 tuple 을 입력으로 받음
    • OutputCollector 객체를 통해 새로운 tuple 을 방출
    • 처리된 tuple 에 대해 ack() 를 호출해야 함
      • Storm 이 tuple 에 대한 처리 완료 여부를 확인할 수 있게 함
    • ack 를 자동으로 처리해 주는 IBasicBolt 인터페이스 제공
      • input tuple 을 받고 관련된 0 ~ N 개의 tuple 을 방출하는 경우 활용 가능
  • 새로운 쓰레드를 띄워 비동기 처리를 해도 괜찮음
    • OutputCollector 는 thread-safe 하며 아무때나 호출 가능함
  • Resource (참고자료)

Streaming Groupings

  • 어떻게 stream 입력이 bolt task 들에 나누어질 지에 대한 전략
  • 6가지 타입 존재
    • Shuffle grouping
      • 임의 분포됨 (randomly distributed)
      • 각 bolt 는 같은 수의 tuple 을 받도록 보장됨
    • Fields grouping
      • 대상 field 가 명시됨
      • 같은 field 값을 갖는 tuple 들은 하나의 bolt 에서 처리됨
    • All grouping
      • 모든 bolt 에 tuple 이 복제됨
        • 사용에 주의를 요함
    • Global grouping
      • stream 이 하나의 bolt task 에 할당됨
        • 가장 낮은 id 를 갖고 있는 task 에 할당
    • None grouping
      • stream grouping 에 대한 전략을 명시하지 않는 것
      • 현재는 shuffle grouping 과 같다
      • 최종적으로는 (Eventually though) 가능하다면 Storm 은 none grouping 을 사용하는 bolt 에 대해 자신이 구독하는 spout 이나 bolt 와 같은 thread 에서 동작하도록 끌어내리게(push down) 된다
    • Direct grouping
      • 공급자(producer) 가 tuple 공급 시점에 어떤 소비자(consumer) 에게 공급할 것인지 결정
      • direct stream 으로 선언한 stream 에만 적용 가능
      • OutputCollector.emitDirect() 로 방출
      • 소비자의 task id 를 얻는 방법
        • TopologyContext 사용
        • OutputCollector.emit() 의 output 을 추적
          • tuple 이 보내진 task id 가 리턴됨
  • Resource (참고자료)
    • TopologyBuilder: topology 를 정의할 때 사용
    • InputDeclarer: TopologyBuilder.setBolt() 의 리턴으로 얻어짐, Bolt 의 input stream 과 grouping 방법을 규정
    • CoordinatedBolt: this bolt is useful for distributed RPC topologies and makes heavy use of direct streams and direct groupings

Reliability

  • Storm 은 모든 spout tuple 들이 topology 에서 모두 처리되는 것을 보증
    • 모든 spout tuple 에 대해 연관된 tuple 들을 tree 로 구성하고 이를 추적 (tracking)
    • tuple tree 가 모두 성공적으로 처리되었는지 판별
  • message timeout
    • spout tuple 이 timeout 내에 처리되지 않으면 tuple 을 실패 처리하고 재처리 (replay)
  • 신뢰성을 얻기 위해 해야 하는 작업
    • tuple tree 에 node 가 추가되는 경우 Storm 에 알려야 함
      • Anchoring
        • OutputCollector.emit()
    • 개별 tuple 이 처리 완료 되었을 때 Storm 에 알려야 함
      • Ack
        • OutputCollector.ack()
  • 자세한 사항

Tasks

  • task 는 하나의 thread 에 해당
    • 각 spout 이나 bolt 는 cluster 에서 많은 task 들을 실행
  • Stream grouping 은 하나의 task 집합에서 다른 task 집합으로 tuple 을 보낼 방법을 정의하는 것
  • TopologyBuilder 의 setSpout() 과 setBolt() 를 통해 병렬 처리 설정 가능

Workers

  • worker 는 하나의 process 에 해당
    • topology 는 하나 혹은 여러 개의 worker process 들을 실행
  • 하나의 physical JVM 이며, topology 의 task 들(subset) 을 실행
  • Storm 은 Worker 사이에 공평하게 task 를 나누려고 시도
    • 300 개의 task 동시 실행 설정 + 50 개의 worker = 1개의 worker 가 6개의 task 실행
  • Resource (참고자료)
Advertisements

Written by kabhwan

2013년 8월 18일 , 시간: 12:52 오후

Storm에 게시됨

Tagged with

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: