SlideShare a Scribd company logo
1 of 16
Download to read offline
스톰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

Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...
Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...
Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...
confluent
 
Can Apache Kafka Replace a Database?
Can Apache Kafka Replace a Database?Can Apache Kafka Replace a Database?
Can Apache Kafka Replace a Database?
Kai Wähner
 

What's hot (20)

Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...
Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...
Kafka Connect: Operational Lessons Learned from the Trenches (Elizabeth Benne...
 
Low level java programming
Low level java programmingLow level java programming
Low level java programming
 
[Cloud OnAir] ゼロから始める Cloud Run 〜概要から実践まで全てをお届けします〜 2020 年 2 月 20 日放送
[Cloud OnAir] ゼロから始める Cloud Run 〜概要から実践まで全てをお届けします〜 2020 年 2 月 20 日放送[Cloud OnAir] ゼロから始める Cloud Run 〜概要から実践まで全てをお届けします〜 2020 年 2 月 20 日放送
[Cloud OnAir] ゼロから始める Cloud Run 〜概要から実践まで全てをお届けします〜 2020 年 2 月 20 日放送
 
Terraform vs Pulumi
Terraform vs PulumiTerraform vs Pulumi
Terraform vs Pulumi
 
Reactive programming with examples
Reactive programming with examplesReactive programming with examples
Reactive programming with examples
 
Apache kafka
Apache kafkaApache kafka
Apache kafka
 
Monitoring Apache Kafka
Monitoring Apache KafkaMonitoring Apache Kafka
Monitoring Apache Kafka
 
Apache Kafka Best Practices
Apache Kafka Best PracticesApache Kafka Best Practices
Apache Kafka Best Practices
 
Envoy and Kafka
Envoy and KafkaEnvoy and Kafka
Envoy and Kafka
 
Mininet multiple controller
Mininet   multiple controllerMininet   multiple controller
Mininet multiple controller
 
Real Time UI with Apache Kafka Streaming Analytics of Fast Data and Server Push
Real Time UI with Apache Kafka Streaming Analytics of Fast Data and Server PushReal Time UI with Apache Kafka Streaming Analytics of Fast Data and Server Push
Real Time UI with Apache Kafka Streaming Analytics of Fast Data and Server Push
 
ZeroMQ
ZeroMQZeroMQ
ZeroMQ
 
Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3
 
Scaling Apache Storm - Strata + Hadoop World 2014
Scaling Apache Storm - Strata + Hadoop World 2014Scaling Apache Storm - Strata + Hadoop World 2014
Scaling Apache Storm - Strata + Hadoop World 2014
 
Spy hard, challenges of 100G deep packet inspection on x86 platform
Spy hard, challenges of 100G deep packet inspection on x86 platformSpy hard, challenges of 100G deep packet inspection on x86 platform
Spy hard, challenges of 100G deep packet inspection on x86 platform
 
From Zero to Hero with Kafka Connect (Robin Moffat, Confluent) Kafka Summit L...
From Zero to Hero with Kafka Connect (Robin Moffat, Confluent) Kafka Summit L...From Zero to Hero with Kafka Connect (Robin Moffat, Confluent) Kafka Summit L...
From Zero to Hero with Kafka Connect (Robin Moffat, Confluent) Kafka Summit L...
 
Know your app: Add metrics to Java with Micrometer | DevNation Tech Talk
Know your app: Add metrics to Java with Micrometer | DevNation Tech TalkKnow your app: Add metrics to Java with Micrometer | DevNation Tech Talk
Know your app: Add metrics to Java with Micrometer | DevNation Tech Talk
 
Can Apache Kafka Replace a Database?
Can Apache Kafka Replace a Database?Can Apache Kafka Replace a Database?
Can Apache Kafka Replace a Database?
 
Kafka 101
Kafka 101Kafka 101
Kafka 101
 
Introduction to Apache Kafka
Introduction to Apache KafkaIntroduction to Apache Kafka
Introduction to Apache Kafka
 

Viewers also liked

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
 
스톰 접근 중
스톰 접근 중스톰 접근 중
스톰 접근 중
June Yi
 
대표적인 오픈 소스 라이센스 요약 - 장형주
대표적인 오픈 소스 라이센스 요약 - 장형주대표적인 오픈 소스 라이센스 요약 - 장형주
대표적인 오픈 소스 라이센스 요약 - 장형주
ETRIBE_STG
 
[D2 fest 2014]오픈소스sw 그리고 라이선스
[D2 fest 2014]오픈소스sw 그리고 라이선스[D2 fest 2014]오픈소스sw 그리고 라이선스
[D2 fest 2014]오픈소스sw 그리고 라이선스
NAVER D2
 
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
 

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 훑어보기

동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
xxbdxx
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
david nc
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
Ji Hun Kim
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern
종빈 오
 

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
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
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 캠퍼스 자연어 수업자료
 
android_thread
android_threadandroid_thread
android_thread
 
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
 

More from beom kyun choi

ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
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)
 

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 (메시지 큐)