SlideShare a Scribd company logo
스톰Storm 훑어보기
최범균 2014-01-17
스톰Storm
● 데이터의 스트림을 처리하는 시스템
○ 실시간 데이터 처리 목적
○ 예 - 주식 실시간 트레이딩, 기계 데이터 분석

● 주요 특징
○ 프로세싱 병렬 실행
■ 클러스터에서 연산 수행
○ 안정성
■ 데이터의 처리를 보장
○ 내고장성(fault-tolerant)
■ 프로세스 재시작으로 작업 재할당
토폴로지/클러스터
● 토폴로지(topology)
○
○
○
○

데이터 처리 프로그램 단위
데이터의 흐름을 정의
데이터 변환을 구현
물리적으로 jar 파일 형태로 클러스터에 전송

● 스톰 클러스터(cluster)
○ 토폴로지를 실행
○ 다수의 JVM에서 토폴로지의 각 작업을 병렬 실행
스톰 토폴로지
토폴로지(topology):
데이터 스트림 처리를 위한 작업 단위

스파우트(Spout):
스트림 데이터를
볼트에 전달.
외부 메시징 시스
템 등에서 데이터
가져옴

이미지 출처: http://storm-project.net/

볼트(Bolt):
데이터를 처리해서
다른 볼트에 전달
하거나 외부에 저
장
스트림의 데이터: 튜플
튜플은 [이름:값, 이름:값, 이름:값, …] 형식의 데이터

튜플

튜플

튜플

볼트는 튜플을 입력으로 받아 연산 수행 후,
새로운 튜플을 생성해서 다른 볼트에 전달 또는
연산 결과를 별도 처리(DB 저장 등)
스톰 클러스트
● 토폴로지를 실행
님버스(Nimbus):
토폴로지의 각 태스크를 Worker에
할당하고, 모니터링

수퍼바이저(Supervisor):
토폴로지의 태스크를 실행하기 위
해 worker 프로세스 생성

토폴로지:
jar 파일

Nimbus
(master)

주키퍼(Zookeeper):
토폴로지의 실행 상태 보관

Zookeeper 클러스터

Supervisor

Supervisor

Supervisor
개발자가 해야 할 일
● 스톰 클러스터 구축
● 코드 구현
○ 스파우트 구현
○ 볼트 구현
○ 토폴로지 구성
-- 토폴로지 구성 예
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("word-reader", new WordReader());
builder.setBolt("word-normalizer", new WordNormalizer()).shuffleGrouping("word-reader");
builder.setBolt("word-counter", new WordCounter()).shuffleGrouping("word-reader");

word-reader

word-normalizer

word-counter
병렬 실행
● 워커worker 프로세스
○

클러스터에서 생성되는 JVM 프로세스, 토폴로지 단위로 설정 가능

● executor
○
○

스파우트/볼트를 실행하는 쓰레드, worker가 생성
스파우트/볼트 단위로 개수 지정, 지정하지 않으면 1개 사용

● 태스크task
○
○

스파우트/볼트 당 생성할 작업(인스턴스) 개수
지정하지 않으면 executor 당 1개
builder.setBolt("word-normalizer", new WordNormalizer(), 4) // 4개의 쓰레드
.setNumTasks(8) // 8개의 작업 생성
.shuffleGrouping("word-reader");
conf.setNumWorkers(2); // worker 프로세스 2개
* 1개 worker에서 2개 쓰레드 실행 / 1개 쓰레드가 2개의 태스크를 실행
* 즉, 각 worker에서 4개의 태스크 실행
스트림 그룹핑
● 태스크가 2개 이상일 때 각 태스크에 튜플을
분배하는 기준 필요
1번 태스크로 전
달?

word-reader 스파우트

word-normalizer 볼트
튜플

튜플

1번 태스크
2번 태스크
스트림 그룹핑 종류
그룹핑

설명

Shuffle
(None도 동일)

각 튜플을 랜덤하게 볼트 태스크로 보낸다. 각 태스크에 보내지
는 튜플은 균등한다.

Field

튜플의 지정한 필드 값을 이용해서 볼트 태스크를 선택한다. 동
일 필드 값을 가진 튜플은 같은 볼트 태스크로 전달된다.

All

동일 튜플이 모든 볼트 태스크에 전달된다.

Direct

튜플을 생성하는 쪽에서 직접 볼트 태스크를 지정한다.

Global

n개의 태스크 중, 작은 ID를 가진 태스크로 튜플을 전달한다.

* Global Grouping 사용 이유에 대한 힌트:
https://groups.google.com/forum/#!msg/storm-user/JalFsPvksxw/l4RnjM7qI0wJ
-- 코드 샘플
builder.setBolt("word-normalizer", new WordNormalizer(), 4).shuffleGrouping("word-reader");
builder.setBolt("word-counter", new WordCounter(), 2).fieldGrouping("word-reader", new Field(“word”));
스파우트와 볼트 구현 방식
public class WordReader extends BaseRichSpout {
// 튜플을 스트림으로 보낼 때 사용
private SpoutOutputCollector collector;

public class WordNormalizer extends BaseRichBolt {
private OutputCollector collector;
@Override
public void prepare(Map conf, TopologyContext context,
OutputCollector collector) {
this.collector = collector;
…. // 데이터 처리 위한 준비
}

@Override
public void open(Map conf, TopologyContext context,
SpoutOutputCollector collector) {
this.collector = collector;
// 메시지 큐 연결 등의 처리
}

@Override
public void execute(Tuple input) {
String sentence = input.getString(0);
String[] words = sentence.split(" ");
for (String word : words) {
word = word.trim().toLowerCase();
// 다른 볼트에 전달할 튜플 생성
collector.emit(new Values(word));
}
collector.ack(input);
}

@Override
public void nextTuple() {
… // 데이터를 읽어와 알맞은 튜플 생성
collector.emit(new Values(line), line);
}
@Override
public void declareOutputFields(
OutputFieldsDeclarer declarer) {
// 생성할 튜플의 필드 정의
declarer.declare(new Fields("line"));
}

@Override
public void declareOutputFields(
OutputFieldsDeclarer declarer) {
// 볼트가 튜플 생성할 경우, 필드 정의
declarer.declare(new Fields("word"));
}

@Override
public void close() { …연결 종료 등 처리 }
}
}
메시지(튜플) 처리 여부 확인
public class WordReader extends BaseRichSpout {
@Override
public void nextTuple() {
…
collector.emit(new Values(line), msgId);
}
@Override
public void ack(Object msgId) {
// 처리가 된 튜플의 아이디 수신
}
@Override
public void fail(Object msgId) {
// 처리에 실패한 튜플의 아이디 수신
// 실패 메시지에 대한 알맞은 재처리 필요
}

public class WordNormalizer extends BaseRichBolt {
@Override
public void execute(Tuple input) {
try {
String sentence = input.getString(0);
String[] words = sentence.split(" ");
for (String word : words) {
word = word.trim();
if (!word.isEmpty()) {
word = word.toLowerCase();
collector.emit(new Values(word));
}
}
collector.ack(input); // 메시지 처리 됨을 알림
} catch(Exception e) {
collector.fail(input); // 메시지 처리 실패 알림
}
}

}

* 스파우트는 ack()와 fail()을 통해 발생시킨 메시지가 처리되었는지 알 수 있음
* 스파우트가 fail 메시지를 받는 경우:
- 수신 볼트에서 fail() 호출하거나 메시지를 제한된 시간 안에 처리하지 못한 경우
* 튜플의 처리 여부 상태를 메모리로 관리하므로, 반드시 수신 볼트에서 ack와 fail을 해야 함
최초의 메시지가 여러 튜플을 거치면?

word-reader
ack로 인식

word-normalizer
ack

collector.emit(new Values(word));
collector.ack(input);

fail 응답이 원본 스파우트에 전
달되지 않음

word-counter
collector.fail(input);
Anchoring
● 메시지를 연결해서 전체에서 처리되었는지
확인하기 위한 방법
연결된 모든 튜플에 대해
ack를 받을 때 비로서 ack 처리

word-reader

word-normalizer
ack

-- 스트림에서 받은 input을 연결
collector.emit(input, new Values(word));
collector.ack(input);

ack

word-counter
collector.ack(input);
Fault tolerance
● 워커 프로세스 죽을 때
○ 수퍼바이저가 워커 프로세스 재 구동

● 님버스/수퍼바이저가 죽을 때
○ 얼른 재시작하면, 태스크 재시작

● 님버스가 실행 중인 노드가 죽을 때
○ 얼른 다른 장비 구해서 님버스 실행
■ 수퍼바이저는 기능 제공

● 수퍼바이저가 실행 중인 노드가 죽을 때
○ 님버스가 노드에서 실행 중인 태스크를 다른 노드에
할당
기타
●
●
●
●
●
●

스톰 클러스터 설치
Trient
다중 언어 지원
주키퍼
스톰 + Esper
Kestrel (메시지 큐)

More Related Content

What's hot

SPARK SQL
SPARK SQLSPARK SQL
SPARK SQL
Juhui Park
 
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Andrew Sungjin Kim
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
NAVER D2
 
android_thread
android_threadandroid_thread
android_thread
handfoot
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11
hungrok
 
[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기
[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기
[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기
NAVER D2
 
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
NAVER D2
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
NAVER D2
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
Minchul Jung
 
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
NAVER D2
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요KTH
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
Byeongsu Kang
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
sung ki choi
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민
종민 김
 
Java start01 in 2hours
Java start01 in 2hoursJava start01 in 2hours
Java start01 in 2hours
Kenu, GwangNam Heo
 
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
NAVER D2
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정HyeonSeok Choi
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
NAVER D2
 
elasticsearch
elasticsearchelasticsearch
elasticsearch
승우 백
 

What's hot (20)

SPARK SQL
SPARK SQLSPARK SQL
SPARK SQL
 
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
Infiniflux vs influxdb 비교 테스트 결과 2016 12월-v2
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
 
android_thread
android_threadandroid_thread
android_thread
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11
 
[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기
[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기
[225]빅데이터를 위한 분산 딥러닝 플랫폼 만들기
 
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
 
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민
 
Java start01 in 2hours
Java start01 in 2hoursJava start01 in 2hours
Java start01 in 2hours
 
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
[D2 COMMUNITY] Spark User Group - 스파크를 통한 딥러닝 이론과 실제
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
 
elasticsearch
elasticsearchelasticsearch
elasticsearch
 

Viewers also liked

지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기
Ted Won
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
beom kyun choi
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Yongho Ha
 
Storm begins
Storm beginsStorm begins
Storm begins
SungMin OH
 
Storm - parallel and distributed
Storm - parallel and distributedStorm - parallel and distributed
Storm - parallel and distributed
Taewoo Kim
 
Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)Channy Yun
 
HBase 훑어보기
HBase 훑어보기HBase 훑어보기
HBase 훑어보기
beom kyun choi
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
beom kyun choi
 
하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기
beom kyun choi
 
Resource Aware Scheduling in Apache Storm
Resource Aware Scheduling in Apache StormResource Aware Scheduling in Apache Storm
Resource Aware Scheduling in Apache Storm
DataWorks Summit/Hadoop Summit
 
Apache Storm 0.9 basic training - Verisign
Apache Storm 0.9 basic training - VerisignApache Storm 0.9 basic training - Verisign
Apache Storm 0.9 basic training - Verisign
Michael Noll
 
Apache storm vs. Spark Streaming
Apache storm vs. Spark StreamingApache storm vs. Spark Streaming
Apache storm vs. Spark Streaming
P. Taylor Goetz
 
스톰 접근 중
스톰 접근 중스톰 접근 중
스톰 접근 중June Yi
 
오픈소스 라이선스 세미나 (2014/07/15)
오픈소스 라이선스 세미나 (2014/07/15)오픈소스 라이선스 세미나 (2014/07/15)
오픈소스 라이선스 세미나 (2014/07/15)
Changwoo Ryu
 
대표적인 오픈 소스 라이센스 요약 - 장형주
대표적인 오픈 소스 라이센스 요약 - 장형주대표적인 오픈 소스 라이센스 요약 - 장형주
대표적인 오픈 소스 라이센스 요약 - 장형주
ETRIBE_STG
 
[D2 fest 2014]오픈소스sw 그리고 라이선스
[D2 fest 2014]오픈소스sw 그리고 라이선스[D2 fest 2014]오픈소스sw 그리고 라이선스
[D2 fest 2014]오픈소스sw 그리고 라이선스NAVER D2
 
메리 미커 인터넷 트렌드 요약
메리 미커 인터넷 트렌드 요약메리 미커 인터넷 트렌드 요약
메리 미커 인터넷 트렌드 요약
beom kyun choi
 
Storm - understand by coding
Storm - understand by codingStorm - understand by coding
Storm - understand by coding
Taewoo Kim
 
[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)
[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)
[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)NAVER D2
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
beom kyun choi
 

Viewers also liked (20)

지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
 
Storm begins
Storm beginsStorm begins
Storm begins
 
Storm - parallel and distributed
Storm - parallel and distributedStorm - parallel and distributed
Storm - parallel and distributed
 
Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)Realtime Big data Anaytics and Exampes of Daum (2013)
Realtime Big data Anaytics and Exampes of Daum (2013)
 
HBase 훑어보기
HBase 훑어보기HBase 훑어보기
HBase 훑어보기
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 
하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기하둡 (Hadoop) 및 관련기술 훑어보기
하둡 (Hadoop) 및 관련기술 훑어보기
 
Resource Aware Scheduling in Apache Storm
Resource Aware Scheduling in Apache StormResource Aware Scheduling in Apache Storm
Resource Aware Scheduling in Apache Storm
 
Apache Storm 0.9 basic training - Verisign
Apache Storm 0.9 basic training - VerisignApache Storm 0.9 basic training - Verisign
Apache Storm 0.9 basic training - Verisign
 
Apache storm vs. Spark Streaming
Apache storm vs. Spark StreamingApache storm vs. Spark Streaming
Apache storm vs. Spark Streaming
 
스톰 접근 중
스톰 접근 중스톰 접근 중
스톰 접근 중
 
오픈소스 라이선스 세미나 (2014/07/15)
오픈소스 라이선스 세미나 (2014/07/15)오픈소스 라이선스 세미나 (2014/07/15)
오픈소스 라이선스 세미나 (2014/07/15)
 
대표적인 오픈 소스 라이센스 요약 - 장형주
대표적인 오픈 소스 라이센스 요약 - 장형주대표적인 오픈 소스 라이센스 요약 - 장형주
대표적인 오픈 소스 라이센스 요약 - 장형주
 
[D2 fest 2014]오픈소스sw 그리고 라이선스
[D2 fest 2014]오픈소스sw 그리고 라이선스[D2 fest 2014]오픈소스sw 그리고 라이선스
[D2 fest 2014]오픈소스sw 그리고 라이선스
 
메리 미커 인터넷 트렌드 요약
메리 미커 인터넷 트렌드 요약메리 미커 인터넷 트렌드 요약
메리 미커 인터넷 트렌드 요약
 
Storm - understand by coding
Storm - understand by codingStorm - understand by coding
Storm - understand by coding
 
[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)
[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)
[D2 fest 2014]개발자와 오픈소스(git기반 협업모델 소개)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 

Similar to Storm 훑어보기

Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
도현 김
 
Programming Cascading
Programming CascadingProgramming Cascading
Programming Cascading
Taewook Eom
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
Chang Yoon Oh
 
5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스
SeoYeong
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3david nc
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
Taeoh Kim
 
서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료
김용범 | 무영인터내쇼날
 
Data Structures
Data StructuresData Structures
Data Structures
skku_npc
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
MIN SEOK KOO
 
수퍼콜라이더 워크샵 자료
수퍼콜라이더 워크샵 자료수퍼콜라이더 워크샵 자료
수퍼콜라이더 워크샵 자료
Sungmin Park
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Circulus
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
MIN SEOK KOO
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern종빈 오
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
hungrok
 
Programming java day2
Programming java day2Programming java day2
Programming java day2Jaehoonyam
 

Similar to Storm 훑어보기 (20)

Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 
Programming Cascading
Programming CascadingProgramming Cascading
Programming Cascading
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
강의자료4
강의자료4강의자료4
강의자료4
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료서울 R&D 캠퍼스 자연어 수업자료
서울 R&D 캠퍼스 자연어 수업자료
 
Data Structures
Data StructuresData Structures
Data Structures
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
 
Thread programming
Thread programmingThread programming
Thread programming
 
수퍼콜라이더 워크샵 자료
수퍼콜라이더 워크샵 자료수퍼콜라이더 워크샵 자료
수퍼콜라이더 워크샵 자료
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
 

More from beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
beom kyun choi
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
beom kyun choi
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
beom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
beom kyun choi
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
beom kyun choi
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
beom kyun choi
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)
beom kyun choi
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
beom kyun choi
 

More from beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 

Storm 훑어보기

  • 2. 스톰Storm ● 데이터의 스트림을 처리하는 시스템 ○ 실시간 데이터 처리 목적 ○ 예 - 주식 실시간 트레이딩, 기계 데이터 분석 ● 주요 특징 ○ 프로세싱 병렬 실행 ■ 클러스터에서 연산 수행 ○ 안정성 ■ 데이터의 처리를 보장 ○ 내고장성(fault-tolerant) ■ 프로세스 재시작으로 작업 재할당
  • 3. 토폴로지/클러스터 ● 토폴로지(topology) ○ ○ ○ ○ 데이터 처리 프로그램 단위 데이터의 흐름을 정의 데이터 변환을 구현 물리적으로 jar 파일 형태로 클러스터에 전송 ● 스톰 클러스터(cluster) ○ 토폴로지를 실행 ○ 다수의 JVM에서 토폴로지의 각 작업을 병렬 실행
  • 4. 스톰 토폴로지 토폴로지(topology): 데이터 스트림 처리를 위한 작업 단위 스파우트(Spout): 스트림 데이터를 볼트에 전달. 외부 메시징 시스 템 등에서 데이터 가져옴 이미지 출처: http://storm-project.net/ 볼트(Bolt): 데이터를 처리해서 다른 볼트에 전달 하거나 외부에 저 장
  • 5. 스트림의 데이터: 튜플 튜플은 [이름:값, 이름:값, 이름:값, …] 형식의 데이터 튜플 튜플 튜플 볼트는 튜플을 입력으로 받아 연산 수행 후, 새로운 튜플을 생성해서 다른 볼트에 전달 또는 연산 결과를 별도 처리(DB 저장 등)
  • 6. 스톰 클러스트 ● 토폴로지를 실행 님버스(Nimbus): 토폴로지의 각 태스크를 Worker에 할당하고, 모니터링 수퍼바이저(Supervisor): 토폴로지의 태스크를 실행하기 위 해 worker 프로세스 생성 토폴로지: jar 파일 Nimbus (master) 주키퍼(Zookeeper): 토폴로지의 실행 상태 보관 Zookeeper 클러스터 Supervisor Supervisor Supervisor
  • 7. 개발자가 해야 할 일 ● 스톰 클러스터 구축 ● 코드 구현 ○ 스파우트 구현 ○ 볼트 구현 ○ 토폴로지 구성 -- 토폴로지 구성 예 TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("word-reader", new WordReader()); builder.setBolt("word-normalizer", new WordNormalizer()).shuffleGrouping("word-reader"); builder.setBolt("word-counter", new WordCounter()).shuffleGrouping("word-reader"); word-reader word-normalizer word-counter
  • 8. 병렬 실행 ● 워커worker 프로세스 ○ 클러스터에서 생성되는 JVM 프로세스, 토폴로지 단위로 설정 가능 ● executor ○ ○ 스파우트/볼트를 실행하는 쓰레드, worker가 생성 스파우트/볼트 단위로 개수 지정, 지정하지 않으면 1개 사용 ● 태스크task ○ ○ 스파우트/볼트 당 생성할 작업(인스턴스) 개수 지정하지 않으면 executor 당 1개 builder.setBolt("word-normalizer", new WordNormalizer(), 4) // 4개의 쓰레드 .setNumTasks(8) // 8개의 작업 생성 .shuffleGrouping("word-reader"); conf.setNumWorkers(2); // worker 프로세스 2개 * 1개 worker에서 2개 쓰레드 실행 / 1개 쓰레드가 2개의 태스크를 실행 * 즉, 각 worker에서 4개의 태스크 실행
  • 9. 스트림 그룹핑 ● 태스크가 2개 이상일 때 각 태스크에 튜플을 분배하는 기준 필요 1번 태스크로 전 달? word-reader 스파우트 word-normalizer 볼트 튜플 튜플 1번 태스크 2번 태스크
  • 10. 스트림 그룹핑 종류 그룹핑 설명 Shuffle (None도 동일) 각 튜플을 랜덤하게 볼트 태스크로 보낸다. 각 태스크에 보내지 는 튜플은 균등한다. Field 튜플의 지정한 필드 값을 이용해서 볼트 태스크를 선택한다. 동 일 필드 값을 가진 튜플은 같은 볼트 태스크로 전달된다. All 동일 튜플이 모든 볼트 태스크에 전달된다. Direct 튜플을 생성하는 쪽에서 직접 볼트 태스크를 지정한다. Global n개의 태스크 중, 작은 ID를 가진 태스크로 튜플을 전달한다. * Global Grouping 사용 이유에 대한 힌트: https://groups.google.com/forum/#!msg/storm-user/JalFsPvksxw/l4RnjM7qI0wJ -- 코드 샘플 builder.setBolt("word-normalizer", new WordNormalizer(), 4).shuffleGrouping("word-reader"); builder.setBolt("word-counter", new WordCounter(), 2).fieldGrouping("word-reader", new Field(“word”));
  • 11. 스파우트와 볼트 구현 방식 public class WordReader extends BaseRichSpout { // 튜플을 스트림으로 보낼 때 사용 private SpoutOutputCollector collector; public class WordNormalizer extends BaseRichBolt { private OutputCollector collector; @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { this.collector = collector; …. // 데이터 처리 위한 준비 } @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { this.collector = collector; // 메시지 큐 연결 등의 처리 } @Override public void execute(Tuple input) { String sentence = input.getString(0); String[] words = sentence.split(" "); for (String word : words) { word = word.trim().toLowerCase(); // 다른 볼트에 전달할 튜플 생성 collector.emit(new Values(word)); } collector.ack(input); } @Override public void nextTuple() { … // 데이터를 읽어와 알맞은 튜플 생성 collector.emit(new Values(line), line); } @Override public void declareOutputFields( OutputFieldsDeclarer declarer) { // 생성할 튜플의 필드 정의 declarer.declare(new Fields("line")); } @Override public void declareOutputFields( OutputFieldsDeclarer declarer) { // 볼트가 튜플 생성할 경우, 필드 정의 declarer.declare(new Fields("word")); } @Override public void close() { …연결 종료 등 처리 } } }
  • 12. 메시지(튜플) 처리 여부 확인 public class WordReader extends BaseRichSpout { @Override public void nextTuple() { … collector.emit(new Values(line), msgId); } @Override public void ack(Object msgId) { // 처리가 된 튜플의 아이디 수신 } @Override public void fail(Object msgId) { // 처리에 실패한 튜플의 아이디 수신 // 실패 메시지에 대한 알맞은 재처리 필요 } public class WordNormalizer extends BaseRichBolt { @Override public void execute(Tuple input) { try { String sentence = input.getString(0); String[] words = sentence.split(" "); for (String word : words) { word = word.trim(); if (!word.isEmpty()) { word = word.toLowerCase(); collector.emit(new Values(word)); } } collector.ack(input); // 메시지 처리 됨을 알림 } catch(Exception e) { collector.fail(input); // 메시지 처리 실패 알림 } } } * 스파우트는 ack()와 fail()을 통해 발생시킨 메시지가 처리되었는지 알 수 있음 * 스파우트가 fail 메시지를 받는 경우: - 수신 볼트에서 fail() 호출하거나 메시지를 제한된 시간 안에 처리하지 못한 경우 * 튜플의 처리 여부 상태를 메모리로 관리하므로, 반드시 수신 볼트에서 ack와 fail을 해야 함
  • 13. 최초의 메시지가 여러 튜플을 거치면? word-reader ack로 인식 word-normalizer ack collector.emit(new Values(word)); collector.ack(input); fail 응답이 원본 스파우트에 전 달되지 않음 word-counter collector.fail(input);
  • 14. Anchoring ● 메시지를 연결해서 전체에서 처리되었는지 확인하기 위한 방법 연결된 모든 튜플에 대해 ack를 받을 때 비로서 ack 처리 word-reader word-normalizer ack -- 스트림에서 받은 input을 연결 collector.emit(input, new Values(word)); collector.ack(input); ack word-counter collector.ack(input);
  • 15. Fault tolerance ● 워커 프로세스 죽을 때 ○ 수퍼바이저가 워커 프로세스 재 구동 ● 님버스/수퍼바이저가 죽을 때 ○ 얼른 재시작하면, 태스크 재시작 ● 님버스가 실행 중인 노드가 죽을 때 ○ 얼른 다른 장비 구해서 님버스 실행 ■ 수퍼바이저는 기능 제공 ● 수퍼바이저가 실행 중인 노드가 죽을 때 ○ 님버스가 노드에서 실행 중인 태스크를 다른 노드에 할당
  • 16. 기타 ● ● ● ● ● ● 스톰 클러스터 설치 Trient 다중 언어 지원 주키퍼 스톰 + Esper Kestrel (메시지 큐)