Top Banner
“데이터, 데이터, 데이터” 참지 못하고 그는 외쳤다. “흙도 없이 벽돌을 만들 수는 없잖아!” - 셜록 홈즈, 너도밤나무집
46

WzDat과 Pandas를 통한 로그 데이터 분석

Jun 26, 2015

Download

Technology

WzDat로 로그 파일을 선택, 가공하고 Pandas로 고급분석을!
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: WzDat과 Pandas를 통한 로그 데이터 분석

“데이터,����������� ������������������  데이터,����������� ������������������  데이터”����������� ������������������  참지����������� ������������������  못하고����������� ������������������  그는����������� ������������������  외쳤다.����������� ������������������  

“흙도����������� ������������������  없이����������� ������������������  벽돌을����������� ������������������  만들����������� ������������������  수는����������� ������������������  없잖아!”����������� ������������������  ����������� ������������������  

- 셜록 홈즈, 너도밤나무집 中

Page 2: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat과 Pandas를 통한 로그 데이터 분석

Page 3: WzDat과 Pandas를 통한 로그 데이터 분석

과학의 패러다임 변천- from Jim Gray on eScience

• 수 천년 전 - 경험에 의해

• 수 백년 전 - 이론에 의해

• 수 십년 전 - 계산에 의해

• 현재 - 데이터 탐사에 의해

Page 4: WzDat과 Pandas를 통한 로그 데이터 분석

데이터 탐사의 단계!

1. 데이터를 수집

2. 데이터를 선별

3. 정보의 형태로 저장

4. 전문가가 분석

Page 5: WzDat과 Pandas를 통한 로그 데이터 분석

빅 데이터?• 하둡

• ~TB 단위의 분석에 적합

• 셋팅 및 MR코딩의 비용

• GB 단위는 다양한 방법이 가능

• SQL, NoSQL, 스크립트 등

• 저비용, Try & Discover에 유리

Page 6: WzDat과 Pandas를 통한 로그 데이터 분석

로그 (= 데이터?)

Page 7: WzDat과 Pandas를 통한 로그 데이터 분석

로그의 장점

• 개발자라면 누구나 사용

• NoSQL 원조 - 추가, 수정에 용이.

• 파일은 생각보다 안정적

• 문제 발생 후 사후 분석에 최적

• 장기간 보존이 필요 없다 - “Big Stream”

Page 8: WzDat과 Pandas를 통한 로그 데이터 분석

로그의 단점

• 여러개의 머신, 파일로 흩어져 있다.

• 하나의 타임 라인으로 보기 힘들다.

• 정규화 되어있지 않다.

Page 9: WzDat과 Pandas를 통한 로그 데이터 분석

로그가 데이터가 되려면

• 흩어져 있는 로그 파일들 -> 수집

• 서로 다른 파일 들 -> 하나의 타임라인으로 통합

• 정규화 되지 않은 로그 메시지들 -> 선별 및 정규화

Page 10: WzDat과 Pandas를 통한 로그 데이터 분석

바람직한 로그• 로그 파일 생성시 파일(경로)명에 필요한 정보

• 로그가 발생한 일시

• 로그를 생성한 서버의 종류

• 로그를 생성한 서버의 번호

• 로그 파일 내용에 필요한 할 정보

• 로그 메시지를 출력한 일시 (년:월:일 - 시:분:초)

• 로그 메시지의 레벨 (크리티컬, 에러, 워닝, 정보, 디버그)

• 로그가 수집될 때 파일(경로)에 필요한 할 정보

• 로그를 생성한 노드(머신) 이름 - 지역 정보 포함 권장

Page 11: WzDat과 Pandas를 통한 로그 데이터 분석

• 좋은 로그 파일명

C:/APPNAME-KR/GS101/AgentServer_2013-01-28.log

• 부족한 로그 파일명

C:/log.txt

Page 12: WzDat과 Pandas를 통한 로그 데이터 분석

• 좋은 로그 메시지

2013/06/28-13:07:59 [ERR] - File Open Error

2013/06/28-13:08:00 [WRN] - Player Log Out

!

• 부족한 로그 메시지

6/28 File Open Error

Player Log Out

Page 13: WzDat과 Pandas를 통한 로그 데이터 분석

로그 수집

Page 14: WzDat과 Pandas를 통한 로그 데이터 분석

로그 수집

• 분산되어 있는 로그를 한 곳으로 모으는 과정

• 기존 프로젝트 로그 수집

• 서비스 중인(파일기반) 로그 집중화의 목적

• 새로운 프로젝트 로그 수집

• 최신 솔루션 선택이 가능

Page 15: WzDat과 Pandas를 통한 로그 데이터 분석

Apps

Log

Apps

Log

Node

Apps

Log

Apps

Log

Node

Apps

Log

Apps

Log

Node

Log Node

Log Log

rsync

rsync

rsync

Page 16: WzDat과 Pandas를 통한 로그 데이터 분석

로그 선별, 저장 - WzDat“What’s That?”

Page 17: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat• 로그에서 의미 있는 데이터를 쿼리

• 단순하지만 강력한 파이썬 구문 형식

• 다량의 비 정규화된 로그 파일을 선별 후,

• 보거나

• 변환하거나 (-> Pandas 구조체)

• 저장(다운로드)

Page 18: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat

Page 19: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 셀렉터

뒤에 ~s가 붙은 복수형 단어, 각괄호 [ ] 로 조건 기술

• files - 파일 선택

• nodes - 노드(머신) 선택

• servers - 서버(앱) 선택

• dates - 일시(Date Time) 선택

Page 20: WzDat과 Pandas를 통한 로그 데이터 분석

files• 모든 파일을 선택

files

• 첫 번째, 마지막 파일

files[0], files[-1]

• 100번째 에서 10개 파일

files[100:110]

• 앞에서 10개, 뒤에서 10개

files[:10], files[-10:]

Page 21: WzDat과 Pandas를 통한 로그 데이터 분석

dates• 파일이 있는 모든 일시를 선택

dates

• 파일이 있는 첫 번째, 마지막 일시

dates[0], dates[-1]

• 같은 식으로

dates[100:110], dates[:10], date[-10:]

Page 22: WzDat과 Pandas를 통한 로그 데이터 분석

nodes• 파일을 만든 모든 노드(머신)를 선택

nodes

• 파일을 만든 첫 번째, 마지막 노드

nodes[0], nodes[-1]

• 같은 식으로

nodes[100:110], nodes[:10], nodes[-10:]

Page 23: WzDat과 Pandas를 통한 로그 데이터 분석

servers• 파일을 만든 모든 서버(앱)을 선택

servers

• 파일을 만든 첫 번째, 마지막 서버

servers[0], servers[-1]

• 같은 식으로

servers[100:110], servers[:10], servers[-10:]

Page 24: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 상수• ‘카테고리 . 이름’의 형식

• 파일 분석과정에서 자동으로 정의

• 상수의 카테고리는 공통, 이름은 프로젝트 별로 다양하다. (아래는 C9의 예)

• node.ASIA_1 # 아시아 1번 서버 머신

• server.GameServer # 게임서버

• date.D2013_07_11 # 2013년 7월 11일

Page 25: WzDat과 Pandas를 통한 로그 데이터 분석

상수로 필터링• 2013년 7월 11일 파일만

files[date.D2013_07_11]

• 게임 서버 파일만

files[server.GameServer]

• ASIA-1 노드에서 파일이 발생한 일시만

dates[node.ASIA_1]

Page 26: WzDat과 Pandas를 통한 로그 데이터 분석

상수 매칭

• 상수의 앞 문자열만 맞으면 모두 매칭

# node.ASIA_1, node.ASIA_2, … 식으로 여럿 있을 때

files[node.ASIA] # 모든 아시아 노드의 파일이 매칭

Page 27: WzDat과 Pandas를 통한 로그 데이터 분석

셀렉터의 결과로 필터링• 마지막 날의 파일만 선택

files[dates[-1]]

• 마지막 날 파일을 만든 노드만 선택

nodes[dates[-1]]

• 아시아 지역의 마지막 날 파일만 선택

files[dates[node.ASIA][-1]]

Page 28: WzDat과 Pandas를 통한 로그 데이터 분석

복합 조건 필터링

• 마지막 날의 게임서버 파일만

files[dates[-1], server.GameServer]

• 7월 12일의 게임/인증 서버 파일중 마지막 10개만

files[date.D2013_07_12, server.GameServer, server.AuthServer][-10:]

Page 29: WzDat과 Pandas를 통한 로그 데이터 분석

파일 병합, 단어 검색• 조건에 맞는 파일들을 합쳐 하나의 임시파일에 저장

files[…].merge()

• 파일들에서 ‘ERR’단어를 포함한 줄만 찾아 임시파일에 저장

files[…].find(‘ERR’)

• 검색 결과 내 재검색

files[…].find(‘ERR’).find(‘OnClose’)

Page 30: WzDat과 Pandas를 통한 로그 데이터 분석

결과 보기

• 선택 결과 파일 앞, 뒤 보기

files[…].head(), files(…).tail()

files[…][:-10], files[…].[-10:]

• 파일 내용 앞, 뒤 보기

files[…].merge().head(), files(…).find(‘ERR”).tail()

files[…].merge()[0:10], files(…).find(‘ERR”).[-10:]

Page 31: WzDat과 Pandas를 통한 로그 데이터 분석

DataFrame으로 변환!

• 병합,찾은 결과를 Pandas의 DataFrame으로 변환

files[…].find(…).to_frame()

• find, merge는 여러 파일을 합쳐주지만, 아직 타임 라인 소팅은 되지 않은 상태

• DataFrame으로 만들어 질 때 비로소 시간 순서대로 정렬된다.

Page 32: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 어댑터와 파일타입• 프로젝트 별로 다르다

• 파일 경로명, 파일 종류, 내용 기록 방식등

• 공용 인터페이스를 위한 프로젝트 어댑터 작성 필요

• 하나 이상의 파일 타입 모듈을 작성

• c9.log - C9의 로그 파일 모듈 (*.txt)

• c9.dump - C9 덤프 파일 모듈 (*.dmp)

Page 33: WzDat과 Pandas를 통한 로그 데이터 분석

덤프 파일의 경우하나 이상의 파일타입이 있으면 각각 다른 이름으로 임포트

예) import log as l, import dump as d

• 최근 덤프가 발생한 일시

d.dates[-1]

• 최근 덤프가 발생한 서버 (d는 dump 모듈)

d.servers[d.files[-1]]

Page 34: WzDat과 Pandas를 통한 로그 데이터 분석

이종 파일간 셀렉트

• 서로 다른 종류의 파일을 참고하여 셀렉트

• 예) 덤프 파일(d)로 로그 파일(l) 선택

# 마지막 덤프의 노드, 서버, 일시에 일치하는 # 로그 파일만 선택

l.files[d.files[-1]]

Page 35: WzDat과 Pandas를 통한 로그 데이터 분석

WzDat 로그 저장

• 파일 다운로드 링크 출력

files[…].link

• 압축된 파일 다운로드 링크 출력

files[…].zlink

Page 36: WzDat과 Pandas를 통한 로그 데이터 분석

시연

Page 37: WzDat과 Pandas를 통한 로그 데이터 분석

로그 분석 - Pandas

Page 38: WzDat과 Pandas를 통한 로그 데이터 분석

Pandas

• 사용이 편리한 파이썬 데이터 분석 툴

• 다양한 데이터 조작 방식 - R에서 영감을 받음

• 대량의 데이터를 고속으로 처리 (C/C++, MMF)

• 높은 수준의 분석을 위해 꼭 필요

• numpy, matplotlib 사용

Page 39: WzDat과 Pandas를 통한 로그 데이터 분석
Page 40: WzDat과 Pandas를 통한 로그 데이터 분석

Series

• 인덱스를 가지는 배열같은 구조체 !In [3]: s = Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']) !In [4]: s Out[4]: a 1 b 2 c 3 d 4 dtype: int64

Page 41: WzDat과 Pandas를 통한 로그 데이터 분석

DataFrame

• 인덱스와 컬럼을 가지는 구조체

• 엑셀의 테이블과 유사 !In [1]: d = DataFrame(np.random.randn(3, 4), index=['one', 'two', 'three'], columns=['a', 'b', 'c', 'd']) !In [2]: d Out[2]: a b c d one -0.513031 -0.687210 -0.433650 0.483474 two 0.233899 -0.000048 0.637124 1.004753 three 0.803571 -1.093059 0.450721 0.044777

Page 42: WzDat과 Pandas를 통한 로그 데이터 분석

열 선택, 평균 구하기• 열의 이름으로 선택 !In [7]: d['a'] Out[7]: one -0.008556 two 0.669164 three -1.033598 Name: a, dtype: float64

• (열 기준) 평균 구하기 !In [4]: d.mean() Out[4]: a 0.174813 b -0.593439 c 0.218065 d 0.511002 dtype: float64

Page 43: WzDat과 Pandas를 통한 로그 데이터 분석

그래프 그리기• 내부적으로 matplotlib을 사용

• 구조체 인스턴스의 plot메소드 !In [3]: d.plot() Out[3]: <matplotlib.axes.AxesSubplot at 0x105c99dd0>

Page 44: WzDat과 Pandas를 통한 로그 데이터 분석

시연

• 서버별 로그 크기 그래프

• 용량이 많은 에러 종류 Top 10

• ‘Long time Dispatch’ 경고 시간별 평균 그래프

Page 45: WzDat과 Pandas를 통한 로그 데이터 분석

Q&A감사합니다.

Page 46: WzDat과 Pandas를 통한 로그 데이터 분석

참고 링크• Pandas - pandas.pydata.org

• 10 Minutes to Pandas - pandas.pydata.org/pandas-docs/dev/10min.html

• IPython - ipython.org

• Don’t use Hadoop - your data isn’t that big - www.chrisstucchio.com/blog/2013/hadoop_hatred.html

• 파이썬 라이브러리를 활용한 데이터 분석 - www.yes24.com/24/goods/11043328?scode=032&OzSrank=1