http://www.nextree.co.kr/p2865/


빅데이터: Hadoop 기반 대용량 로그처리

하둡 주제범위가 워낙 넓고 방대해서 설치 및 자세한 내용을 첨부하기에는 무리가 있기 때문에 하둡을 처음 접하는 개발자를 대상으로 하둡이 무엇이며 하둡시스템을 구축하기 위한 큰 그림을 그려보기 위한 내용으로 구성하였다.

 

 

[로그 분석?]

로그분석이란 로그정보를 활용하여 어떠한 가치 있는 정보를 추출하기 위한 과정이다. 이번 프로젝트에서 로그분석 처리단계를 간략하게 표현하면 다음과 같다.

로그1

이와 같은 절차를 이용하여 가치 있는 통계 정보를 뽑아 내는 것이 이번 프로젝트의 목표였다.

로그는 시스템을 운용하게 되면서 생성되는 여러 가지 정보를 의미하는데 우리가 일반적으로 알고 있는 시스템상의 에러 스택 같은 로그정보 또는 업무와 관련된 데이터를 주기적으로 생성하는 로그가 있을 수 있다.

그 외 무수히 많은 여러 가지 로그가 존재할 수 있는데 이런 로그정보를 수집하여 적재하고 분석하여 결과를 볼 수 있는 도구들을 하둡 에코 시스템에서 제공하고 있다.

 

[하둡(Hadoop)은 무엇?]

위키백과에서는 하둡을 다음과 같이 정의하고 있다.

220px-Hadoop_logo.svg “아파치 하둡(Apache Hadoop, High-Availability Distributed Object-Oriented Platform)은 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 자유 자바 소프트웨어 프레임워크이다.)

이처럼 하둡의 특징은 대량의 자료를 분산환경에서 병렬로 처리할 수 있는 시스템이라고 할 수 있다.

이번 프로젝트에서 로그분석을 위해 스프링배치와 하둡을 두고 어떤걸 도입할지 많은 고민이 있었지만 대량 로그를 빠르게 처리하기 위해서는 하둡이 적합하다는 사실에는 우리팀 전부 동의했다. 그럴수밖에 없는 이유가 하나 있는데 이번에 진행한 O맵 프로젝트는 10분당 쌓이는 로그 용량이 많을 땐 1Gb를 넘길 만큼 상당히 방대하였고 분석을 위해 1일, 최대 한달 이상 분량의 로그데이터를 모아서 주기적으로 분석하기 위해서는 하둡말고는 딱히 대안이 없어 보였다.

 

[하둡을 지원하는 여러 가지 도구들]

하둡 자체만으로 전체적으로 자동화된 로그분석 시스템을 구축하기는 힘들다. 하둡은 오직 HDFS를 사용한 파일 저장소와 분석을 위한 MapReduce기능만 제공하기 때문에 그 외 로그수집, 배치 워크플로우, 결과 데이터 RDBMS 적재 등 이러한 기능을 사용하기 위해선 별도의 도구가 필요하다.

에코시스템

출처:http://1004jonghee.tistory.com

하둡을 둘러싼 정말 많은 서드파티 도구들이 있지만 이번 프로젝트를 진행하면서 도입한 도구들은 HDFS+MapReduce, Hive, Flume, Oozie, Sqoop이다. 각 기술에 대한 간략한 설명을 덧붙이지만 자세한 내용을 알고 싶다면 검색을… :-)

 

HDFS+MapReduce

mapreduce

하둡은 HDFS + MapReduce를 구현한 시스템이다. MapReduce는 함수형 프로그래밍에서 일반적으로 사용되는 Map과 Reduce라는 함수 기반으로 데이터를 분석하기 위한 구조를 제공한다. Map과 Reduce함수에 맞춰서 코드를 만들면 데이터입출력과 병렬분석 작업을 하둡이 알아서 처리하게 된다.

HDFS는 분산 파일 시스템으로 클러스터를 늘리면 늘릴수록 저장할 수 있는 크기가 늘어나는 장점이 있다. 그리고 데이터를 일정한 블록단위로 나눠서 각 클러스터에 저장하기 때문에 MapReduce로 분석 시 각 클러스터들은 로컬에 나눠 저장된 파일을 읽어 처리하게 때문에 병렬 처리가 가능하다. (로컬에 없는 입력소스는 네트웍으로 전송받아 처리하게된다)

 

Hive

하이브는 SQL와 유사한 HiveQL문법을 사용하여 MapReduce를 작성hive_logo_medium하게 해주는 도구이다. 이 도구의 장점은 조금 까다로운 MapReduce 코드를 작성하는 대신 익숙한 SQL방식으로 스크립트를 만들어 구동하게 되면 내부적으로 스크립트를 MapReduce 자바 코드로 변환하여 분석을 수행하게 된다. 이러한 과정을 하이브가 자동으로 처리하기 때문에 MapReduce를 작성하는 일에 비해 생산성이 비약적으로 늘어나게 되는 장점이 있다. 단점은 RDBMS처럼 테이블을 이용하여 쿼리를 수행하기 때문에 정형화 되지 않은 입력 소스들은 분석이 쉽지 않다.

 

Flumeflume-logo

플럼은 로그수집기 도구이다. Source-Channel-Sink 아키텍처로 쉽고 다양한 방식으로 로그를 수집할 수 있는 방법을 제공한다. Flume1에서 FlumeNG로 새로운 아키텍처가 반영되면서 상당히 구조가 간단해졌기 때문에 초보자도 쉽게 사용할 수 있다. 비슷한 도구로 Chukwa라는 것이 있지만 개인적으로 Flume에 비해 사용하기가 어렵게 느껴졌다. 이번에 진행한 O맵 프로젝트에서는 21개 서버에 Flume Agent를 설치하여 로그를 실시간으로 하둡 HDFS로 수집하고 있다.

 

Oozie

oozie_200x

우지는 작성된 맵리듀스 잡(Job)을 실행시켜주는 일종의 런처(launcher)역할을 하는 워크플로우 관리 툴이다. 자바로 작성된 웹서버로 별도로 운용되며 하둡과 연동하여 미리 작성된 워크플로우에 따라 맵리듀스 잡(job)을 실행시켜주게 된다. REST API를 제공하기 때문에 자체 웹서버에서 우지 기능을 제어(잡 재실행, 정지 등) 할 수 있다.

 

Sqoop

sqoop-logo

스쿱은 RDBMS와 하둡간에 대량데이터를 전송하기 위한 도구이다. 맵리듀스를 통해 출력된 결과(HDFS)를 RDBMS로 Export 또는 RDBMS상에 있는 데이터를 HDFS로 Import할 수 있는 기능을 제공한다. 현재 스쿱 버전은 1, 2버전 2가지로 제공이 되고 있는데 스쿱1 버전은 Command명령 에서만 구동할 수 있는 반면 개선된 스쿱2버전에서는 자체 WAS가 도입되어 REST API, UI등을 제공하기 때문에 좀 더 편리한 방식으로 사용할 수 있게 되었다.

 

위에서 언급한 로그분석 각각 절차에 대한 하둡 관련 기술(도구)을 대입해보면 다음과 같다.

로그2

 

 

[하둡 시스템 구축]

지금까지 알아본 하둡 도구들을 사용하여 다음 과 같이 하둡시스템을 구성했다.

hadoop_2

수집&적재

각 로그를 수집할 서버에 Flume Agent는 10분단위로 발생된 로그파일들을 Avro프로토콜을 사용하여 하둡 마스터 서버 Flume Collector로 전송하게 되는데 Flume Collector는 수신 받은 로그를 HDFS 저장소에 10분단위 디렉터리를 생성하여 저장한다. 이 작업은 매 10분 단위로 반복하여 수행되면서 각 서버에 있는 모든 로그파일을 한곳으로 모아주는 역할을 한다.

분석

언제 몇 분 단위로 잡을 실행할지에 대한 정보를 가지고 우지 워크플로우 서버에 스케쥴 정보를 등록한다. 등록된 이후 잡 수행에 대한 이벤트는 전적으로 우지가 관리하게 된다. 등록된 스케쥴 정보에 맞춰서 우지는 하둡의 잡트레커에게 실행명령을 내리게 되고 명령을 받은 잡 트레커는 실제 병렬로 분석작업을 처리할 각 테스크노드들에게 작업명령을 하달한다.

우지 워크플로우는 다양한 방식의 액션을 지원하게 되는데 MapReduce->Hive->Sqoop 순서로 각 액션 수행이 종료되면 다음 액션을 실행시켜주는 방식으로 워크플로우를 관리한다.

결과

각 태스크 노드들은 데이터 노드에서 분석할 로그파일을 가지고 분석을 수행하게 되고 데이터 분석이 다 끝나면 결과파일을 HDFS저장소에 생성되게 되는데 스쿱이 이 결과 데이터를 RDBMS에 저장 명령을 내림으로서 한 개의 잡(job)은 실행을 마친다.

 

[분석 코드 만들기]

지금까지 로그정보를 수집해서 하둡을 이용한 분석 그리고 최종 결과 데이터를 RDBMS까지 저장되어 분석이 마무리 되는 전체 과정을 알아보았다.

그러면 데이터를 분석하기 위해선 어떤 코드를 작성을 해야할까? 하둡에서는 Map/Reduce가 핵심이기 때문에 MapReduce코드만 잘 작성을 하면 된다. 단 여기서 한가지 고려해야 할 점이 존재하는데 코드 생산성과 복잡도를 고려해서 Hive를 도입하게 되면 좀 더 쉽고 빠르게 분석 코드 작성이 가능하게 된다는 점이다. 경험해본바 Hive 쿼리를 작성할 때는 SQL관점으로 동일하게 바라볼 수 있기 때문에 집합연산이나 데이터간 JOIN연산 등을 처리하기에 무척 편리하게 구현이 가능했다.

물론 하이브가 하둡기반 아래 동작할 때 내부적으로 하이브 쿼리 스크립트를 맵리듀스(.jar)로 변환하여 실행되기 때문에 기본적인 구현 패턴은 맵리듀스로 구현하는 방법이 기본이라고 할 수 있겠지만 여러 가지 상황을 고려해서 최적의 구현 도구를 찾아 개발하는 것이 현명한 선택이다.

MapReduce와 Hive코드 비교

분석할 텍스트 내용

홍길동, 서울

아무개, 전북

홍길동, 경남

블리자드, 전남

디아블로, 제주

디아블로, 강원

홍길동, 서울

MapReduce WordCount 예제

 

Hive WordCount 예제

 

결과출력

디아블로    2

블리자드    1

아무개      1

홍길동      3

두 코드 중에 어떤 게 쉽다고 느껴지는가? 정답은 없다. 그냥 둘중에 편한 도구를 선택하여 구현하면 된다. 위에 내용에서도 언급하였지만 하이브를 도입하여 많은 생산성을 낼 수 있고 맵리듀스보다 간단하게 구현할 수 있다면 하이브를 사용하는게 더 합리적이다.

물론 하이브보단 직접 맵리듀스로 구현하는게 성능적으로 나을 수 있다. 하지만 어설프게 짠 맵리듀스 코드보다 하이브가 최적화하여 변환해 주는 맵리듀스 코드가 좀 더 나을 수 있기 때문에 여러가지 상황을 고려하여 구현하는 것이 간결한 코드에 도움이 된다고 생각된다.

예제를 통해본 입력 데이터는 정형화된 구조를 가지고 있기 때문에 하이브도 손쉽게 처리할 수 있었지만 비정형화된 구조를 처리하기 위해선 맵리듀스처럼 1라인씩 읽어와 처리하는 방식이 더 유연한 구조를 제공한다. 하이브도 비정형화된 데이터를 처리할 수 있는 방법은 존재하는데 SerDe 인터페이스를 입력 소스 구조에 맞춰서 구현하면 데이터 로드 시점에 SerDe를 통하여 정형화된 구조로 하이브 테이블에 적재가 가능하다.

 

[워크플로우 구성]

분석 코드를 작성하는 방법도 알아봤으니 이제 이 코드들을 실행하는 방법이 궁금할 것이다. 기본적으로 하둡에서 맵리듀스 프로그램을 실행하려면 드라이버 클래스도 추가적으로 작성을 해야한다. 이 드라이버 클래스에는 맵 클래스와, 리듀스 클래스 정보, input, output 정보 등 실행에 필요한 정보를 기술하고 있다. 하지만 커맨드 상에서 1회성 실행이 아닌 실제 운영레벨에서 주기적으로 정보를 가져다가 분석해야 하는 경우에는 어떻게 해야 할까?

OOZIE

우지는 하둡 잡을 관리하기 위한 워크플로우 스케쥴러 시스템으로서 맵리듀스, 하이브, 스쿱 등 여러 도구들을 통합하여 액션단위로 잡을 수행하게 되며 워크플로우 구성을 통하여 액션간 제어 의존성을 형성하게 된다.

workflow

액션간 의존 관계를 표현한 그래프로 왼쪽은 한 개의 워크플로우가 모두 성공한 케이스이고 오른쪽은 Hive액션을 수행 중에 에러가 발생하여 다음 액션인 Sqoop액션으로 넘어가지 못하고 실패 액션으로 워크플로우를 종료한다.

이 관계를 우지 워크플로우로 코드화 시키면 다음과 같다.

각 액션별로 이름을 부여하여 해당 액션이 수행을 마친 후 다음 수행할 액션 이름이 담겨있는 ok태그와 액션 수행 중 문제가 발생했을 때 이동하는 error태그를 확인 할 수 있는데 그래프상에 보이는 화살표 역할을 이 태그로 볼 수 있다.  그리고 지정한 시간에 맞춰서 주기적으로 잡을 실행하기 위해선 코디네이터(coordinator.xml)를 추가적으로 정의해야 한다. 자세한 내용은 우지 사이트 가이드문서를 참조하기 바란다.

이렇게 맵리듀스 소스, 하이브 스크립트, 그리고 이 코드들이 어떤 흐름에 따라 실행될지 정의한 워크플로우 XML을 가지고 우지를 통해 하둡 잡을 실행할 수 있다. 우지 실행은 기본적으로 하둡 커맨드와 마찬가지로 커맨드 모드를 지원하며 Oozie JavaAPI, RestAPI를 통하여 사용자가 만든 프로그램에 연동하여 우지를 통한 하둡 잡(job) 제어가 가능하다.

 

[정리]

이번 하둡을 경험해 보면서 느낀 점은 분석 구현도 중요하지만 하둡 시스템을 운용하는 스킬도 무척 중요하다는 걸 깨달았다. 그리 크지 않은 분산환경을 경험하면서도 여러 가지 하둡 관련 이슈를 경험했기 때문이다. 그리고 무엇보다 하둡 시스템 자체가 여러 서드파티 도구들과 연계하면서 동작하는 시스템이기 때문에 각 도구별로 많은 지식이 필요했고 성능 튜닝등 수많은 삽질(?) 경험이 쌓여야 내공이 커질 분야라고 생각이 든다.

 

 [관련사이트]

http://hadoop.apache.org/

http://hive.apache.org/

http://oozie.apache.org/

http://sqoop.apache.org/

http://flume.apache.org/

Rating: 5.0/5 (7 votes cast)


Posted by Name_null