빅데이터 적재 - 실시간 로그 파일 적재
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: Server01~03(DataNode Server01 설치 않했으면 Server02~03만 설치)
- 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
- CM 포함 컴포넌트 아님
- $ cd cd /home/pilot-pjt/
- $ wget http://archive.apache.org/dist/storm/apache-storm-0.9.6/apache-storm-0.9.6.tar.gz
- $ tar -xvf apache-storm-0.9.6.tar.gz
- $ ln -s apache-storm-0.9.6 storm
환경 설정 파일 변경
- $ cd /home/pilot-pjt/storm/conf/
- $ vi storm.yaml
$ 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
스톰 로그 레벨 조정 : INOF => ERROR
- cd /home/pilot-pjt/storm/logback/
- vi cluster.xml
- :/A1, :/ACCESS, :/METRICS 레벨 변경
Path 설정
- vi /root/.bash_profile
- PATH=$PATH:/home/pilot-pjt/storm/bin
- source /root/.bash_profile
스톰서비스 자동 실행 스크립트 작성
- 샘플 : https://gist.github.com/yulrizka
- storm-nimbus, storm-supervisor, storm-ui
- /CH05/5-1 / Sever02/etc/rc.d/init.d 에 업로드
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 |
- 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 kye-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