ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빅데이터 적재 - 실시간 로그 파일 적재
    빅데이터 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

    '빅데이터' 카테고리의 다른 글

    빅데이터 분석  (0) 2020.07.01
    빅데이터 탐색  (0) 2020.07.01
    빅데이터 적재 - 대용량 로그 파일 적재  (0) 2020.06.25
    빅데이터 수집  (0) 2020.06.25
    빅데이터 파일럿 프로젝트  (0) 2020.06.25
Designed by Tistory.