빅데이터

빅데이터 적재 - 실시간 로그 파일 적재

2020. 6. 26. 10:31

5. 빅데이터 적재 - 실시간 로그 파일 적재

  • 빅데이터 실시간 적재 개요

  • 빅데이터 실시간 적재에 활용되는 기술

  • 실시간 적재 파일럿 실행 1단계 - 적재 아키텍처

  • 실시간 적재 파일럿 실행 2단계 - 적재 환경 구성

  • 실시간 적재 파일럿 실행 3단계 - 적재 기능 구현

  • 실시간 적재 파일럿 실행 4단계 - 적재 기능 테스트

빅데이터 실시간 적재 개요

  • 적재 직전에 실시간 분석 작업 수행 => 인메모리 시스템 Redis

  • 실시간 발생하는 대규모 메세지 시속하게 영구 저장 => NoSQL => HBase

  • 제약 사항이 적고 랜덤 액세스가 가능해져 대규모 실시간 처리 가능

빅데이터 실시간 적재에 활용할 기술

NoSQL HBase

  • http://hbase.apache.org

  • 하둡 기반 칼럼지향(Column-Oriented) NoSQL

  • HTable : 칼럼 기반 데이터 구조를 정의 한 테이블

  • HDFS를 기반으로 설치 및 구성

 

레디스(Redis)

  • http://www.redis.io

  • 분산 캐시 시스템

  • NoSQL 처럼 대규모 데이터 관리 가능 한 IMDG(In-Memory Data Grid)

  • 키/값 형식의 데이터 구조

  • 인메모리 데이터를 영구 저장하는 스냇샵 기능 제공

  • Master: 분산 노드 간의 데이터 복제와 Slave 서버의 괸리를 위한 마스터 서버

  • Slave: 다수의 Slave 서버는 주로 읽기 요청, Master 서버는 쓰기 요청 처리

  • Sentinel: 레디스 3.X 에서 지원, Master 문제 발생 시 새로운 Master 선출

  • AOF/Snapshot: 데이터 영구 저장 기능

 

스톰(Storm)

  • http://storm.apache.org

  • 실시간 데이터 병렬 처리 소프트 웨어

  • 데이터가 끊이지 않고 빠르게 유입되는 데이터를 실시간 분산 처리

  • 적재하기 전 발생과 동시에 이벤트를 감지하고 처리하는 방식

  • Spout: 유입된 데이터를 가공 처리해서 튜플 생성 => Bolt 에 전송

  • 튜플 : 셀수있는 수량의 순서있는 열거

  • Bolt: 튜플을 받아 실제 분산 작업 수행

  • 필터링(Filtering), 집계(Aggregation), 조인(Join) 등의 연산 병렬 실행

  • Topology: Spout-Bolt의 데이터 처리 흐름을 정의, 하나의 Spout과 다수의 Bolt

  • Nimbus: Topology를 Supervisor에 배포하고 작업 할당

  • Supervisor: Topology를 실행할 Worker 구동 ,할당 및 관리

  • Worker: Supervisor 상에서 실행중인 자바 프로세스 Spout, Bolt 실행

  • Executor: Worker 내에 실행되는 자바 스레드

 

에스퍼(Esper)

  • http://www.espertech.com

  • 실시간 스트리밍 데이터의 복잡한 이벤트 처리가 필요할 때 사용하는 룰 엔진

  • 스톰: 단순 가공 및 추출

  • 에스퍼: 복잡한 패턴 처리 및 이벤트 처리

  • CEP(Complex Event Processing): 실시간 발생하는 데이터 간의 관계를 복합적으로 판단 및 처리

  • 에스퍼가 CEP 기능 제공

  • Event: 실시간 스트림으로 발생하는 데이터들의 특정 흐름 또는 패턴 정의

  • EPL: 유사 SQL을 기반으로 하는 이벤트 데이터 처리 스크립트 언어

  • Input Adapter: 소스로부터 전송되는 데이터처리 어댑터(CSV, Socket, JDBC, Http등)

  • Output Adapter: 타깃으로 전송되는 데이터처리 어댑터(HDFS,CSV, Socket,Email, Http등)

  • Window: 실시간 스트림 데이터로부터 특정 시간 또는 개수를 설정한 이벤트들을 메모리 상에 등록한 후 EPL을 통해 결과를 추출

 

스마트카 운행 정보 DriverLogMain 실시간

  • 플럼 => 카프카=> 스톰=> HBase Table (운전자의 모든 상태 정보 저장)

  • 플럼 => 카프카=> 스톰=> Redis (트정 패턴을 감지한 이벤트-과속운전자만 적재/검색/조회)

  • 스톰 : 데이터 라우팅과 스트리밍 처리

  • HBase Bolt : 모든 운행 정보 정제 없이 그대로 적재

  • 레디스 Bolt: 에스퍼의 룰 엔진이 감지한 이벤트 데이터만 적재

  • 에스퍼 EPL : 30초동안 평균 시속 체크 80km/h 초과 운전자 이벤트 정보 실시간 감지 룰 정의

실시간 적재 파일럿 실행 1단계 - 실시간 적재 아키텍처

적재 요구사항

요구사항 2

  • 운전자의 운행 정보가 담긴 로그를 실시간으로 수집해서 주행 패턴을 분석

요구사항 구체화 및 분석

1초간격 100대 스마트카 운행 정보(1건당 약4kb) 손실 없이 적재

  • 카프카와 스톰을 이용해 수집한 데이터에 대해 분산 처리 및 무결성 보장, HBase에 저장

 

적재한 운행 정보 대상으로 조건 검색이 가능 및 필요시 수정도 가능

  • Hbase의 테이블에 적재된 데이터는 스캔 조건으로 검색, 저장(Put) 기능을 이용해 기적재한 데이터에 대해 컬럼 기반으로 수정

 

운전자 운행정보 30초 기준으로 평균속도 80km/h 초과 정보 분리 적재

  • 에스퍼 EPL에서 사용자별 운행 정보를 그루핑하고, 30초의 윈도우 타임 조건으로 평균 시속 집계 및 임계치별 이벤트 정의

 

과속한 차량을 분리 적재하기 위한 조건은 별도의 룰로 정의 쉽게 수정 할 수 있어야 한다

  • 과속 기준을 80Km/h 에서 100Km/h 변경시 EPL 룰 조건 값 수정

 

분리 적재한 데이터는 외부 애플리케이션이 빠르게 접근하고 조회할 수 있어야 한다

  • 인메모리 기반 저장소 레디스에 적재해서 외부 애플리케이션에서 빠르게 조회

 

레디스 적재 데이터는 저장소의 공간을 효율적으로 사용하기 위해 1주일 경과 시 영구적 삭제

  • 레디스 클라이언트 라이브러리 제디스(Jedis) 를 이용해 적재 시 만료(Expire) 시간 설정 삭제 처리

실시간 적재 아키텍처

스톰의 실시간 데이터 처리

  • 스톰의 Spout가 카프카 토픽으로 부터 데이터 수신 받아 첫 번째 볼트에 전송

  • 해당 볼트에서는 모든 운행 정보를 HBase Bolt에 전송

  • 에스퍼의 EPL의 정의 조건에 따라 과속한 차량의 정보를 레디스 Bolt에 전송

 

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

  • HBase의 Table에는 8개의 컬럼으로 적재

  • 차량번호+발생일시 Key

  • 발생일시, 차량번호, 가속페달,브레이크페달,운전대회전각,방향지시등,주행속도, 주행구역

 

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

  • 적재시 현재날짜를 키로 과속한 차량의 정보를 적재

  • 적재 영속 시간은 5시간, 이후 만료처리되어 메모리에서 삭제

실시가 적재 파일럿 실행 2단계 - 실시간 적재 환경 구성

HBase 설치

  • CM : http://server01.hadoop.com:7180/

  • CM > Cluster 1 > 서비스 추가

  • Master, HBase Thrift Server : Server01

  • RegionServer: Server0103(DataNode Server01 설치 않했으면 Server0203만 설치)

  • HBase => 시작 => 이전 서비스 재시작

 

HBase 설치 확인

  • HBase 쉘에서 Table 새성 Put/Get 테스트

  • Server02 SSH: $ hbase shell

  • create 'smartcar_test_table','cf'

  • put 'smartcar_test_table','row-key1', 'cf:model', 'Z0001'

  • put 'smartcar_test_table','row-key1', 'cf:no', '12345'

  • get 'smartcar_test_table','row-key1'

  • Test Table Drop

  • list 'smartcar_test_table'

  • disable 'smartcar_test_table'

  • drop 'smartcar_test_table'

  • exit

  • 웹관리자 화면: http://server01.hadoop.com:60010 (저사양 Server02)

  • CM > HBase > HBase 웹 UI

  • 저사양 환경에서는 사용하지 않을 시 정지 (자원 소모 많음)

 

레디스 설치 - Server02

  • CM 포함 컴포넌트 아님

  • Server02에 설치 패키지로 직접 설치

  • 먼저 gcc, tcl 설치

  • $ yum install -y gcc*

  • $ yum install -y tcl

  • $ cd cd /home/pilot-pjt/

  • $ wget http://download.redis.io/releases/redis-3.0.7.tar.gz

  • $ tar -xvf redis-3.0.7.tar.gz

  • $ cd redis-3.0.7

  • $ make

  • $ make install

  • $ cd utils/

  • $ chmod 755 install_server.sh

  • $ ./install_server.sh

  • 기본값 유지 끝까지 Enter => Starting Redis server..., Installation successful!

 

레디스 설치 확인

  • $ service redis_6379 status

  • $ service redis_6379 start

  • $ service redis_6379 stop

  • $ redis-cli

  • $ set key:1 Hello!Bigdata

  • $ get key:1

  • $ del key:1

  • $ quit

 

스톰 설치 - Server02

 

환경 설정 파일 변경

  • $ cd /home/pilot-pjt/storm/conf/

  • $ vi storm.yaml

# 주키퍼 정보
storm.zookeeper.servers:
     - "server02.hadoop.com"
# 스톰이 작동하는 데이터 저장소
storm.local.dir: "/home/pilot-pjt/storm/data"
# 스톰 Nimbus 정보
nimbus.host: "server02.hadoop.com"
# Worker 포트(포트 갯수 만큼 멀티 Worker 만들어짐)
supervisor.slots.ports:     
   - 6700 
# 스톰 UI 접속 포트
ui.port: 8087

스톰 로그 레벨 조정 : INFO => ERROR

  • cd /home/pilot-pjt/storm/logback/

  • vi cluster.xml

  • 명령모드에서 '/INFO' 해서 검색

  • :/A1, :/ACCESS, :/METRICS 의 INFO => ERROR로 변경

 

Path 설정

  • vi /root/.bash_profile

  • PATH=$PATH:/home/pilot-pjt/storm/bin

  • 한줄로 작성 시 bin 뒤에 :/home/pilot-pjt/storm/bin 추가

  • source /root/.bash_profile

 

스톰서비스 자동 실행 스크립트 작성

 

3파일 권한 변경 : 755

  • chmod 755 /etc/rc.d/init.d/storm-nimbus

  • chmod 755 /etc/rc.d/init.d/storm-supervisor

  • chmod 755 /etc/rc.d/init.d/storm-ui

 

로그 및 Pid 디렉토리 생성

  • mkdir /var/log/storm

  • mkdir /var/run/storm

 

자동 실행 명령 및 구동 확인

  • service storm-nimbus start

  • service storm-supervisor start

  • service storm-ui start

  • service storm-nimbus status

  • service storm-supervisor status

  • service storm-ui status

 

스톰 UI 접속

실시간 적재 파일럿 실행 3단계 - 실시간 적재 기능 구현

  • 스톰의 Spout와 Bolt 프로그램 구현 단계

 

StormTopology - SmartCarDriver

  • 5개의 자바 컴포 넌트

  • 카프카 Spout => 스플릿 Bolt => HBase Bolt

  • 카프카 Spout => 에스퍼 Bolt => 레디스 Bolt

 

카프카 Spout 기능 구현

  • 운행 정보 => 카프카 => 스톰 Spout 이 읽어와서 Bolt 에 전달

  • 카프카에 적재된 데이터를 가져오기 위해 카프카- Spout 사용

 

HBase 테이블 생성

// HBase Bolt
TupleTableConfig hTableConfig = new TupleTableConfig("DriverCarInfo", "r_key");
hTableConfig.setZkQuorum("server02.hadoop.com");
hTableConfig.setZkClientPort("2181");
hTableConfig.setBatch(false);
hTableConfig.addColumn("cf1", "date");
hTableConfig.addColumn("cf1", "car_number");
hTableConfig.addColumn("cf1", "speed_pedal");
hTableConfig.addColumn("cf1", "break_pedal");
hTableConfig.addColumn("cf1", "steer_angle");
hTableConfig.addColumn("cf1", "direct_light");
hTableConfig.addColumn("cf1", "speed");
hTableConfig.addColumn("cf1", "area_number");

hbase 명령으로 테이블 생성

  • hbase org.apache.hadoop.hbase.util.RegionSplitter DriverCarInfo HexStringSplit -c 3 -f cf1

  • Table Name : DriverCarInfo

  • Region : 3개(미리 만들어 놓아 안정성과 특정 크기 도달시 자동으로 분리-샤딩 )

  • 칼럼 패밀리 : cf1

  • 3개의 Region에 접근하는 방식은 로우키의 HexString

 

스톰 Topology 배포 및 실행

  • ftp upload: bigdata.smartcar.storm-1.0.jar => /home/pilot-pjt/working

  • cd /home/pilot-pjt/working

  • storm jar bigdata.smartcar.storm-1.0.jar com.wikibook .bigdata.smartcar.storm.SmartCarDriverTopology DriverCarInfo path 설정이 안먹으면 직접 경로에서 실행

  • /home/pilot-pjt/storm/bin/storm jar bigdata.smartcar.storm-1.0.jar com.wikibook .bigdata.smartcar.storm.SmartCarDriverTopology DriverCarInfo

  • 성공메세지 확인 : Finished submitting topology: DriverCarInfo ** Storm UI 에서 확인 및 모니터링**

  • http://server02.hadoop.com:8087/

  • Topology summary > DriverCarInfo > Topology Visualization 실시간 모니터링

 

스톰 Topology 제거

  • storm kill "DriverCarInfo"

  • Topology summary > DriverCarInfo > Kill

실시간 적재 파일럿 실행 4단계 - 실시간 적재 기능 테스트

  • CM 각 서버 정상 확인

  • 스톰, 레디스 서비스 정상 확인

  • service redis_6379 status

SmartCar 로그 시뮬레이터 작동 100대

  • Sever02 SSH 접속 시뮬레이터 위치로 이동

  • cd /home/pilot-pjt/working

  • tail -f /home/pilot-pjt/working/driver-realtime-log/SmartCarDriverInfo.log

  • java -cp bigdata.smartcar.loggen-1.0.jar com.wikibook.bigdata.smartcar.loggen.DriverLogMain 20160103 20 &

 

HBase에 적재 데이터 확인

  • hbase shell

  • hbase(main)> count 'DriverCarInfo' => 50개씩

  • hbase(main):002:0> scan 'DriverCarInfo', {LIMIT=>20} => 20개

  • hbase(main):002:0> scan 'DriverCarInfo', {STARTROW=>'00000030106102-Z0007', LIMIT=>1}

00000030106102-Z0007 column=cf1:area_number, timestamp=1573392537325, value=D05 
00000030106102-Z0007 column=cf1:break_pedal, timestamp=1573392537325, value=0                             
00000030106102-Z0007 column=cf1:car_number, timestamp=1573392537325, value=Z0007                          
00000030106102-Z0007 column=cf1:date, timestamp=1573392537325, value=20160103000000                      
00000030106102-Z0007 column=cf1:direct_light, timestamp=1573392537325, value=L                           
00000030106102-Z0007 column=cf1:speed, timestamp=1573392537325, value=10 
00000030106102-Z0007 column=cf1:speed_pedal, timestamp=1573392537325, value=2                                                                 
00000030106102-Z0007 column=cf1:steer_angle, timestamp=1573392537325, value=L1         
  • area_number : D04 지역 운행

  • break_pedal: 0 => 브레이크 밟지 않은 상태

  • car_number: 차량번호

  • date: 운행 날짜 정보

  • direct_light: N => 깜빡이지 않은 상태

  • speed: 시속

  • speed_peda: 1 => 가속 페달 1단계 진행l

  • steer_angle: F => 핸들 직진 중

 

** 20160103 D04 지역 운행했던 차량 번화 지역 번호 출력**

  • scan 'DriverCarInfo', {COLUMNS=>['cf1:car_number','cf1:area_number'], FILTER=>"RowFilter(=,'regexstring:30106102') AND SingleColumnValueFilter('cf1', 'area_number',=,'regexstring:D04')"}

  • HBase 다양한 검색 조건 필요시 셀명령어 다소 복잡

  • HBase 웹 UI 에서 Requests Per Second 에서 분산 적재 확인

 

레디스 적재된 데이터 확인

  • 30초 윈도우 타임동안 평균 속도 80Km/h 초과 시 적재

  • Sever02 SSH : redis-cli

  • smembers 20160103

  • smembers key-value

  • https://zzdd1558.tistory.com/222

 

레디스 적재된 데이터 10초 간격으로 가져오는 클라이언트 애플리케이션 실행

  • ftp upload: bigdata.smartcar.redis-1.0.jar => /home/pilot-pjt/working

  • cd /home/pilot-pjt/working

  • java -cp bigdata.smartcar.redis-1.0.jar com.wikibook.bigdata.smartcar.redis.OverSpeedCarInfo 20160103

 

시뮬레이터 종료

  • ps -ef |grep smartcar.log

  • kill -9 pid

 

저사양 서버 서비스 정지

  • 플럼, 카프카, HBase => CM

  • 스톰 : service sotorm-ui, storm-supervisor, stom-nimbus stop

  • 레디스: service redis_6379 stop