WzDat과 Pandas를 통한 로그 데이터 분석
-
Upload
- -
Category
Technology
-
view
1.068 -
download
1
description
Transcript of WzDat과 Pandas를 통한 로그 데이터 분석
“데이터,����������� ������������������ 데이터,����������� ������������������ 데이터”����������� ������������������ 참지����������� ������������������ 못하고����������� ������������������ 그는����������� ������������������ 외쳤다.����������� ������������������
“흙도����������� ������������������ 없이����������� ������������������ 벽돌을����������� ������������������ 만들����������� ������������������ 수는����������� ������������������ 없잖아!”����������� ������������������ ����������� ������������������
- 셜록 홈즈, 너도밤나무집 中
WzDat과 Pandas를 통한 로그 데이터 분석
과학의 패러다임 변천- from Jim Gray on eScience
• 수 천년 전 - 경험에 의해
• 수 백년 전 - 이론에 의해
• 수 십년 전 - 계산에 의해
• 현재 - 데이터 탐사에 의해
데이터 탐사의 단계!
1. 데이터를 수집
2. 데이터를 선별
3. 정보의 형태로 저장
4. 전문가가 분석
빅 데이터?• 하둡
• ~TB 단위의 분석에 적합
• 셋팅 및 MR코딩의 비용
• GB 단위는 다양한 방법이 가능
• SQL, NoSQL, 스크립트 등
• 저비용, Try & Discover에 유리
로그 (= 데이터?)
로그의 장점
• 개발자라면 누구나 사용
• NoSQL 원조 - 추가, 수정에 용이.
• 파일은 생각보다 안정적
• 문제 발생 후 사후 분석에 최적
• 장기간 보존이 필요 없다 - “Big Stream”
로그의 단점
• 여러개의 머신, 파일로 흩어져 있다.
• 하나의 타임 라인으로 보기 힘들다.
• 정규화 되어있지 않다.
로그가 데이터가 되려면
• 흩어져 있는 로그 파일들 -> 수집
• 서로 다른 파일 들 -> 하나의 타임라인으로 통합
• 정규화 되지 않은 로그 메시지들 -> 선별 및 정규화
바람직한 로그• 로그 파일 생성시 파일(경로)명에 필요한 정보
• 로그가 발생한 일시
• 로그를 생성한 서버의 종류
• 로그를 생성한 서버의 번호
• 로그 파일 내용에 필요한 할 정보
• 로그 메시지를 출력한 일시 (년:월:일 - 시:분:초)
• 로그 메시지의 레벨 (크리티컬, 에러, 워닝, 정보, 디버그)
• 로그가 수집될 때 파일(경로)에 필요한 할 정보
• 로그를 생성한 노드(머신) 이름 - 지역 정보 포함 권장
• 좋은 로그 파일명
C:/APPNAME-KR/GS101/AgentServer_2013-01-28.log
• 부족한 로그 파일명
C:/log.txt
• 좋은 로그 메시지
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
로그 수집
로그 수집
• 분산되어 있는 로그를 한 곳으로 모으는 과정
• 기존 프로젝트 로그 수집
• 서비스 중인(파일기반) 로그 집중화의 목적
• 새로운 프로젝트 로그 수집
• 최신 솔루션 선택이 가능
Apps
Log
Apps
Log
Node
Apps
Log
Apps
Log
Node
Apps
Log
Apps
Log
Node
Log Node
Log Log
rsync
rsync
rsync
로그 선별, 저장 - WzDat“What’s That?”
WzDat• 로그에서 의미 있는 데이터를 쿼리
• 단순하지만 강력한 파이썬 구문 형식
• 다량의 비 정규화된 로그 파일을 선별 후,
• 보거나
• 변환하거나 (-> Pandas 구조체)
• 저장(다운로드)
WzDat
WzDat 셀렉터
뒤에 ~s가 붙은 복수형 단어, 각괄호 [ ] 로 조건 기술
• files - 파일 선택
• nodes - 노드(머신) 선택
• servers - 서버(앱) 선택
• dates - 일시(Date Time) 선택
files• 모든 파일을 선택
files
• 첫 번째, 마지막 파일
files[0], files[-1]
• 100번째 에서 10개 파일
files[100:110]
• 앞에서 10개, 뒤에서 10개
files[:10], files[-10:]
dates• 파일이 있는 모든 일시를 선택
dates
• 파일이 있는 첫 번째, 마지막 일시
dates[0], dates[-1]
• 같은 식으로
dates[100:110], dates[:10], date[-10:]
nodes• 파일을 만든 모든 노드(머신)를 선택
nodes
• 파일을 만든 첫 번째, 마지막 노드
nodes[0], nodes[-1]
• 같은 식으로
nodes[100:110], nodes[:10], nodes[-10:]
servers• 파일을 만든 모든 서버(앱)을 선택
servers
• 파일을 만든 첫 번째, 마지막 서버
servers[0], servers[-1]
• 같은 식으로
servers[100:110], servers[:10], servers[-10:]
WzDat 상수• ‘카테고리 . 이름’의 형식
• 파일 분석과정에서 자동으로 정의
• 상수의 카테고리는 공통, 이름은 프로젝트 별로 다양하다. (아래는 C9의 예)
• node.ASIA_1 # 아시아 1번 서버 머신
• server.GameServer # 게임서버
• date.D2013_07_11 # 2013년 7월 11일
상수로 필터링• 2013년 7월 11일 파일만
files[date.D2013_07_11]
• 게임 서버 파일만
files[server.GameServer]
• ASIA-1 노드에서 파일이 발생한 일시만
dates[node.ASIA_1]
상수 매칭
• 상수의 앞 문자열만 맞으면 모두 매칭
# node.ASIA_1, node.ASIA_2, … 식으로 여럿 있을 때
files[node.ASIA] # 모든 아시아 노드의 파일이 매칭
셀렉터의 결과로 필터링• 마지막 날의 파일만 선택
files[dates[-1]]
• 마지막 날 파일을 만든 노드만 선택
nodes[dates[-1]]
• 아시아 지역의 마지막 날 파일만 선택
files[dates[node.ASIA][-1]]
복합 조건 필터링
• 마지막 날의 게임서버 파일만
files[dates[-1], server.GameServer]
• 7월 12일의 게임/인증 서버 파일중 마지막 10개만
files[date.D2013_07_12, server.GameServer, server.AuthServer][-10:]
파일 병합, 단어 검색• 조건에 맞는 파일들을 합쳐 하나의 임시파일에 저장
files[…].merge()
• 파일들에서 ‘ERR’단어를 포함한 줄만 찾아 임시파일에 저장
files[…].find(‘ERR’)
• 검색 결과 내 재검색
files[…].find(‘ERR’).find(‘OnClose’)
결과 보기
• 선택 결과 파일 앞, 뒤 보기
files[…].head(), files(…).tail()
files[…][:-10], files[…].[-10:]
• 파일 내용 앞, 뒤 보기
files[…].merge().head(), files(…).find(‘ERR”).tail()
files[…].merge()[0:10], files(…).find(‘ERR”).[-10:]
DataFrame으로 변환!
• 병합,찾은 결과를 Pandas의 DataFrame으로 변환
files[…].find(…).to_frame()
• find, merge는 여러 파일을 합쳐주지만, 아직 타임 라인 소팅은 되지 않은 상태
• DataFrame으로 만들어 질 때 비로소 시간 순서대로 정렬된다.
WzDat 어댑터와 파일타입• 프로젝트 별로 다르다
• 파일 경로명, 파일 종류, 내용 기록 방식등
• 공용 인터페이스를 위한 프로젝트 어댑터 작성 필요
• 하나 이상의 파일 타입 모듈을 작성
• c9.log - C9의 로그 파일 모듈 (*.txt)
• c9.dump - C9 덤프 파일 모듈 (*.dmp)
덤프 파일의 경우하나 이상의 파일타입이 있으면 각각 다른 이름으로 임포트
예) import log as l, import dump as d
• 최근 덤프가 발생한 일시
d.dates[-1]
• 최근 덤프가 발생한 서버 (d는 dump 모듈)
d.servers[d.files[-1]]
이종 파일간 셀렉트
• 서로 다른 종류의 파일을 참고하여 셀렉트
• 예) 덤프 파일(d)로 로그 파일(l) 선택
# 마지막 덤프의 노드, 서버, 일시에 일치하는 # 로그 파일만 선택
l.files[d.files[-1]]
WzDat 로그 저장
• 파일 다운로드 링크 출력
files[…].link
• 압축된 파일 다운로드 링크 출력
files[…].zlink
시연
로그 분석 - Pandas
Pandas
• 사용이 편리한 파이썬 데이터 분석 툴
• 다양한 데이터 조작 방식 - R에서 영감을 받음
• 대량의 데이터를 고속으로 처리 (C/C++, MMF)
• 높은 수준의 분석을 위해 꼭 필요
• numpy, matplotlib 사용
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
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
열 선택, 평균 구하기• 열의 이름으로 선택 !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
그래프 그리기• 내부적으로 matplotlib을 사용
• 구조체 인스턴스의 plot메소드 !In [3]: d.plot() Out[3]: <matplotlib.axes.AxesSubplot at 0x105c99dd0>
시연
• 서버별 로그 크기 그래프
• 용량이 많은 에러 종류 Top 10
• ‘Long time Dispatch’ 경고 시간별 평균 그래프
Q&A감사합니다.
참고 링크• 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