데이터실무

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

개요

데이터 처리
분산병렬배치처리
개요
작성자
admin
작성일
2021-02-15 14:03
조회
870

지금까지는 데이터베이스에 데이터를 저장하고 이를 SQL 쿼리로 분석했다. 그렇기 때문에 데이터가 트랙잭션 데이터인지, 분석과 리포트 데이터인지에 따라 DBMS가 달라져야만 했다. 바야흐로 모든 기기가 인터넷에 연결되는 사물인터넷 시대가 도래했다. 사물인터넷에서 발생하는 데이터는 흔히 말하는 대용량 데이터이기 때문에 전통적인 DBMS에서 저장ㆍ처리하기에는 한계가 따를 수 있다.
분산 환경은 시스템의 성능과 저장 측면에서 발달해왔다. 정보를 빠르게 처리하는 것이 분산처리의 목적이라면, 분산 저장 시스템은 저장공간을 효율적으로 확장하는데 역점을 두고 있다. 이 차원에서 구글은 「The Google File System」과 「MapReduce」라는 논문을 통해 분산 저장 및 처리 기술을 공개했다. 이를 참조해 하둡(Hadoop)이라는 기술이 등장해 빠르게 발전하고 있다. 현재의 하둡 2.x버전은 1.x 버전에서 많은 혁신을 이룩했다. 1.x 버전에서 대표적인 기술 2개는 데이터 저장을 위한 HDFS와 데이터 처리를 위한 맵리듀스(MapReduce)다. 2.x 버전부터는 자원관리의 핵심인 YARN을 기반으로 수많은 컴포넌트들이 추가되면서 발전하고 있다. 여기에서는 맵리듀스를 기반으로 데이터를 처리하는 것에 초점을 두며. 로컬 또는 클러스터 환경이 구축돼 있다고 전제하고 하둡을 소개한다.


맵리듀스

맵리듀스(MapReduce)는 2004년 구글에서 대용량 데이터를 분산처리하기 위해 발표한 대용량 분산 처리 프레임워크다. 이 프레임워크는 테라바이트 또는 페타바이트 이상의 대용량 데이터를 저렴한 x86 서버를 클러스터링해 분산 처리한다.
맵리듀스에서 데이터를 처리하는 기본 단위는 매퍼(Mapper)와 리듀스(Reduce)다. 많은 양의 데이터를 맵리듀스 형태로 작성하면, 클러스터링 환경에서 효과적으로 분산 처리할 수 있다. 맵리듀스의 핵심은 입력과 출력이며 Key와 Value로 구성된다. 맵(Map)은 산재된 데이터를 키와 벨류 형태로 연관성이 있는 데이터로 묶는 작업을 하며, 리듀스는 맵 작업 결과에서 중복 데이터를 제거한 후 원하는 데이터를 추출하는 작업을 수행한다.
하둡에서 잡은 1:n 방식으로 실행되는데, 1은 잡트레커라고 할 수 있고 n은 태스크 트레커라고 할 수 있다. 잡트레커는 태스크 트레커가 수행할 각각의 태스크를 스케줄링해 시스템 내에서 수행하는 모든 잡이 실행되도록 조절하는 역할을 수행한다. 태크스(Task) 트레커는 각각의 태스크를 수행한 후, 각각의 실행 결과를 잡트레커에 보내는 역할을 한다. 맵리듀스의 논리적 데이터 처리 절차는 다음과 같다.



1단계

혼재된 각종 데이터 세트를 각각 Key와 Value 쌍으로 묶어서 Map 함수의 입력 값으로 보내는 단계다. 전송된 데이터 세트를 Map을 통해 필요한 분석 대상만을 각각 추출한 후 필요 없거나 잘못된 레코드를 제거하는 작업을 한다. 예를 들어 대용량 로그 파일은 SAM 파일 형태로 생성되거나 실시간으로 발생하는 경우가 대부분이다. 파싱 작업을 통해 원하는 형태로 데이터를 가공하는데, 이러한 작업을 효과적으로 할 수 있는 것이 바로 맵리듀스다.

2단계

1단계 작업이 완료되면, 분석 대상 값만을 추출한다. 추출된 분석 대상 데이터를 Key-Value 형태로 정렬해 Reduce에게 보낸다. 전송된 데이터는 Reduce 함수의 입력 값으로 사용된다.

3단계

Reduce 함수로 2단계에서 받은 입력값을 분석해 원하는 값을 구하는 단계다. 다시 말하면, Map은 산재된 입력 데이터를 원하는 형태의 데이터와 묶어주는 작업을 통해 Repository 데이터 형태를 띄게 된다. 이 단계에서는 리듀스를 통해 (중복된 값을 제거해) 원하는 데이터만 추출하는 작업을 진행한다.


맵리듀스의 특징

하둡 맵리듀스(MapReduce)는 HDFS(Hadoop Distributed File System)에 저장된 데이터를 처리하기 위한 기술 가운데 하나이다. 맵리듀스의 특징은 다음과 같다.



① 데이터가 있는 서버로 코드를 전송

데이터를 다루는 전통적인 방법은 개발환경으로 데이터를 가져와 프로그래밍하는 것이었다. 하지만 이 방법은 방대한 데이터 또는 산재된 데이터는 처리하기가 매우 까다롭다. 따라서 데이터가 있는 곳에 코드를 전달ㆍ운용하는 것이 더 효율적이다. 더 나아가 산재된 현장의 데이터더라도 여러 개로 분할ㆍ복제돼 있는 경우, 해당 위치까지 처리 코드를 전달할 수 있다면 훨씬 유리할 것이다.

② Key/Value 형태로 데이터세트를 변환해 처리

데이터는 HDFS 환경에 따라 블록 단위로 쪼개져 분산ㆍ복제ㆍ저장된다. 이때 각 블록을 읽어서 데이터를 처리하는데, 이것을 맵 태스크라고 한다. 맵 태스크의 출력 결과를 최종 처리하는 과정을 리듀스 태스크라 한다. 즉 맵 태스크는 기준이 되는 키를 중심으로 데이터를 읽고, 키-밸류 형태로 만들어 준다. 또한 리듀스 태스크는 맵 태스크 결과인 키를 중심으로 데이터를 집계한다.

③ Share Nothing 아키텍처

하둡은 뛰어난 병렬 처리 시스템이다. 맵 태스크 과정의 태스크나 리듀스 태스크 과정의 태스크끼리는 서로 데이터를 공유하지 않는다. 즉, 자신의 데이터만 처리해 디스크에 저장하므로 매우 심플하다. 만일 공유를 하게 했다면 매우 복잡한 시스템이 되고 말았을 것이다.

④ 오프라인 배치 처리에 적합

맵리듀스는 프로그램을 만드는데도 많은 시간이 걸리지만, 프로그램을 실행하기 위해서 준비하는 데에도 시간이 필요하다. 무엇보다 맵과 리듀스 태스크 간에 셔플링 단계가 존재함에 따라 시간이 더 걸린다. 그래서 맵리듀스는 실시간보다 일반배치 작업에 적합하다. 대신 실시간 처리의 약점은 여러가지 컴포넌트로 극복하고 있다. 어떻게 보면 맵리듀스는 느리고, 배우기 어렵고, 시간이 오래 걸려서 불필요한 것만 같다. 그러나 데이터 양이 많아지고 배치 작업으로 스케줄링잡 관리 시스템을 만들기 위해서는 맵리듀스가 필요하다. 물론 이 조차도 Hive, Pig, Sqoop 등으로 대체할 수 있다. 그러나 Native라고 할 수 있는 맵리듀스의 처리 속도는 Pig, Hive보다 당연히 빠르다. 또 수집된 다양한 데이터, 예를 들어 지리정보 등의 데이터의 ETL 처리 비용은 Hive, Pig보다 맵리듀스가 훨씬 저렴하다. 결국 각각의 용도는 조금씩 다르므로 Hive, Pig 사용자로서 그치지 않고 해당 컴포넌트 아키텍처를 이해하기 위해서는 맵리듀스에 대한 이해가 필요하다.


맵리듀스의 개념

맵리듀스는 간단히 맵과 리듀스의 메소드로 구성된다. 이들 처리는 다음과 같다.

맵 처리: (K1, V1) → LIST(K2, V2) 리듀스 처리: (K2, LIST(V2)) → LIST(K3, V3)

맵 메소드는 K1과 V1으로 구성된 데이터를 입력 받아서 사용자 로직에 따라 분류ㆍ가공돼 K2, V2라는 리스트를 반환한다. 당연히 K2는 여러 개가 될 수 있다. 즉, 다른 키의 종류가 많다는 것을 의미하며, 리듀스는 K2로 그룹핑된 리스트를 입력을 받아 집계 처리해 새로운 K3와 V3를 반환한다. 이것의 절차를 [그림 Ⅲ-1-1]에서 워드카운트 맵리듀스로 표현해 보았다.

[그림 Ⅲ-1-1] 맵리듀스 처리 과정

[그림 Ⅲ-1-1] 맵리듀스 처리 과정


맵리듀스 프레임워크

맵리듀스 프레임워크는 하둡 1.x 버전과 2.x 버전이 다르다. 그렇다고 맵리듀스 코드까지 아주 달라진 것은 아니다. 기존의 하둡 1.x로 만든 맵리듀스 코드는 하둡 2.x에서도 잘 실행된다. 이것은 YARN 기반의 하둡 2.x에서 호환성을 유지하기 때문이다. 하둡 1.x 버전으로 만든 맵리듀스 프레임워크를 설명한 다음, 후반부에 YARN에 대해 소개하겠다.