Workflow 기반 실시간 스트리밍 데이터 수집 분석...

Post on 13-Aug-2020

6 views 0 download

Transcript of Workflow 기반 실시간 스트리밍 데이터 수집 분석...

Workflow 기반

실시간 스트리밍 데이터 수집/분석 플랫폼

2013.11.6 최규민

About Us

아프리카TV(2012~)- 실시간 대용량 데이터처리시스템 개발을 위한 데이터수집 / 데이터 마이닝 / 대용량 메시징 시스템 설계 및 개발업무를 담당

플러스기술(2004~) - 대용량의 네트워크 트래픽 수집 및 분석/분류 시스템 개발

시앤시인스트루먼(1999~) – LAN/WLAN 프로토콜 분석 시스템 개발

goodvc@afreeca.com or goodvc78@gmail.com

Word Cloud

발표의 순서

구현 기술 소개

20%

10%

70%

Workflow 기반 실시간 스트리밍

데이터 수집/분석 이란?

설문조사를 하겠습니다.

1. 각자 스마트 꺼내 주세요. 2. 아래 접속해 주세요 왜 해야 하는지 모르시겠다구요?

http://p2013.afreeca.com

5. 경품이 있습니다.

http://p2013.afreeca.com

최고급 모자

4명에게 드립니다.

각 투표자 별로 당첨자가 있습니다.

http://p2013.afreeca.com

투표를 시작해 주세요

http://p2013.afreeca.com

어떻게 구현 되었을까요?

투표 데이터 수집

데이터 처리

서비스 제공

http://collector.afreecatv.com/push_api.php? ns=vote.rawdata & id=1 & subject=vote & vote=1 & ip=127.0.0.1 & ua=ie23

1. 데이터를 저장하고 2. 투표를 집계하고 3. 경품 당첨자인지 확인하고 4. 기타 내역을 분석해서 5. 출력할 데이터를 전달합니다.

Long-polling으로 데이터 즉시 반영합니다.

사용자가 적으면?

사용자가 많으면? 대량의 데이터 수집 / 실시간 데이터 처리 / 분산 환경

source: http://citizentekk.com/2013/10/09/facebook-vs-twitter-real-time-analytics

FaceBook

Twitter

전달 적재

배치

실시간

수집

아프리카TV는 왜?

방송생성 : 10만건/일

방문자수: 300만/일

방송 시청(입장/퇴장) : 4000만/일

유저 활동(좋아요,아이템,즐겨찾기 등) : ?? / day

방송 채팅 : 아주 많아요~~~

우선 데이터가 많아서 필요합니다.

Live 방송 추천

실시간 방송 랭킹

실시간 모바일 Push

방송할 때 할 일도 많아요

방송 상세 분석

방송 완료 후 아카이브

이런 일을 할려면??

안정성

확장성

범용성

Failover coordinator

Scale-out Load-balancing

Workflow 기반 데이터 처리 c/c++,java,php client language

1차 시스템 설계 : 알고 있는 시스템으로 조합해 보자

1차 개발 시스템 구성도

HOST1

Log-Agent : mysql pcap

ap1

Scrib

e

netw

ork

HOST2

HOST3

HOST4

HOST5

Flow-Agentⓕ

af1

Scrib

e

Sin

k

API 지원데몬?

Collectorⓕ

c1

Colle

ctor

MQ

Collectorⓕ

c2

Colle

ctor

MQ

Collectorⓕ

c3

Colle

ctor

MQ

MQ-Broker

HOST6

Flow-Agentⓕ

af3

Sin

k

API 지원데몬 : Access-log를

통한 수집

exe

c

클러

스터

Job ⓕ

job1

exe

c

RM

Q-S

ink

Namespace ‘A’ 요청

메시지

A

처리 결과, 에러

job2

B

Namespace ‘B’ 요청

FO : 지원 LB : 미지원

Failover 시 메시지 Loss발생 (초당 100건 전송시

3건 정도)

FO

: 미지원

(reco

nnect로

구현

) LB : 미

지원

FO : 미지원(reconnect로구현)

LB : 미지원

MQ-Broker는 Routing방식으로 설정

2차 개발 설계 중복제거 : Flume ≒ scribe ≒ MQ

그래서 MQ

host1

Log-Agent : mysql pcap

ap1

MQ

-sink

new

ork

host2

Svlxextr3

Svlxextr4

MQ-Broker `

host3

Log-Agent

af3

MQ

-sink

exe

c

클러스터링

job1

exe

c

RM

Q-S

ink

Namespace ‘A’ 요청

메시지

A

처리 결과, 에러

job2

B

Namespace ‘B’ 요청

FO : 미지원(reconnect로구현) LB : 미지원

FO : 미지원(reconnect로구현)

LB : 미지원

음 조끔 심플해 졌네~~

3차 개발 설계 Failover/LB는 어떻게?

기존 서비스 = L4/DNS 신규 개발 부분 = zookeeper+workflow-lib

Agent-Tier

서비스 적용 (Collector-API)

Collect-Tier Workflow-Tier

PcapStreamer (Network packet)

ExeStreamer (tail-f등)

ActiveMQ-Cluster

L4

NGINX / UDP

Broker

NGINX / UDP

Broker

NGINX / UDP

Broker

MQB

Failo

ver

Observer Observer Observer

Coordinator : zookeeper (Failover, Datapipeline, Sharding)

서비스 적용 (UDP-socket)

MySQL-UDF (Trigger 등록)

Z

File-append

Workflow-Lib (c/c++, java, php)

AMQ Connector

Failover, LB (collector-Tier)

Coordinator연동

Status-Update

L4/DNS + Zookeeper/Workflow-Lib

실제 개발해보니

Collect-Tier

Agent-Tier

Workflow1 In: que1 Out:que2

Que1

Zookeeper

ZK 등

ZK 등

Workflow2 In: que2 Out:- Que2

큰그림

①전송

②전달

③수신

④전송

⑤전달 ⑥수신

Agent-Tier Agent-Tier

좀더 상세히 알아 봅시다.

데이터 수집 [Agent-Tier]

데이터 전달 [Collect-Tier]

데이터 처리 [Workflow-

Tier]

데이터 수집 [Agent-Tier]

데이터 수집 [Collect-Tier]

데이터 수집 [Agent-Tier]

데이터 포멧?

연동 방식 ?

추가 개발?

개발 기간?

서비스 영향?

환경이 틀림?

저희의 선택은 데이터에 맞추어 수집 방식을 선택하자

다양한 구간에서 데이터 수집

L4 WebServer

Access-log

DBMS

변경된 내역

Collector-Tier

Network Packet

PcapStreamer

Exestreamer (tail )

Collector API

UDP JDBC

MySQL-UDF

Collector API

Exestreamer (tail )

데이터

위변조

∙Raw

Pack

et

추출

데이터

유실가능

서비스

영향Ⅹ

서비스

변경Ⅹ

데이터 유실가능

서비스 영향Ⅹ

Traffic Mirroring

다양한 구간에서 데이터 수집

L4 WebServer

Access-log

DBMS

변경된 내역

Collector-Tier

Network Packet

PcapStreamer

Exestreamer (tail )

Collector API

UDP JDBC

MySQL-UDF

Collector API

Exestreamer (tail )

데이터

위변조

∙Raw

Pack

et

추출

데이터

유실가능

서비스

영향Ⅹ

서비스

변경Ⅹ

데이터 유실가능

서비스 영향Ⅹ

Traffic Mirroring

다양한 방식을 통해 적절한 방법 선택

Collector-API

지금까지 해 온대로 만드시면 됩니다.

UDP-Socket 방식

서비스 영향Ⅹ 연결 비용 ↓ 성능↑

100% 수신Ⅹ 데이터 재조합

시리얼라이제이션

MTU=1500

네트워크 패킷 수집 방식(Pcapstreamer)

인터넷

Client-PC

L4

Packet Mirroring

Afreeca WebServers

pcapstreamer#1

pcapstreamer#N

서비스 영향Ⅹ Agent설치 Ⅹ 서비스 변경 Ⅹ

데이터 유실가능 Raw Packet

미러 환경구성

Libpcap, winpcap

MySQL UDF(FileWritter)

DB DB [Trigger등록]

Rep.

File-append

tail

변경내역 file

Exestreamer

Collector

AMQ

Agent설치 Ⅹ 서비스 변경 Ⅹ

Table 의존성

AfreecaTV에서 이렇게 수집해요

• MySQL-UDF : 방송시작, 종료 등 DB데이터

• Collector-API : 별풍선, 추천, 로그인 등 서비스 API

• UDP-socket : 방송시청 시작/종료, 채팅 등 대량 전송

• PcapStreamer : 검색어 관련 등 네트워크 패킷수집

데이터 전달 [Collect-Tier]

데이터 수집 [Agent-Tier]

데이터 처리 [Workflow-Tier]

Message Queue Architecture 적용

Source=https://confluence.pegasus.isi.edu/display/stampede/Message+Queue+Architecture

투표

실시간 처리

5초 Term 처리

결과 출력

HDFS저장

“닮은꼴 설문조사” Message Queue 적용

vote.rt.log

vote.rt.rank

vote.rt.match

vote.rawdata

vote.term.5sec

투표

실시간 처리

5초 Term 처리

결과 출력

HDFS저장 1시간

Term 처리

vote.rt.log

vote.rt.rank

vote.rt.match

vote.rawdata

vote.term.5sec

vote.term.1hour

“닮은꼴 설문조사” Message Queue 적용

Message Queue 선택

1. Queue / Topic 지원 2. Dynamic한 데이터 파이프의 추가/변경/삭제 3. 다양한 client language지원(c/c++, java, php) 4. Broker 클러스터 지원 (complete graph network topology) 5. 중단 없는 클러스터 확장

ActiveMQ에 대하여 좀더 알아 봅시다.

-

2,000

4,000

6,000

8,000

10,000

12,000

110 1k 10k 100k 1M

ActiveMQ

전송 시간(초)

RabbitMQ

전송 시간(초)

ActiveMQ vs RabbitMQ 성능 비교

설정값(기본): queue방식, durable=false, theard=1, transacted=false, ack-mode=auto

Producer 1대

Broker 1대

Consumer 1대

Java 기반

다양한 Client language & Protocol 지원

2013.10.21

5.9.0 released Multicast방식 cluster topology 지원

ActiveMQ가 최선입니까?

Message Routing

ActiveMQ의 Message Routing 방식

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

메시지의 수신과 처리를 비동기로 처리함

ActiveMQ의 Message Routing

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

ActiveMQ의 Message Routing.

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

ActiveMQ의 Message Routing.

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

ActiveMQ의 Message Routing.

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

이런 큐는 미 처리된 메시지로 인해 발생하는 Wait-Time을 줄이기 위함 (pending queue=2.5*prefatch)

ActiveMQ의 Message Routing.

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

예외로 메시지 당 처리시간이 긴 경우는 prefatch size=0

ActiveMQ의 Message Routing.

P1

B1

B3 B2

C1

C2

Broker Cluster

Sending Queue

Pending Queue

Prefatch Queue

예외로 메시지 당 처리시간이 긴 경우는 prefatch size=0

Slow consumer

P1

C1

C2

fast

slow

Pending queue 적재량이 늘어남 Slow consumer발생 시 : 16k/sec 7k/sec

Pending Queue Size Monitoring

P1 C1

ActiveMQ 이슈 1. Consumer, Producer connection은 분리(stomp) 2. jvm maxium heap size에 따른 최대 pending

queue size. JVM Memory 설정 최대 queue 적재량 메시지 사이즈

2G 210만 건 80bytes

4G 450만 건 80bytes

16G 11,20만 건 80bytes

ActiveMQ cluster topology

B1 B2 B3

B9

B6 B4

B7 B8

B5

B2

B3 B4

B5 B7 B6

B1

B1

B2

B3

B4

B5 B6

B7 B8

B10

B9

B2

B3

B4

B5 B7

MESH RING

TREE Graph

ActiveMQ cluster topology : multicast를 이용한 complete graph 방식

P1

P2

P3

B2

B4 B3

C1

C2

C3

B1

B5

일반적인 메시지 전달

P2 B4 B3 C3

B1 P1

idle

normal

P2의 데이터가 일시적으로 급증하면?

P2 B4 B3 C3

B1 P1

idle

busy

P2 B4 B3 C3

B1 P1 장애

P2의 데이터가 일시적으로 급증하면?

P2 B4 B3 C3

B1 P1 장애

P2의 데이터가 일시적으로 급증하면?

장애 장애

그래서 Cluster topology를 재구성 했습니다. 라우팅을 최소화, 명료화 하도록

파티션

B2 B1

B2 B1

B2 B1

P1

P2

P3

C1

C2

ActiveMQ cluster topology : zookeeper 기반 cluster topology를 직집 구성

파티션

B2 B1 P1 C1

채팅과 같은 아주 큰 대용량은 직접전송을 채택

프로토콜 버퍼

UDP

Thrift

ZeroMQ

ActiveMQ가 최선입니까?

but, 향후 Messaging/Broker Layer를 추상화하여 좀더 심플한 Producer-Consumer 모델을 적용.

Not Bad..

데이터 처리 [Workflow-Tier]

데이터 전달 [Collect-Tier]

Workflow Lib( C/C++, JAVA, PHP)

Workflow 라이브러리가 지원하는 method

open()

ZK, AMQ 연결

run()

Message Listener등록 Watch 등록

close()

AMQ, ZK 연결해제

onMessage(msg)

send()

Producer 등록 AMQ로 메시지 전송

void main(String[] args) throws Exception { _wf = new PartitionWorkflow(); HashMap<String, Object> config = new HashMap<String, Object>(); config.put(Workflow.ARGS_ZOOKEEPER_URI,“host1:2181,host2:2181,host3:2181" ); config.put(Workflow.ARGS_WORKFLOW_NAME,"_Demo_Vote" ); config.put(Resource.AMQ_SOURCE_LISTENER, new PartitionListener()); config.put(Workflow.ARGS_PARTITION_NAME, "AfGameCenter" ); _wf.open(config); _wf.run(); waitForKeyPress(); _wf.close(); } class PartitionListener implements CollectorListener{ @Override synchronized public void onMessage(CollectorMessage message) throws Exception { processRTLog(message.body); proectRTRank(message.body) processRTFilter(message.body ); send(“hello”); } }

Workflow 구현 샘플 코드

Workflow 구현 사례

아프리카TV 검색어 분석 workflow

검색어 수집

formatter

afreeca.search.raw

afreeca.search.formatted

Search Rank

Related Search

HDFS Appender

formatter formatter

Search Rank Search Rank

배치 동기화

Afreeca.alarm

Connection-pooling & bulk-insert 로 활용 : mysql_insert, redis_pipe, hdfs_appender

Mysql_insert

INSERT INTO `log_tb` VALUES (‘log1‘) INSERT INTO `log_tb` VALUES (‘log1‘) INSERT INTO `log_tb` VALUES (‘log1‘)

방송시청 로그 Uid/bjid/시청시간

INSERT INTO `log_tb` VALUES (‘log1‘, ‘log2’, log3)

Redis_pipe

hset( foo,bar3,2) VALUES (‘log1‘) hset( foo,bar2,3) VALUES (‘log1‘) hset( foo,bar13,4)

방송시청 로그 Uid/bjid/시청시간

Hmset( foo, bar1,1,bar,2,bar3)

Update 구문은 사용할 수 없음(sequence보장안됨)

BJ 추천 하기( item based similarity )

방송 시청 진입

combiner

DW.stream.AF.CIN

방송 시청 퇴장

DW.stream.AF.COUT

HDFS Append

DW.stream.AF.VIEW

방송시청 로그 Uid/bjid/시청시간

BJ-Clustering MR

BJ-Similarity 측정 MR

결과 저장 (Redis)

BJ 추천 하기( item based similarity )

대용량 메시지 플랫폼 : 모바일 Push & 메시지 읽기/저장

메시지 전송 요청 API

Message.request

classifier

Message.one

Message.group

classifier classifier

classifier classifier Msg Sender

classifier classifier Msg Sender

REDIS-Storage

classifier classifier GCM Push

classifier classifier APNS Push Push.apns

Push.gcm

메시지 읽기 API DeviceToken

DB 동기화

REDIS-Storage REDIS-Storage

결론

- 데이터 수집은 서비스에 맞는 적절한 방식을 선택

- MQ기반의 데이터 처리 시스템 괜찮다. - Messaging Layer의 선택과 튜닝은 중요하며, Messaging Layer를 plugin 지원하는 것 고려

Q&A goodvc@afreeca.com or goodvc78@gmail.com