[ 강좌 ] 빅 데이터 실전 튜토리얼 ( 2 ) - ITDaily 
 [ 강좌 ] 빅 데이터 실전 튜토리얼 ( 2 ) 데이터 저장 - EFK 스택 사용 방법 
 ▲ 이동균 버즈 니 리서치 엔지니어 
 3 . 데이터 가공 및 분석 ( 1 ) 
 4 . 데이터 가공 및 분석 ( 2 ) 
 5 . 데이터 가공 및 분석 ( 3 ) 
 지난 글 에서 는 빅 데이터 분석 의 시작 으로 파서 와 크롤러 를 만들 어 원 하 는 데이터 를 수집 하 는 방법 을 알 아 봤 다 . 이미 수집 한 데이터 를 우리 가 갖 고 있 는 멋들어진 알고리즘 으로 분석 하 기 전 에 , 잠깐 다음 과 같 은 상황 을 생각 해 보 자 . 
 현재 우리 는 목적 에 맞 는 분석 알고리즘 을 갖췄으며 , 모든 데이터 는 평소 익숙 하 게 사용 하 던 RDBMS 에 저장 한 상태 다 . 어느 날 갑자기 수집 하 는 데이터 의 종류 가 늘어나 거나 변경 돼 데이터 의 스키마 가 변경 된다면 어떨까 ? 며칠 에 한 번 씩 없 던 컬럼 이 생기 거나 있 던 컬럼 이 없 어 진다면 ? 컬럼 의 데이터 형태 가 변경 된다면 어떨까 ? 아마 데이터 분석 과 스키마 유지 보수 를 하 느라 하루 가 어떻게 지나가 는지 도 모를 것 이 다 . 
 또 , 사업 이 급속도 로 성장 하 는 통 에 분석 을 요구 하 는 데이터 의 종류 가 하루 가 다르 게 늘어난다면 ? 데이터 가 하루 에 도 최소 수 기가바이트 씩 쌓이 고 있 다면 ? 변화무쌍 한 스키마 덕 에 분석 에 필요 한 데이터 를 검색 하 는데 수 십 초 씩 걸린다면 어떨까 ? 필시 데이터 시각화 도구 와 대시보드 를 유지 보수 를 위한 전담 팀 을 꾸려야 할 수 도 있 다 . 
 일견 극단 적 인 상황 들 만 나열 한 것 처럼 보이 지만 사실 위 에 언급 한 일 들 은 상당히 일반 적 이 다 . 일 주일 에 도 몇 번 씩 벌어지 곤 하 는 다양 한 데이터 재앙 을 ‘ EFK 스택 ’ 을 이용 해 효과 적 으로 극복 해 오 고 있 다 . 
 이번 글 에서 는 EFK 스택 을 이루 고 있 는 ▲ 데이터 저 장소 이자 검색 엔 진인 ‘ 엘라스틱 서치 ( ElasticSearch ) ’ ▲ 로 그 파싱 / 수집 기 ‘ 플 루 언 티 드 ( Fluentd ) ’ ▲ 데이터 시각화 도구 이 자 엘라스틱 서치 의 대시보드 인 ‘ 키바 나 ( Kibana ) ’ 를 소개 하 고 , ‘ 엔진 X ( NginX ) ’ 웹 서버 를 위한 로그 수집 시스템 을 직접 구축 해 보 도록 한다 . 
 ‘ EFK 스택 ’ 이 란 
 시작 하 면서 잠깐 언급 했 듯 EFK 스택 은 엘라스틱 서치 , 플 루 언 티 드 , 키바 나 의 3 개 툴 로 이뤄져 있 으며 , 각각 의 첫 글자 를 따 서 만든 합성어 다 . 
 엘라스틱 서치 는 루신 ( Lucene ) 을 기반 으로 한 분산 검색 시스템 으로 , ‘ 쿼리 를 통한 질의 가 가능 한 JSON 문서 기반 NoSQL 저 장소 ’ 라고 설명 할 수 있 다 . 엘라스틱 서치 를 사용 하 는 가장 큰 이유 는 설정 과 사용 의 용이 함 이 다 . 설치 에서 실행 까지 5 분 도 걸리 지 않 으며 , 각 엘라스틱 서치 노드 의 설정 파일 에서 true , false 값 만 몇 개 조정 해 주 면 마스터 노드 , 데이터 노드 , 서치 노드 로 구성 된 클러스터 를 구축 할 수 있 다 . 
 최고 의 오픈 소스 검색 엔진 인 루신 을 기반 으로 하 고 있 으므로 루신 의 고급 검색 기능 외 에 도 인덱스 에 대한 멀티 테넌 시나 JSON 을 통한 쿼리 DSL ( Query DSL ) , 퍼 컬 레이 션 ( Percolation ) 같 은 기능 들 도 추가 로 제공 하 고 있 으며 , 플러그인 을 통해 원 하 는 기능 을 어렵 지 않 게 추가 할 수 있 다 . 
 플 루 언 티 드 는 로그 수집 기 로 , 사용 자 의 로그 를 다양 한 형태 로 입력 받 아 JSON 포맷 으로 변환 한 뒤 다양 한 형태 의 출력 방법 을 통해 쌓 을 수 있 도록 해준다 . 일반 적 으로 플 루 언 티 드 대신 로그 스태시 ( Logstash ) 를 이용한 ‘ ELK 스택 ’ 이 더 많이 알려졌 는데 , 로그 스태시 가 엘라스틱 서치 , 키바 나 와 같 은 회사 인 엘라스틱 ( Elastic ) 의 제품군 에 들어가 기 때문 이 다 . 둘 의 차이 에 대해 아래 표 에 간단히 정리 해 봤 다 . 
 ▲ 로그 스태시 vs 플 루 언 티 드 
 ELK 와 EFK 중 어떠 한 스택 을 사용 해도 무방 하 지만 , 최근 에 는 운영 과 설 정상 의 단순 화 를 위해 ELK 보다 EFK 스택 을 선택 하 는 추세 다 . 본 글 에서 도 상대 적 으로 설정 이 간단 하 고 직관 적 인 플 루 언 티 드 를 이용 해 로그 분석 시스템 을 구축 해본다 . 
 마지막 으로 키바 나 는 데이터 시각화 도구 로 , 엘라스틱 서치 에 쌓인 데이터 를 시각 적 으로 볼 수 있 도록 대시보드 를 제공 한다 . SQL 의 WHERE 절 모양 의 간단 한 형태 의 질의 부터 JSON 을 이용 한 복잡 한 쿼리 DSL 질의 를 통해 사용 자 가 원 하 는 형태 의 데이터 를 쉽 게 볼 수 있 도록 도와 준다 . 
 버즈 니 활용 사례 - 로그 분석 시스템 
 국내 모든 홈 쇼핑 상품 을 한눈 에 모아 볼 수 있 는 ‘ 홈 쇼핑 모아 ’ 를 서비스 중 인 버즈 니 에서 도 사용 자 로그 분석 시스템 , 검색 시스템 , 실시간 모니터링 시스템 등 에 EFK 스택 을 적극 적 으로 활용 하 고 있 다 . 
 로그 분석 시스템 의 경우 하루 에 수 기가 씩 쌓이 는 사용자 의 요청 을 4 대 의 웹 서버 를 통해 수집 한 뒤 플 루 언 티 드 를 통해 엘라스틱 서치 에 전달 하 고 , 해당 정보 를 추천 푸시 대상 추출 이나 검색어 추천 등 에 이용 하 고 있 으며 , 데이터 의 부정확 성 이나 이상 패턴 을 파악 해 슬랙 ( Slack ) 을 통해 알람 을 해 주 는 실시간 모니터링 서비스 와 도 연동 하 고 있 다 . 
 이 뿐 만 아니 라 키바 나 를 통해 누구 든 즉시 서비스 의 모든 데이터 를 쉽 게 확인 할 수 있 게 되 면서 마케팅 팀 에서 도 프로모션 이나 마케팅 효과 를 수치 와 그래프 를 통해 직접 확인 할 수 있 게 돼 효율 적 인 리소스 사용 이 가능 해졌 다 . 
 ▲ 버즈 니 로그 분석 시스템 구조 도 
 EFK 설치 및 설정 
 EFK 를 설치 하 고 엔 젠 X 로그 데이터 를 플 루 언 티 드 를 이용 해 엘라스틱 서치 에 쌓 는 방법 에 대해서 알아보 도록 한다 . 설치 와 설정 은 리눅스 - 우분투 ( Ubuntu ) 환경 에서 진행 된다고 가정 하 겠 다 . 각 도구 의 설치 는 너무 간단 하 다 . 다운 받 고 압축 을 풀 면 바로 실행 할 수 있 다 . 웹 상 에 도 수많 은 한글 문서 가 있 으므로 본 글 에서 는 설치 에 대해서 는 다루 지 않 겠 다 . 대신 로그 스태시 , 플럼 ( Flume ) 등 다른 도구 로 언제 든 대체 할 수 있 으며 , 독특 한 구조 로 돼 있 는 플 루 언 티 드 의 개념 설명 과 설정 에 대해 좀 더 자세히 다뤄본다 . 
 플 루 언 티 드 설치 및 설정 
 플 루 언 티 드 는 로그 파 서 겸 수집 기 로 , 플러그인 방식 으로 입력 , 전달 , 출력 을 제어 할 수 있 다 . 직관 적 인 구조 로 설정 이 매우 간편 하 지만 , 로그 스태시 에 비해 유연 성 이 부족 하 기 때문 에 복잡 한 형태 의 데이터 를 수집 해야 할 때 는 로그 스태시 를 이용 하 는 것 이 나 을 수 도 있 다 . 
 버즈 니 에서 는 엔진 X 로그 및 자체 규격 의 서비스 로그 를 수집 하 는 데 해당 로그 들 의 형태 가 정형 화 돼 있 고 크 게 복잡 하 지 도 않 기 때문 에 플 루 언 티 드 를 사용 해 로그 를 수집 하 고 있 으며 , 운영 면 에서 상당히 만족 스럽 게 생각 하 고 있 다 . 
 ▲ 플 루 언 티 드 구조 
 플 루 언 티 드 의 이벤트 처리 방식 은 독특 하 지만 이해 하 기 어렵 진 않 다 . 플 루 언 티 드 에서 모든 데이터 는 태그 를 갖 고 있 고 데이터 를 처리 하 는 각 단계 는 태그 를 기준 으로 구분 된다 . 각 단계 를 지날 때 마다 데이터 에 달려 있 던 태그 를 수정 할 수 있 으며 , 이 를 이용 해 다양 한 형태 의 데이터 를 효과 적 으로 가공 할 수 있 다 . 실제 사용 할 설정 파일 을 보 면서 흐름 을 따라가 보 자 . 
 ▲ 플 루 언 티 드 설정 파일 
 설정 파일 의 섹션 은 source 와 match 로 나눠진다 . 모든 섹션 은 플러그인 을 이용 해 처리 되 며 , 각 섹션 의 type 필드 를 통해 어떠 한 플러그인 을 사용 할지 선언 해 줄 수 있 다 . 
 먼저 source 는 데이터 를 입력 받 을 방법 을 지정 하 는 부분 으로 , 여기 서 는 tail 플러그인 을 통해 입력 을 받 는다 . tail 플러그인 은 파일 의 마지막 10 줄 을 읽 어 들이 는데 , 리눅스 의 ‘ tail - F ’ 와 마찬가지 로 추가 된 내용 을 지속 적 으로 추적 해 읽 어 들인다 . 
 이때 입력 받 은 데이터 에 는 source 섹션 의 tag 필드 에 의해 grep 이 라는 태그 가 달리 며 , 데이터 는 이제 grep 태그 를 처리 하 는 10 ~ 15 번 라인 의 match 섹션 으로 전달 된다 . 해당 섹션 에서 사용 하 는 플러그인 은 fluent - plugin - grep 이 라는 서드 파티 플러그인 으로 , 따로 설치 해야 한다 . 
 플 루 언 티 드 의 플러그인 설치 역시 간단 하 다 . ‘ gem install fluent - plugin - grep ’( td - agent 를 쓴다면 ‘ td - agent install fluent - plugin - grep ’) 만 입력 하 면 바로 설치 가 완료 된다 . grep 플러그인 은 JSON 데이터 에서 지정 한 문자열 이 포함 된 키 값 ( key - value ) 을 필터 링 해 준다 . 예제 에서 는 key 가 path 이 며 , value 에 ‘/ static ’ 으로 시작 하 는 데이터 는 삭제 해 준다 . 
 grep 플러그인 의 처리 가 끝난 데이터 의 태그 는 이제 es . ouput 으로 변경 되 며 , 13 ~ 18 번 라인 의 es 로 시작 하 는 모든 태그 를 처리 하 는 match 섹션 으로 데이터 가 전달 된다 . 해당 섹션 은 엘라스틱 서치 플러그인 을 통해 ‘ localhost : 9200 ’ 에 설치 된 엘라스틱 서치 에 데이터 를 쌓 는다 . 
 위 설정 파일 로 플 루 언 티 드 를 실행 하 고 , 설정 파일 이 있 는 폴더 에 실제 엔진 X 로그 파일 을 nginx . log . 1 이 라는 이름 으로 복사 해 넣 으면 플 루언 티 드 가 자동 으로 추가 된 파일 을 인식 하 고 처리 하 는 것 을 확인 할 수 있 다 . 
 ▲ 플 루 언 티 드 통해 쌓인 엔진 X 데이터 를 키바 나 로 확인 하 는 화면 
 참고 : 테스트 용 더미 데이터 쌓 기 
 엔진 X 로그 파일 이 없 다면 cUrl 을 이용 해 데이터 를 직접 추가 할 수 있 다 . 
 ▲ cUrl 이용 해 customer 인덱스 에 문서 추가 
 http 로 입력 하 는 방식 이 편하 긴 하 지만 , 하나하나 입력 하 기 에 는 시간 과 노력 이 너무나 아깝 다 . 좀 더 복잡 하 고 많 은 더미 데이터 를 자동 으로 추가 할 방법 이 없 을까 ? 만약 현재 작업 환경 에 노드 JS ( Node . js ) 와 NPM 이 설치 돼 있 다면 makelogs 프로그램 을 이용 할 수 있 다 . ‘ npm install - g makelogs ’ 명령 을 통해 설치 할 수 있 으며 , 이 를 이용 하 면 복잡 한 더미 데이터 를 원하 는 만큼 자동 으로 생성 할 수 있 다 . 
 ▲ makelogs 이용 해 더미 데이터 쌓 기 
 파이썬 ( Python ) 으로 데이터 제어 하 기 
 마지막 으로 엘라스틱 서치 에 쌓 은 데이터 를 파이썬 을 통해 객체 로 가져와 보 자 . 파이썬 환경 에서 엘라스틱 서치 의 데이터 를 가져오 는 방법 으로 는 크 게 urllib , pycurl , requests 등 의 라이브러리 를 이용 해 직접 http 요청 을 생성 하 는 방법 과 , 엘라스틱 서치 에서 공식 적 으로 지원 하 는 파이썬 라이브러리 를 설치 해 사용 하 는 방법 이 있 다 . 
 개인 적 으로 는 공식 라이브러리 를 이용 하 는 것 을 추천 하 는데 , 코드 양 과 가독성 에서 현격 한 차이 를 보이 기 때문 이 다 . 아래 그림 에서 볼 수 있 듯이 , py - elasticsearch 라이브러리 를 이용 하 면 단 2 줄 의 코드 로 데이터 를 쌓 고 가져올 수 있 다 . 
 ▲ py - elasticsearch 이용 해 엘라스틱 서치 에 데이터 쌓 고 가져오 기 
 이번 글 에서 는 엘라스틱 서치 , 플 루 언 티 드 , 키바 나 로 이뤄진 EFK 스택 을 이용 해 엔진 X 데이터 를 쌓 고 , 파이썬 을 이용 해 쌓 아 둔 데이터 들 을 가져오 는 방법 에 대해 알 아 봤 다 . 
 솔라 ( Solr ) , 스핑크스 ( Sphinx ) 등 엘라스틱 서치 를 대체 할 수 있 는 다양 한 공개 SW 솔루션 들 이 존재 하 고 있 지만 , 최근 검색 과 관련 된 모든 분야 에서 엘라스틱 서치 가 빠지 지 않 고 언급 되 는 이유 는 쉬운 사용 성 때문 일 것 이 다 . 
 엘라스틱 서치 를 사용 하 면 5 분 만 에 검색 엔진 을 바로 이용 할 수 있 고 , 각 노드 마다 설정 몇 개 만 조정 해 주 면 멋지 게 동작 하 는 분산 검색 클러스터 를 가질 수 있 으며 , 여기 에 도커 ( Docker ) 나 베이 그런 트 ( Vagrant ) 와 같 은 가상 화 기술 을 이용 하 면 클러스터 의 노드 를 줄이 고 늘이 는 것 조차 자동 화 할 수 있 다 . 
 엘라스틱 서치 , 플 루 언 티 드 에 대해 간단 한 플러그인 도 만들 어 보 고 , 엘라스틱 서치 클러스터 의 노드 도 늘렸 다 줄였 다 하 다 보 면 하루 수십 기 가 정도 의 데이터 는 더 이상 ‘ 빅 ( big ) ’ 하 게 느껴 지 지 않 게 될 것 이 다 . 
 2015 년 07 월 01 일 ( 수 ) 07 : 51 : 50 이동균 @ 메일 보내 기 ㅣ 기자 의 다른 기사 보 기 
 [ 강좌 ] 빅 데이터 실전 튜토리얼 ( 5 )