workflow 기반 실시간 스트리밍 데이터 수집 분석...
TRANSCRIPT
Workflow 기반
실시간 스트리밍 데이터 수집/분석 플랫폼
2013.11.6 최규민
About Us
아프리카TV(2012~)- 실시간 대용량 데이터처리시스템 개발을 위한 데이터수집 / 데이터 마이닝 / 대용량 메시징 시스템 설계 및 개발업무를 담당
플러스기술(2004~) - 대용량의 네트워크 트래픽 수집 및 분석/분류 시스템 개발
시앤시인스트루먼(1999~) – LAN/WLAN 프로토콜 분석 시스템 개발
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
전달 적재
배치
실시간
수집
아프리카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 지원하는 것 고려