-
빅데이터 적재 - 실시간 로그 파일 적재빅데이터 2020. 6. 26. 10:31
5. 빅데이터 적재 - 실시간 로그 파일 적재
-
빅데이터 실시간 적재 개요
-
빅데이터 실시간 적재에 활용되는 기술
-
실시간 적재 파일럿 실행 1단계 - 적재 아키텍처
-
실시간 적재 파일럿 실행 2단계 - 적재 환경 구성
-
실시간 적재 파일럿 실행 3단계 - 적재 기능 구현
-
실시간 적재 파일럿 실행 4단계 - 적재 기능 테스트
빅데이터 실시간 적재 개요
-
적재 직전에 실시간 분석 작업 수행 => 인메모리 시스템 Redis
-
실시간 발생하는 대규모 메세지 시속하게 영구 저장 => NoSQL => HBase
-
제약 사항이 적고 랜덤 액세스가 가능해져 대규모 실시간 처리 가능
빅데이터 실시간 적재에 활용할 기술
NoSQL HBase
-
하둡 기반 칼럼지향(Column-Oriented) NoSQL
-
HTable : 칼럼 기반 데이터 구조를 정의 한 테이블
-
HDFS를 기반으로 설치 및 구성
레디스(Redis)
-
분산 캐시 시스템
-
NoSQL 처럼 대규모 데이터 관리 가능 한 IMDG(In-Memory Data Grid)
-
키/값 형식의 데이터 구조
-
인메모리 데이터를 영구 저장하는 스냇샵 기능 제공
-
Master: 분산 노드 간의 데이터 복제와 Slave 서버의 괸리를 위한 마스터 서버
-
Slave: 다수의 Slave 서버는 주로 읽기 요청, Master 서버는 쓰기 요청 처리
-
Sentinel: 레디스 3.X 에서 지원, Master 문제 발생 시 새로운 Master 선출
-
AOF/Snapshot: 데이터 영구 저장 기능
스톰(Storm)
-
실시간 데이터 병렬 처리 소프트 웨어
-
데이터가 끊이지 않고 빠르게 유입되는 데이터를 실시간 분산 처리
-
적재하기 전 발생과 동시에 이벤트를 감지하고 처리하는 방식
-
Spout: 유입된 데이터를 가공 처리해서 튜플 생성 => Bolt 에 전송
-
튜플 : 셀수있는 수량의 순서있는 열거
-
Bolt: 튜플을 받아 실제 분산 작업 수행
-
필터링(Filtering), 집계(Aggregation), 조인(Join) 등의 연산 병렬 실행
-
Topology: Spout-Bolt의 데이터 처리 흐름을 정의, 하나의 Spout과 다수의 Bolt
-
Nimbus: Topology를 Supervisor에 배포하고 작업 할당
-
Supervisor: Topology를 실행할 Worker 구동 ,할당 및 관리
-
Worker: Supervisor 상에서 실행중인 자바 프로세스 Spout, Bolt 실행
-
Executor: Worker 내에 실행되는 자바 스레드
에스퍼(Esper)
-
실시간 스트리밍 데이터의 복잡한 이벤트 처리가 필요할 때 사용하는 룰 엔진
-
스톰: 단순 가공 및 추출
-
에스퍼: 복잡한 패턴 처리 및 이벤트 처리
-
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 > Cluster 1 > 서비스 추가
-
Master, HBase Thrift Server : Server01
-
RegionServer: Server01
03(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/
-
$ 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
# 주키퍼 정보 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
스톰서비스 자동 실행 스크립트 작성
-
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 에서 확인 및 모니터링**
-
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
레디스 적재된 데이터 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 -