[출처: 실무로 배우는 빅데이터 기술, 김강원 저]


1. 빅데이터 실시간 적재 개요

  • 앞장에 이어서 이번에는 스마트카 운전자의 실시간 운행 정보를 분석한 후 적재하는 영역 다룸
  • 실시간 로그 분석에는 작지만 대량으로 발생하는 메시지성 데이터를 실시간으로 분석 처리하며, 해당 결과를 인메모리에 저장해 주변 시스템과 빠르게 공유함
  • 이때 대량의 메시지 데이터를 영구 저장하기 위해 하둡을 직접 이용하지는 않음
  • 유입된 작은 메시지 한 건을 바로 하둡에 저장할 경우 한 개의 HDFS 파일이 생성되는데, 초당 수천 건의 트랜잭션이 발생하는 메시지의 경우 파일 개수가 기하급수적으로 늘어나고, 이로 인해 하둡 클러스터에 지나친 오버헤드가 발생하기 때문
  • 중간에 메시지를 특정 크기로 모았다가 한번에 적재하거나, 대규모 트랜잭션 데이터를 처리하는 데 최적화된 칼럼 지향형 NoSQL DB 주로 이용


2. HBASE

1) HBASE 소개

  • 하둡 기반의 칼럼 지향 NoSQL 데이터베이스
  • 스키마 변경이 자유롭고, 리전이라는 수십~수백 대의 분산 서버로 샤딩복제등의 기능을 지원해 성능과 안정성을 보장하는 특징을 가짐
  • 특히 하둡의 확장성과 내고장성을 그대로 이용할 수 있어 대규모 실시간 데이터 처리를 위한 스피트 레이어 저장소에 주로 사용됨


2) 주요 구성 요소

주요 구성 요소 설명
HTable 칼럼 기반 데이터 구조를 정의한 테이블
공통점이 있는 칼럼들의 그룹을 묶은 칼럼 패밀리와 테이블의 로우를 식별해서 접근하기 위한 로우키로 구성
HMaster HRegion 서버를 관리하며, HRegion들이 속한 HRegion 서버의 메타 정보 관리
HRegion HTable의 크기에 따라 자동으로 수평 분할이 발생하고, 이때 분할된 블록을 HRegion 단위로 지정
HRegionServer 분산 노드별 HRegionServer가 구성되며, 하나의 HRegionServer에는 다수의 HRegion이 생성되어 HRegion 관리
Store 하나의 Store에는 칼럼 패밀리가 저장 및 관리되며, MemStore와 HFile로 구성됨
MemStore Store 내의 데이터를 인메모리에 저장 및 관리하는 데이터 캐시 영역
HFile Store 내의 데이터를 스토리지에 저장 및 관리하는 영구 저장 영역


3) HBase 아키텍처

  • 가장 큰 특징은 하둡의 HDFS를 기반으로 설치 및 구성된다는 것
  • 그로 인해 분산 데이터베이스 아키텍처를 채택하고 있으며,
  • HDFS의 가용성과 확장성을 그대로 물려받음


  • 클라이언트가 HBase에 데이터를 저장(put)하는 과정

  • 클라이언트가 HBase 테이블에 특정 데이터를 저장하기 전, 주키퍼를 통해 HTable의 기본 정보와 해당 HRegion의 위치 정보를 알아냄
  • 해당 정보를 기반으로 클라이언트가 직접 HRegionServer로 연결되어 HRegion의 Memory 영역인 MemStore에 데이터 저장
  • 이때 MemStore에 저장된 데이터는 특정 시점이 되면 HFile로 HDFS에 플러시(Flush)되고, HFile은 HRegion의 상황에 따라 최적의 HFile로 재구성되는 작업이 이루어짐
  • 이러한 플러시 과정들을 HBase에서는 Minor/Major Compaction이라고 함


  • HBase에서 특정 데이터를 가져오는 과정
  • 주키퍼를 통해 로우키(RowKey)에 해당하는 데이터의 위치 정보를 알아냄
  • 해당 HRegionServer의 Memory 영역인 MemStore에서 데이터를 가져옴으로써 디스크 I/O를 최소화하면서 빠른 응답 속도 보장
  • 만일 데이터가 MemStore에서 플러시되어 존재하지 않으면 HFile 영역으로 이동해 데이터 찾게 되는데, 이때 HBase와 HDFS 사이의 모든 데이터 스트림 라인들은 항상 열려있으므로 레이턴시가 발생하지 않음
    (레이턴시: 시간 지연, 하나의 데이터 패킷을 한 지점에서 다른 지점으로 보내는데 소요되는 시간)


4) HBase 활용 방안

  • 앞서 CH03에서 Flume을 이용해 수집한 스마트카 운전자의 운행 정보를 Kafka까지 전송했음
  • 이번 장에서는 Kafka에 저장되어 있는 데이터를 Storm이 받아서 HBase의 테이블에 모두 적재
  • 또한, HBase에 저장된 스마트카 운전자의 운행 정보를 특정 조건에 따라 필터링해서 신속하게 조회해 보고, 하이브 핸들러를 이용해 HBase에 저장된 데이터와 하이브 데이터를 동시에 활용해봄


3. Redis

1) 레디스 소개

  • 분산 캐시 시스템이면서, NoSQL DB처럼 대규모 데이터 관리 능력도 갖춘 IMDG(In-Memory Data Grid) 소프트웨어
  • 키/값 형식의 데이터 구조를 분산 서버 상의 메모리에 저장하면서 고성능의 응답 속도 보장
  • 다양한 데이터 타입을 지원하기 때문에 데이터를 구조화해서 저장할 수 있어, 단순 키/값 이상의 데이터 복잡성도 처리할 수 있음
  • 인메모리 데이터를 영구적으로 저장할 수 있는 스냅샷 기능 제공
  • 데이터의 유실에 대비해 AOF(Append Only File) 기능으로 정합성 보장
  • NoSQL의 특징인 데이터의 샤딩과 복제도 지원하여 높은 성능이 필요한 서비스에서 많이 사용됨


2) 주요 구성 요소

주요 구성 요소 설명
Master 분산 노드 간의 데이터 복제와 Slave 서버의 관리를 위한 Master 서버
Slave 다수의 Slave 서버는 주로 읽기 요청을 처리하고, Master 서버는 쓰기 요청을 처리
Sentinel 레디스 3.x부터 지원하는 기능으로, Master 서버에 문제가 발생할 경우 새로운 Master를 선출하는 기능
Replication Master 서버에 쓰인 내용을 Slave 서버로 복제해서 동기화 처리
AOF / Snapshot 데이터를 영구적으로 저장하는 기능으로, 명령어를 기록하는 AOF와 스냅샷 이미지 파일 방식 지원


3) 레디스 아키텍처

  • 3.x에서부터 HA 기능이 강화되면서 클러스터의 완성도가 높아짐
  • 요구사항과 데이터의 샤딩 및 복제 구성 방식에 따라 세가지 아키텍처 구성 가능


1) 레디스 아키텍처 1

  • Single Master 형식
  • 개발과 테스트 환경에 주로 사용됨
  • 설치하기가 쉽고 단일 서버만으로도 빠른 응답 속도와 안정적인 기능을 제공함으로써 소규모이면서 중요도가 비교적 낮은 시스템 간의 데이터 공유에도 종종 사용됨


2) 레디스 아키텍처 2

  • Single Master / Multi Slave 형식
  • Master에 쓰여진 데이터는 복제를 통해 Slave 노드로 복제되면서 데이터 정합성 유지
  • 쓰기 / 읽기 노드를 분리해서 전체적인 성능을 향상시킨 구성
  • Slave 2와 같이 읽기 노드를 추가해서 성능을 극대화할 수 있음


3) 레디스 아키텍처 3

  • 버전 3.x부터 지원되는 HA 클러스터링 구조
  • 아키텍처 2는 두가지 문제점이 있음
    • Master 서버 장애 발생 시 쓰기 요청이 실패하면서 데이터 유실이 발생할 수 있는 취약한 구조
    • 클라이언트가 쓰기 노드와 읽기 노드를 알고 있으야 하므로 클라이언트 프로그램에 복잡도 발생
  • 이러한 문제점 극복을 위해 Sentinel이라는 노드 모니터링/제어 컴포넌트 추가
  • Sentinel이 노드들을 모니터링하고 있다가, Master 서버에 문제가 발생하면 Slave 노드 중 하나를 Master 노드로 지정하고, 문제가 됐던 Master 노드와 연결을 끊으면서 HA 기능 제공


4) 레디스 활용 방안

  • 스마트카 운전자의 상태 정보를 실시간으로 분석
  • 분석한 결과를 빠르게 저장하면서 주변 시스템과 공유하기 위한 저장소로 레디스 활용
  • 위의 그림에서 Storm에서 두 개의 경로로 분리되는 것을 볼 수 있음
    • HBase에는 운전자의 모든 상태 정보를 저장
    • 레디스에는 운전자의 특정 패턴을 감지한 이벤트 결과(과속한 운전자 정보)만 저장
  • 그러면 주변 응용 시스템에서 레디스에 적재된 정보를 빠르게 조회해서 활용하게 됨


4. Storm

1) 스톰 소개

  • 스피드 데이터를 인메모리 상에서 병렬 처리하기 위한 소프트웨어
  • 스피드 데이터는 원천 시스템의 수많은 이벤트가 만들어내며, 작지만 대규모의 동시다발적이라는 특성이 있음
  • 이러한 스피드 데이터를 실시간으로 다루기 위해 모든 데이터를 인메모리 상에서 분산 병렬 처리하고, 분산 데이터를 통제하기 위한 강력한 기능(분리, 정제, 통합, 집계 등)과 아키텍처 제공


  • 실시간 분산 처리 유형으로는 데이터 발생과 동시에 처리하는 완전 실시간 방식과, 발생한 데이터를 적재한 후 빠르게 배치를 실행하는 마이크로 배치 방식이 있음
  • 스톰은 전자에 해당하는 완전 실시간 방식으로, 조금의 레이턴시도 허용하지 않는 아키텍처에 적용


2) 주요 구성 요소

주요 구성 요소 설명
Spout 외부로부터 데이터를 유입받아 가공처리해서 튜플을 생성, 이후 해당 튜플을 Bolt에 전송
Bolt 튜플을 받아 실제 분산 작업 수행
필터링, 집계, 조인 등의 연산을 병렬로 실행
Topology Spout-Bolt의 데이터 처리 흐름 정의
하나의 Spout과 다수의 Bolt로 구성
Nimbus Topology를 Supervisor에 배포하고 작업 할당
Supervisor를 모니터링하다 필요 시 페일오버(Fail-over) 처리
Worker Supervisor 상에서 실행 중인 자바 프로세스로 Spout과 Bolt 실행
Executor Worker 내에서 실행되는 자바 스레드
Tasker Spout과 Bolt 객체가 할당


3) 스톰 아키텍처

1) Nimbus와 Supervisor

  • Nimbus가 자바 프로그램으로 구성된 Topology Jar를 배포하기 위해 주키퍼로부터 Supervisor 정보 알아냄
  • 그 후 해당 Topology Jar 파일을 각 Supervisor에 전송하면 Supervisor는 해당 Node에서 Worker, Executor를 만들고, Spout과 Bolt가 수행되기 위한 Task도 할당함
  • Supervisor가 정상적으로 배포되면, Exeternal Source Application 1에서 발생한 데이터가 Spout을 통해 유입되기 시작
  • 이를 다시 Bolt가 받아 데이터를 분산 처리하고, 처리 결과는 Bolt를 통해 타깃 시스템인 Exeternal Target Application 2로 전송됨
  • 이때 Task, Executor 개수를 증가시키면서 대규모 병렬 처리가 가능해지고, Spout과 Bolt의 성능이 향상됨


  • 매우 견고한 장애 복구 기능도 제공
  • 만약 특정 Supervisor가 생성한 Worker 프로세스에 심각한 문제가 발생해 종료되면 Supervisor는 새로운 Worker 프로세스 다시 생성
  • 이때 처리중이던 데이터들(튜플)은 이전 수신지로 롤백되고, Topology가 다시 정상적으로 복구되면 롤백 시점부터 다시 처리하면서 데이터 정합성 보장


4) 스톰 활용 방안

  • 파일럿 프로젝트에서 스톰은 스마트카 운전자의 실시간 운행 정보를 대상으로 데이터 라우팅과 스트리밍 처리에 활용될 것
  • 카프카의 Spout을 통해 유입되는 모든 운전자의 운행 정보 데이터는 두 개의 Bolt (HBase Bolt / Redis Bolt)로 나눠져서 처리됨
    • HBase Bolt는 모든 운행 정보를 정제없이 HBase로 곧바로 적재
    • Redis Bolt는 에스퍼라는 룰 엔진이 감지한 이상 운행 패턴의 정보만 레디스 서버에 저장


4. Esper

1) 에스퍼 소개

  • 실시간 스트리밍 데이터의 복잡한 이벤트 처리가 필요할 때 사용하는 룰 엔진
  • 스톰은 실시간으로 발생하는 데이터로부터 복잡한 패턴을 찾고, 그 패턴에 따른 이벤트 처리하는 것은 쉽지 않음
  • 실시간으로 발생하는 데이터 간의 관계를 복합적으로 판단 및 처리하는 것을 CEP라고 하는데, 에스퍼가 이 CEP 기능을 제공함


2) 주요 구성 요소

주요 구성 요소 설명
Event 실시간 스트림으로 발생하는 데이터들의 특정 흐름 또는 패턴 정의
EPL 유사 SQL을 기반으로 하는 이벤트 데이터 처리 스크립트 언어
Input Adapter 소스로부터 전송되는 데이터를 처리하기 위한 어댑터 제공 (CSV, Socket, JDBC, http 등)
Output Adapter 타깃으로 전송하는 데이터를 처리하기 위한 어댑터 제공 (HFS, CSV, Socket, Email, Http 등)
Window 실시간 스트림 데이터로부터 특정 시간 또는 개수를 설정한 이벤트들을 메모리 상에 등록한 후 EPL을 통해 결과 추출


3) 에스퍼 아키텍처

1) 에스퍼 아키텍처 1

  • 에스퍼는 CEP(Complex Event Processing) 엔진
  • 엔진은 단순 자바 라이브러리 프로그램
  • 애플리케이션 서버(톰캣, 제이보스, OSGI, 스톰 등) 또는 애플리케이션의 컨텍스트에 에스퍼 라이브러리를 설치하고, 해당 라이브러리를 이용해 CEP 프로그래밍을 하는 단순 아키텍처


2) 에스퍼 아키텍처2

  • 에스퍼의 EPL을 이용해 대규모 분산 아키텍처를 구성할 때는 룰을 통합 관리하고, 분산 노드에 일관되게 적용하기 위해 위 이미지처럼 다소 복잡한 구성 필요
  • 이때 분산된 응용 서버에 에스퍼 엔진을 설치하고, 에스퍼 엔진들이 동일한 EPL 룰을 동작으로 일괄 로딩하기 위해 EPL 공유 저장소가 이용됨


4) 에스퍼 활용 방안

  • 파일럿 프로젝트에서는 운전자의 운행 데이터를 실시간으로 분석하기 위해 데스퍼 EPL 활용
  • EPL은 30초 동안의 평균 시속을 체크해서 80km/h를 초과하는 운전자 이벤트 정보를 실시간으로 감지할 수 있도록 룰 정의
  • 해당 이벤트 데이터는 감지 즉시 레디스에 적재되어 과속한 차량 정보만 관리할 수 있게 됨


5. 실시간 적재 아키텍처

1) 실시간 적재 요구사항

  • 요구사항 1 : 차량의 다양한 장치로부터 발생하는 로그 파일을 수집해서 기능별 상태 점검
  • 요구사항 2 : 운전자의 운행 정보가 담긴 로그를 실시간으로 수집해서 주행 패턴 분석


실시간 적재 요구사항 구체화 분석 및 해결 방안
1. 1초 간격으로 발생하는 100명의 운행 정보(1건: 약 4KB는 손실없이 적재해야 함 카프카와 스톰을 이용해 수집한 데이터에 대해 분산 처리 및 무결성 보장, 분산 처리가 완료된 데이터는 HBase에 적재
2. 적재한 운행 정보를 대상으로 조건 검색이 가능해야 하며, 필요시 수정도 가능해야 함 HBase의 테이블에 적재된 데이터는 스캔 조건으로 검색하며, 저장(Put) 기능을 이용해 기적재한 데이터에 대해 칼럼 기반으로 수정
3. 운전자의 운행 정보 중 30초를 기준으로 평균 속도가 80km/h를 초과한 정보는 분리 적재함 에스퍼의 EPL에서 사용자별로 운행 정보를 그루핑하고, 30초의 윈도우 타임 조건으로 평균 시속 집계 및 임계치별 이벤트 정의
4. 과속한 차량을 분리 적재하기 위한 조건은 별도의 룰로 정의하고 쉽게 수정할 수 있어야 함 과속 기준을 80km/h에서 100km/h로 수정해야 할 경우 EPL의 평균 속도를 체크하는 조건값만 수정
5. 분리 적재한 데이터는 외부 애플리케이션이 빠르게 접근하고 조회할 수 있게 해야 함 실시간 이벤트로 감지된 데이터는 인메모리 기반 저장소인 레디스에 적재하여 외부 애플리케이션에서 빠르게 조회
6. 레디스에 적재한 데이터는 저장소의 공간을 효율적으로 사용하기 위해 1주일이 지나면 영구적으로 삭제함 레디스 클라이언트 라이브러리인 **제디스(Jedis) 클라이언트를 이용해 데이터 적재 시 만료(Expire) 시간을 설정해 자동으로 영구 삭제 처리


2) 실시간 적재 아키텍처

  • CH03에서는 플럼의 DriverCarInfo 에이전트에서 수집한 운전자 운행 정보를 카프카의 토픽에 실시간으로 전송함
  • Ch05에서는 스톰의 카프카-Spout을 이용해 카프카의 토픽에 저장되어 있는 운전자 운행 정보를 가져와 처리하고, 카프카-Bolt에서 이벤트 조건에 따라 레디스와 HBase에 각각 분리 적재함


스톰의 실시간 데이터 처리

  • 스톰은 카프카로부터 수신받은 운행 정보 데이터를 분산 처리하고, 최종 목적지 저장소에 적재하는 역할
  • 이때 빠르게 유입되는 데이터로부터 의미 있는 패턴을 발견하기 위해 에스퍼 엔진 이용
  • 그림에서 ⓵)
    • 스톰의 Spout가 카프카의 토픽으로부터 운전자의 실시간 운행 정보를 수신받아 첫 번째 볼트에 전송
    • 해당 Bolt에서는 모든 운행 정보를 HBase Bolt로 전송하면서, 에스퍼의 EPL에서 정의한 조건에 따라 과속한 차량의 정보를 레디스 Bolt에 전송


HBase에 모든 운전자 운행 정보 적재

  • 그림에서 ⓶)
    • HBase의 테이블에는 차량번호+발생일시를 로우키로 해서 8개의 칼럼의 구조로 모든 스마트카 운전자의 운행 정보가 적재됨
    • 칼럼 (발생일시, 차량번호, 가속 페달, 브레이크 페달, 운전대 회전각, 방향지시등, 주행 속도, 주행 구역)


레디스에 과속한 운전자 정보 적재

  • 그림에서 ⓷)
    • 레디스에 적재될 때는 현재 날짜를 키로 해서 과속한 차량의 정보를 세트 데이터 구조로 적재
    • 적재 영속 시간은 5시간으로 하며, 이후에 만료 처리되어 메모리에서 자동으로 삭제됨


6. 실시간 적재 환경 구성

  • 3개의 소프트웨어 추가 설치
    • CM으로 HBase를 Server01, 02에 있는 데이터노드에 설치
    • 레디스스톰은 CM에 포함되어 있지 않은 소프트웨어로 별도의 패키지로 설치