41
가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 서버 개발팀 김민우 1

KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

Embed Size (px)

DESCRIPTION

1년 7개월 장수 모바일 게임 쿠키런. 많은 유저, 하루에도 쏟아지는 많은 로그. Time To Market 단축이 핵심 역량 중 하나가 되는 모바일 게임 시장. 자주 빠르게 변경되는 스팩, 로그도 마찬가지로 자주 빠르게 변경되는 스키마. 이런 현실속에서 게임 개발과 운영, 데이터 분석까지 병행 하기 위해서 가볍고 유연한 아키텍처로 적당히 빠르게 데이터 분석을 하는 쿠키런 서버팀 사례를 소개합니다.

Citation preview

Page 1: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

가볍고 유연하게 데이터 분석하기

: 쿠키런 사례 중심

서버 개발팀 김민우

1

Page 2: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

2

• 김민우 - [email protected] - http://julingks.tistory.com

• 전산과 졸업 • 스타트업 1호 맴버로 조인, 2010년 말 KT에 인수 • 선임 연구원

- 빅 데이터 분석 플랫폼 개발 및 연구

• 서버팀 - 쿠키런 게임 서버 개발 - LINE 쿠키런 서비스 총괄

강연자 소개

Page 3: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

대표 게임

3

LINE COOKIE RUN 출시 : 2014년 1월 주요 국가 : 일본, 대만, 태국 등 2014년 상반기 태국, 대만 게임 다운로드 1위 기록 총 21개 국가 애플 앱스토어 최고 매출 순위 10위권 기록

쿠키런 for Kakao 출시 : 2013년 4월 주요 국가 : 대한민국 2013년 대한민국 단일 게임 다운로드 순위 1위 기록 [App Annie] 2013년 대한민국 단일 게임 매출 순위 3위 기록 [App Annie] 출시 후 1년 5개월간 매출 순위 상위권(10위 이내) 유지

OvenBreak 시리즈 출시 : 2009년 6월 주요 국가 : 미국, 캐나다, 영국, 호주 등 2010년 11월 미국, 캐나다, 영국 등 20개 국가 애플 앱스토어 무료 1위 기록 2011년 6월 미국, 중국, 캐나다 등 18개 국가 애플 앱스토어 무료 1위 기록 2012년 12월 미국 애플 앱스토어 무료 10위 기록(OvenBreak2)

2,000만 다운로드

2,000만 다운로드

3,900만 다운로드

Page 4: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

서버팀이 하는 일

• 게임 서버 개발 • 게임 운영 관리 도구 개발 • 게임 리소스 관리 시스템 개발 • 게임 로그 분석 시스템 개발 • 게임 서비스 운영, 모니터링 • 인프라 관리 • 장애 대응

• 클라이언트 개발팀에서 하는 것 빼고 정말 다 하고 있어요 … - 정말 레알 DevOps

4

Page 5: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

데이터 좀 뽑아 주세요~ 네!?상황이 이렇다 보니..

5

Page 6: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

다양한 로그 분석 요구 사항

• KPI 지표 - 일별 접속자 수, 일별 매출, 구매 유저의 평균 사용 금액

• 게임 벨런싱 - 유저 레벨 분포, 이벤트 미션 달성률

• 게임 기획 - 요즘 가장 많이 이용하는 쿠키와 펫 조합은 뭐죠?

• 어뷰징 대응 - 메모리 해킹, APK 변조, 변조 API 요청 - 어뷰징인가요? 정상 플레인가요?

• CS 대응 - 보물이 사라졌어요 - 믿어야 될지 말아야 될지..?

6

Page 7: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

오늘 접속한 유저 수는 몇 명인가요?가장 쉬운 것 부터

7

Page 8: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

KPI 지표

• DAU (일별 유저수) • WAU (주간 고유 유저수) • MAU (월별 고유 유저수) • PU (구매한 고유 유저수) • ARPPU (구매한 유저의 평균 사용 금액) • 등등…

• 물론 게임 비지니스 플랫폼에서 제공

• 그래도 우리도 알고 있어야 되지 않을까?

8

Page 9: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

9

• 결제 로그는 가장 중요하므로 트랜잭션으로 보호가 필요 • 따라서 신뢰성이 보장되는 RDB에 저장

• 크리스탈 입/출 로그도 중요 로그이므로 RDB에 저장 • 출석시 1개의 크리스탈 지급 (접속 로그와 동일)

• SQL 쿼리로 간단하게 - 크리스탈 입/출 로그에서 DAU, WAU, MAU를 구함 - 결제 로그에서 PU, ARPPU 등을 구함

• 실시간으로 추이를 보고 싶어요 … 아.. 그래요?

KPI 지표

Auto Scaling group

Page 10: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

지표의 추이를 실시간으로 보고 싶어요

• StatsD + Graphite 를 적용 - 본래 시스템 모니터링에 사용하고 있음

• StatsD - 통계 정보를 수집하는 네트웍 데몬 - UDP 또는 TCP로 통계 정보를 보냄

• Graphite • StatsD에 쌓인 통계 정보를 그래프로 시각화

10

https://github.com/etsy/statsd/

Page 11: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

지표의 추이를 실시간으로 보고 싶어요

• StatsD + Graphite 시스템 모니터링으로 사용 - 플레이 시작시, 플레이 종료시 - 메소드 평균 응답 시간 (병목 구간을 찾을 수 있음)

• 유저가 접속시, 구매시 UDP 요청을 StatsD로 보냄

• 주의 : UDP이므로 신뢰성을 보장할 수 없다 (1~5% 유실) - 실시간 추이를 파악하는 데 적합함

11

Page 12: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

유저 레벨 분포 알려주세요~게임 벨런싱

12

모든게 RDB에 있으면 좋으련만… 세상일이 그렇게 쉬운게 아니지

Page 13: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

레벨 정보는 어디에 저장되어 있나?

• 유저 데이터 저장소는 를 사용 - 문서 지향 NoSQL 데이터 베이스 - 분산 Key-Document 저장소

• 예)

13

{ level : 15, // 레벨 coin : 1500, // 코인 crystal : 20, // 크리스탈 …

}

F29F2COW2ZCQPF

키 : 유저별 고유 식별키 값 : JSON 형식의 텍스트

Auto Scaling group

Page 14: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

어디에서 분석하지?

• 누적 2,000만 유저 • 약 1 TB 정도 • 준 구조화된 데이터 (JSON 형식)

• 1TB 작다면 작고 크다면 큰 크기인데.. (빅이냐? 스몰이냐? 누구냐 넌) • 우선 하둡에 넣어보자 :-3

• 어떻게든 분석할 수 있겠지… - MapReduce, Pig, Hive, Cascading

14

Page 15: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

Hadoop (하둡)

• 빅데이터의 상징이 되어버린.. • GFS와 MapReduce 논문의 오픈소스 구현체 • 2.x 이후 분산 애플리케이션 플랫폼으로 변신 중 (YARN)

• 수십, 수백대 머신을 하나의 파일 시스템 처럼 사용할 수 있다

• 파일 시스템에 저장된 대용량 데이터를 Map함수와 Reduce함수로 병렬 처리하여 빠르게 분석할 수 있다

• 그나저나 하둡을 어떻게 띄우지!?

15

Page 16: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

아마존 EMR

• 아마존 Elastic MapReduce • 하둡 클러스터를 손쉽게 구성해준다

• CLI를 이용하면 10여분 만에 수십대의 하둡 클러스터를 생성

• Couchbase 데이터를수십대 노드 하둡 클러스터로 어떻게 가져오지?

16

./elastic-mapreduce --create --alive --name “Hadoop Cluster" \ --num-instances=30 --master-instance-type=m1.large --hive-interactive

예시

Page 17: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

아파치 Sqoop

• RDB에 있는 데이터를 하둡으로 가져온다 • Couchbase에서는 sqoop-plugin을 제공

• Couchbase에 저장된 데이터를 하둡으로 가져올 수 있다

17

Auto Scaling group

sqoop { level : 15, // 레벨 coin : 1500, // 코인 crystal : 20, // 크리스탈 …

}

bin/sqoop import --connect http://10.2.1.55:8091/pools --table DUMP

Page 18: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

하둡의 데이터를 어떻게 분석하지?

• 하둡에 1TB 데이터를 가져왔는데 어떻게 분석하지? - MapReduce 구현 - 추상화된 도구인 Hive, Pig, Cascading

• 가장 익숙한 Hive를 선택

• SQL-like 쿼리로 하둡의 데이터를 분석할 수 있다 • HQL을 Map-Reduce 변환하여 데이터를 처리하고 결과를 보낸다

18

Page 19: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

Hive에서 JSON을 어떻게 한담?

• Hive에서는 테이블의 Row를 읽고 쓸때 SerDe를 사용 • Row를 실제 파일 시스템에 어떻게 쓸고 읽을 것이냐를 결정

• 기본적으로 제공하는 SerDe들 - Avro, ORC, RegEx, Thrift, Parquet

• Hive JSON SerDe

19

https://github.com/rcongiu/Hive-JSON-Serde

Page 20: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

20

AWS CLI

Auto Scaling group

Page 21: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

21

AWS CLI

Auto Scaling group

클러스터 생성

Page 22: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

22

AWS CLI

Sqoop

{ level : 15, // 레벨 coin : 1500, // 코인 crystal : 20, // 크리스탈 …

}

Auto Scaling group

클러스터 생성

Page 23: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

23

AWS CLI

Sqoop

{ level : 15, // 레벨 coin : 1500, // 코인 crystal : 20, // 크리스탈 …

}

SELECT count(1) FROM t1 GROUP BY levelHadoop

Job

Auto Scaling group

클러스터 생성

Page 24: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

24

AWS CLI

Sqoop

{ level : 15, // 레벨 coin : 1500, // 코인 crystal : 20, // 크리스탈 …

}

SELECT count(1) FROM t1 GROUP BY levelHadoop

Job

Auto Scaling group

클러스터 생성

결과

Page 25: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

이 방식으로 추출 가능했던 분석 결과들

• 최고 점수 분포 • 유저 레벨 분포 • 최고 점수 상위 N 명 • 쿠키별 보유량 • 보물 보유량 • 펫 보유량 • 부스터 보유량 • 사용자 라이프 타임 분포

- 처음 접속 ~ 접속을 안한지 한달전

25

Page 26: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

이벤트 미션 달성률 알려주세요이제 진짜 게임 로그 분석

26

Page 27: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

미션 달성률 알려주세요

• 무모한 도전 - 100여개의 도전, 이전 도전을 깨야만 다음 도전이 나온다 - 적절한 난이도가 필수

- 쫌만 더 하면 깰 수 있을것 같은데… (이 느낌이 제일 중요) - 깰 수 없는 어려운 도전이라고 느끼면 쉽게 포기하고 만다

- 유저들이 어느 도전에서 넘어가지 못하고 있는지 알려주세요!

27

Page 28: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

게임 로그는 어디에 저장되나?

• 게임 서버(Tomcat)는 JSON 텍스트 파일을 로컬 디스크에 남김 • 하루에 200~400GB 수준, 1년치가 100TB 수준 • 해당 게임 로그는 최종 S3에 적재

28

Auto Scaling group

S3

Page 29: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

아마존 S3

• 아마존의 간단한 저장 서비스 • 비교적 싸고 안전하게 보관 • 하둡에서 HDFS 대신 S3 사용 가능 (S3NativeFileSystem) • 다음으로 하둡 위에서 분석을 수행

• 필요할 때 클러스터를 만들어 분석한다 - 데이터 지역성(locality)은 떨어지나 수십 노드의 계산 능력만 사용한다고 생각하면 맘이 편하다

- 실제로는 의외로 빠른 성능. 응!? 속도는 노드 댓수로 극복

29

Page 30: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

분석 결과

30

도전 종류 달성률이전 도전 달성률과 차이

보너스타임 많이가기 1회 달성 71.5% 2.4%

핑크곰 젤리 획득하기 300개 달성 69.0% 2.5%

거대 생명물약 획득하기 4개 달성 66.6% 2.4%

점프 많이하기 240회 달성 61.0% 5.5%

게임중 코인 획득하기 700코인 달성 59.6% 1.4%

왕 곰젤리 획득하기 15개 달성 58.3% 1.3%

장애물 많이 충돌하기 4회 달성 57.2% 1.2%

보너스타임 오래하기 6초 달성 56.0% 1.2%

부활 많이하기 1회 달성 53.7% 2.3%

젤리 많이 획득하기 3,000개 달성 52.5% 1.2%

장애물 많이 통과하기 5회 달성 51.6% 1.0%

슬라이드시간 오래하기 100초 달성 48.2% 3.4%

게임중 점수 획득하기 250만점 달성 46.4% 1.8%

핑크곰 젤리 획득하기 650개 달성 45.3% 1.1%

밑으로 갈수록 어려운 도전

난이도가 비슷하게 상승하다가 갑자기 높아지는 도전들이 존재

난이도 조정이 필요

Page 31: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

여러 소스의 데이터 분석 하기

31

Auto Scaling group

S3

…sqoop

게임 로그

게임 데이터

유저 데이터

Page 32: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

이 유저만 조사 해주세요서울에서 김서방 찾기

32

Page 33: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

33

• CS 문의 - 잠깐 한눈 파는 사이에 고양이가 핸드폰을 밟고 지나가서 보물이 팔렸어요

- 진짜 그 보물은 가지고 있었던 걸까?

• 어뷰징 - 용감한 쿠키로 1억점 달성 - 불가능한 점수 달성한 유저의 기록을 발견 - 다른 플레이 기록도 보고 싶은데요?

이 유저만 조사 해주세요

Page 34: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

이 유저만 조사 해주세요

• 하둡 - 배치 데이터 분석을 목적으로 하는 시스템 - 모든 데이터를 다 읽어야 하는 불편한 진실

• 대부분의 요구 사항이 특정 유저가 특정 기간에 게임 로그 조회 요청

• 회원 번호와 날짜로 인덱스를 만들자! - 날짜별로 저장된 게임 로그를 회원 번호로 정렬 - 블록 시작 위치와 길이, 시작과 끝 회원번호를 저장하는 인덱스 생성 - 인덱스 파일을 읽어서 필요한 파일과 블록만 읽는

InputFormatter 를 구현

34

Page 35: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

데이터 분석 첫 걸음마내가 해 봤는데 말이지..

35

Page 36: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

이런 데이터를 뽑아보면 좋을것 같은데..

• 데이터 분석의 가치를 조직에 전파하기 위해서는 첫 출발이 좋아야

• 목적 없이 시작하면 의외의 발견을 할 수도 있으나 가치있는 결과를 얻지 못할 가능성이 높음

• 선 목적 후 분석 - 어떤 목적을 가지고 데이터를 추출할 것이냐? - 그 목적을 달성하려면 어떤 데이터가 필요한 것인가? - 그 데이터를 분석해서 목적을 달성할 수 있는가?

36

Page 37: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

주어진 현실

• 하루에도 쏟아지는 많은 게임 로그, 자주 빠르게 변경되는 스키마

• 개발하기도 벅찬데 로그 분석? 형식이 자꾸 바뀌는 데 어떻게 해야되지? - 무조건 남기고 본다, 필요할때 나중에 분석

• 노드 100대 클러스터!? - 클러스터 운영 비용은 고스란히 인건비와 시간을 빼앗아간다

• 구글링 해도 안나와요. - 내가 잘못한건가요? 오픈소스 버그인가요?

• 오픈소스의 소스 레벨까지 이해할 수 있는 엔지니어가 필요 - 찾기 힘듬. In House 로 해결하자.

37

Page 38: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

가볍게, 유연하게, 적당히 빠르게

• 최대한 AWS의 장점을 활용한다 - 클러스터는 한번 쓰고 버리는 물건 - 간단한 python 스크립트, 쉘 스크립트로도 수십, 수백대의 클러스터를 이용한 분석 가능

• 분석 싸이클 시간 절약에 집중하여 아키텍처를 구성 - 로컬 머신에서도 손 쉽게 분석 가능

• 누구나 쉽게 분석할 수 있는 개발 접근성 향상에 집중 - 너도 나도 클러스터 생성 가능 - 분석 시간을 줄여줄 간단한 도구를 개발하는 데 시간 투자

38

Page 39: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

마무으리

• 소수의 인원으로도 대형 클러스터를 운용 가능 - AWS, 관련 오픈소스의 성장

• DevOps의 장점을 최대한 활용 - 서비스 운영, 개발, 테스트, 배포, 아키텍처 구성 - 모두 한 팀에서 하므로 적은 커뮤니케이션 비용으로 다양한 시도가 가능

- 여러가지 새로운 도구와 프로세스를 빠르게 도입할 수 있음 - 프로세스 혁신이 게임 서버 개발 만큼 우선 순위가 높은 과제 - “프로그램이 할 수 있는 일은 사람이 하지말자”

39

Page 40: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

앞으로 뭐하지?

• 준 실시간 분석이 가능하도록 시스템 개선 중 • 카운트, 조인, 집계를 넘어선 클러스터링, 머신러닝 등 고급 분석을 위한 준비중

• 페어 프로그래밍을 할 팀원 모집 중입니다. • [email protected]

40

Page 41: KGC 2014 가볍고 유연하게 데이터 분석하기 : 쿠키런 사례 중심 , 데브시스터즈

41

감사합니다