Data

[1028 from 실무로 배우는 빅데이터 기술 By 김강원 06]수집- 개요/아키텍처

프로젝트 단계 1. 빅데이터 이해하기
2. 빅데이터 파일럿 프로젝트
3. 빅데이터 수집
4. 빅데이터 적재 1 : 대용량 로그파일 적재
5. 빅데이터 적재 2 : 실시간 로그/분석 적재
6. 빅데이터 탐색
7. 빅데이터 분석
8. 분석환경 확장. 
빅데이터 수집 1. 빅데이터 수집 개요
- 빅데이터 수집개념 중요성 , 일반 수집과 차이점 설명  >> 분산환경
2. 빅데이터 수집에 활용되는 기술
- 빅데이터 수집에서 사용할 두가지 기술(플럼, 카프카)를 소개하고 기술별 주요 기능과 아키텍쳐, 활용방안 알아본다. 
3. 수집, 파일럿 실행 1단계 -수집 아키텍처
- 스마트카에서 발생하는 로그파일 수집과 관련된 요구사항 구체화, 수집 요구사항을 해결하기 위한 파일럿 아키텍쳐를 이해한다. 
4. 수집 파일럿 실행 2단계 - 수집 환경구성
- 스마트카 로그 파일을 수집하기 위한 아키텍처 설치 및 환경구성을 진행한다. 플럼 카프카 순으로 설치를 진행한다. 
5. 수집 파일럿 실행 3단계 - 플럼 수집 기능구현
- 스마트카 로그 파일을 수집하기 위한 플럼 환경을 구성하고 관련 에이전트를 생성한다. 
6. 수집 파일럿 실행 4단계 - 카프카 수집 기능 구현
- 플럼이 수집한 데이터를 카프카 토픽에 전송하는 기능을 구현하고, 카프카의 토픽에 전송된 데이터를 확인하는 방법을 알아본다. 
7. 수집 파일럿 실행 5단계 - 수집 기능 테스트
- 로그 시뮬레이터가 생성한 스마트카의 상태정보 데이터를 플럼이 수집해서 카프카의 토픽에 전송하는 기능을 점검하고 전송된 데이터를 확인한다. 
수집 개요 수집 -> 적재 -> (처리/탐색 -> 분석/응용)  : 전체리소스 40~50%

내부데이터  ---정형--->  빅데이터 수집  <---비정형---- 외부데이터

비정형 : 스키마 정보 없이..텍스트 데이터 ex) SNS, 포털/블로그 
반정형 : CSV ex) 뉴스/날씨 기관 지표

내부데이터: 고객정보(RDB) , 거래정보(FTP), 상품/서비스정보(API), 마케팅/VOC(fIle)
외부데이터: SNS(API), 포털/블로그(크롤링), 뉴스/날씨(RSS), 기관, 지표(FTP)

내부데이터 효과 : 스마트카 이상징후 예측, 운전패턴 군집, 차량용품 추천
외부데이터 효과 : 운전자 성향, 평판분석, 사용자 프로파일 관심사 동향분석, 날씨 교통정보 차량 최적화
                       운전자의 관심, 뉴스를 음성 서비스로 제공
수집절차 수집 대상선정 (-> 수집계획 수립 -> 수집 실행)

수집 대상선정 : 도메인, 데이터셋 도출, 리스트 작성, 대상 부서 파악

수집 계획 수립 : 데이터 제공여부 협의 , 유형/속성 확인, 수집환경/표준 파악, 주기/ 용량 파악
                      수집 연동/포맷 파악, 수집 기술 선정, 수집 정의서/계획서 작성
                        **** 수집 정의서 : I/F 정의서 -> 개발. 
  
수집 실행 : 단위테스트 진행, 연동 테스트 진행, 데이터 수집 실행, 데이터 적재 처리. 
수집이 먼저?
분석 활용이 먼저?
정보없이 데이터만 가질수 있다.   
하지만 데이터 없이 정보를 가질 수 없다. 
- 대이얼 키즈 모란. 

~~ 분석없이 수집할수 있다. .. 무엇을 분석할지모르면서 무엇을 수집?
~~무엇을 분석할지 알고 있다면.. 빅데이터 시스템 필요 없다. .. 기존시스템 활용. 
기존 한계를 뛰어 넘기위한 시스템. >> 데이터로부터 새로운 발견이 목표. 
3V + 분석가 노하우.  데이터 패턴. .. 기존에 없었떤 데이터 패턴까지 볼수 있어 새로운 인사이트. 

ROI : Return on investment 투자 대비 수익이 나지 않아 실행하지 않았음. 
외부데이터 의 양이 너무 많아서.. RDBMS 한계 , 빅데이터 기술.  x86 저비용 고사양하드웨어로 가능해짐
수집 - 이키텍처
수집 요구사항 1. 차량의 다양한 장치로 발생하는 로그 파일을 수집해서 기능별 상태를 점검
2. 운전자의 운행정보가 담긴 로그를 실시간으로 수집해서 주행 패턴을 분석. 
수집 요구사항 구체화  1. 스마트카로부터 로그 파일들이 주기적으로 발생 : 플럼 이용 대용량 배치파일 실시간 로그파일수집
2. 스마트카 배치 로그 파일 이벤트 감지 : 플럼의 Source 컴포넌트중 SpoolDir이용  주기적인 로그파일 발생 이벤트 감지
3. 스마트카 실시간 로그발생이벤트 감지 > Source 컴포넌트중 Exec-Tail 을 이용 특정 로그 파일 로그생성이벤트 감지. 
4. 스마트 카에서 만들어내는 로그 데이터에 가비지데이터 있을 수 있다. >> 플럼의 Interceptor를 이용해 정상 패턴의 데이터만 필터링
5. 수집 도중 장애가 발생해도 데이터를 안전하게 보관및 재처리 할수 있다.>> 플럼의 메모리 Channel 카프카Broker 사용으로 로컬 디스크 파일 시스템에 수집 데이터를 임시저장
6. 스마트카의 실시간 로그 파일은 비동기 처리로 빠른 수집 처리를 해야한다. >> 플럼에서 수집한 데이터를 카프카 Sink 컴포넌트를 이용해 카프카 Topic에 비동기 전송. 
1단계 : 
플럼에이전트 1,2로 사용하는 방식. 
[3초간격발생] 
1. 차량상태정보 100MB/1일 
-------플럼에이전트1--------
2. SoolDir Source
3. Memory Channel
4. Logger Sink
---------플럼 Stdout--------
5. Log 파일                   >>>>>최종 하둡.....???
~~~~~~~~~~~~~~~~~~~~
[1초간격으로 발생]
6. 운전자운행정보 400KB/1초
--------프럶에이전트 2-------
7. Exec Tail Source
8. Memory Channel
9. Kafka Sink
----------카프카-----------
10. Topic
수집 기능 테스트 : 서버 2
1. 스마트카 로그
시뮬레이터 백그라운드 방식으로 실행. 

cd /home/pilot-pjt/working
(bigdata.smartcar.loggen-1.0.jar >> 로그시뮬레이터. )


## 일간. 
java -cp bigdata.smartcar.loggen-1.0.jar com.wikibook.bigdata.smartcar.loggen.CarLogMain 20160101 3 &

## 실시간. 
java -cp bigdata.smartcar.loggen-1.0.jar com.wikibook.bigdata.smartcar.loggen.DriverLogMain 20160101 3 &


tail -f /home/pilot-pjt/working/SmartCar/SmartCarStatusInfo_20160101.txt
tail -f /home/pilot-pjt/working/driver-realtime-log/SmartCarDriverInfo.log
2. 일간 로그파일을 
플럼 SmartCarInfo 에이전트의 SpoolDir 경로로 옮긴다. 
$mv /home/pilot-pjt/working/SmartCar/SmartCarStatusInfo_20160101.txt /home/pilot-pjt/working/car-batch-log/

$cd /home/pilot-pjt/working/car-batch-log/
$ls -ltr
3. 카프카 Topic생성
카프카 프로듀서 실행. (?? 별도인지 한번만실행인지 모르겠네용. )
$kafka-topics --create --zookeeper server02.hadoop.com:2181 --replication-factor 1 --partitions 1 --topic SmartCar-Topic

$kafka-console-producer --broker-list server02.hadoop.com:9092 -topic SmartCar-Topic
4. 플럼 설정 후 재시작 플럼 > 구성 
시스템 그룹 Flume(서비스전체 : Service-Wide) : flume

Agent 이름 Agent Default Group : SmartCar_Agent
구성파일  Agent Default Group
:
SmartCar_Agent.sources  = SmartCarInfo_SpoolSource DriverCarInfo_TailSource
SmartCar_Agent.channels = SmartCarInfo_Channel DriverCarInfo_Channel
SmartCar_Agent.sinks    = SmartCarInfo_LoggerSink DriverCarInfo_KafkaSink

SmartCar_Agent.sources.SmartCarInfo_SpoolSource.type = spooldir
SmartCar_Agent.sources.SmartCarInfo_SpoolSource.spoolDir = /home/pilot-pjt/working/car-batch-log
SmartCar_Agent.sources.SmartCarInfo_SpoolSource.deletePolicy = immediate
SmartCar_Agent.sources.SmartCarInfo_SpoolSource.batchSize = 1000

SmartCar_Agent.sources.SmartCarInfo_SpoolSource.interceptors = filterInterceptor

SmartCar_Agent.sources.SmartCarInfo_SpoolSource.interceptors.filterInterceptor.type = regex_filter
SmartCar_Agent.sources.SmartCarInfo_SpoolSource.interceptors.filterInterceptor.regex = ^\\d{14}
SmartCar_Agent.sources.SmartCarInfo_SpoolSource.interceptors.filterInterceptor.excludeEvents = false


SmartCar_Agent.channels.SmartCarInfo_Channel.type = memory
SmartCar_Agent.channels.SmartCarInfo_Channel.capacity  = 100000
SmartCar_Agent.channels.SmartCarInfo_Channel.transactionCapacity  = 10000


SmartCar_Agent.sinks.SmartCarInfo_LoggerSink.type = logger

SmartCar_Agent.sources.SmartCarInfo_SpoolSource.channels = SmartCarInfo_Channel
SmartCar_Agent.sinks.SmartCarInfo_LoggerSink.channel = SmartCarInfo_Channel



SmartCar_Agent.sources.DriverCarInfo_TailSource.type = exec
SmartCar_Agent.sources.DriverCarInfo_TailSource.command = tail -F /home/pilot-pjt/working/driver-realtime-log/SmartCarDriverInfo.log
SmartCar_Agent.sources.DriverCarInfo_TailSource.restart = true
SmartCar_Agent.sources.DriverCarInfo_TailSource.batchSize = 1000

SmartCar_Agent.sources.DriverCarInfo_TailSource.interceptors = filterInterceptor2

SmartCar_Agent.sources.DriverCarInfo_TailSource.interceptors.filterInterceptor2.type = regex_filter
SmartCar_Agent.sources.DriverCarInfo_TailSource.interceptors.filterInterceptor2.regex = ^\\d{14}
SmartCar_Agent.sources.DriverCarInfo_TailSource.interceptors.filterInterceptor2.excludeEvents = false

SmartCar_Agent.sinks.DriverCarInfo_KafkaSink.type = org.apache.flume.sink.kafka.KafkaSink
SmartCar_Agent.sinks.DriverCarInfo_KafkaSink.topic = SmartCar-Topic
SmartCar_Agent.sinks.DriverCarInfo_KafkaSink.brokerList = server02.hadoop.com:9092
SmartCar_Agent.sinks.DriverCarInfo_KafkaSink.requiredAcks = 1
SmartCar_Agent.sinks.DriverCarInfo_KafkaSink.batchSize = 1000


SmartCar_Agent.channels.DriverCarInfo_Channel.type = memory
SmartCar_Agent.channels.DriverCarInfo_Channel.capacity= 100000
SmartCar_Agent.channels.DriverCarInfo_Channel.transactionCapacity = 10000


SmartCar_Agent.sources.DriverCarInfo_TailSource.channels = DriverCarInfo_Channel
SmartCar_Agent.sinks.DriverCarInfo_KafkaSink.channel = DriverCarInfo_Channel
5. 카프카.
Counsumer작동
$kafka-console-consumer --bootstrap-server server02.hadoop.com:9092 --topic SmartCar-Topic --partition 0 --from-beginning

플럼 실시간에이전트 -> 카프카 전송  -> 카프카 브로커 스마트카 토픽 메시지 담겨있음. 
카프카 콘솔 컨슈머가 꺼내서 보내줌.  
  
수집 기능 점검
1. 플럼 표준출력로그 전송됐는지 확인 $tail -f /var/log/flume-ng/flume-cmf-flume-AGENT-server02.hadoop.com.log

agent 로그 확인가능. 수집되고 있는 헤더바디...




2021-05-25 22:16:06,356 ERROR org.apache.flume.lifecycle.LifecycleSupervisor: Unable to start EventDrivenSourceRunner: { source:Spool Directory source SmartCarInfo_SpoolSource: { spoolDir: /home/pilot-pjt/working/car-batch-log } } - Exception follows.
org.apache.flume.FlumeException: Unable to read and modify files in the spooling directory: /home/pilot-pjt/working/car-batch-log
        at org.apache.flume.client.avro.ReliableSpoolingFileEventReader.<init>(ReliableSpoolingFileEventReader.java:195)
        at org.apache.flume.client.avro.ReliableSpoolingFileEventReader.<init>(ReliableSpoolingFileEventReader.java:89)
        at org.apache.flume.client.avro.ReliableSpoolingFileEventReader$Builder.build(ReliableSpoolingFileEventReader.java:882)

>> SpoolDir 작동할때 : 읽고 쓰는 권한이 필요. root를 사용하지 않음. 
cd /home/pilot-pjt/
chmod 777 -R  working/

2. Consumer 콘솔창 수집되고 있는지 확인
테스트종료후 ps -ef |grep smartcar.log

CarLogMain, DriverLogMain 

kill -9 pid
파일럿 환경의 로그 확인 Hadoop에코시스템서버들 로그위치
/var/log/디렉터리(cloudera, Hadoop, Oozie, 등_)

Radis 서버 로그 위치 
/var/log/radis_6379.log

Storm 서버로그 위치 
/home/pilot-pjt/storm/logs/

Zeppelin 서버 로그 위치
/home/pilot-pjt/zeppelin-0.8.2-bin-all/logs
파일럿 환경에서
HDFS문제발생
HDFS 상에 Corrupt, Blockes/Files 같은 문제가 발생하거나 Safe 모드로 전환되어
빠져 못빠져나오는 경우 발생, 만약 파일럿 환경 일부 기능, 설치중 문제발생한다면 
HDFS 파일/불록 깨짐, 또는 Safe모드 전환 여부를 체크해야 한다. 

-HDFS 파일 시스템 검사 : $ hdfs fsck /
-HDFS Safe 모드 발생 후 빠져나오지 못 할 경우. 
  Safe 모드 강제 해제 : $hdfs dfsadmin -safemode leave
-HDFS Corrupt Blocks/Files 등이 발생해 복구가 불가능한 경우. 
  손상된 파일 강제 삭제 : $hdfs fsck / -delete                          >>하이브.. 등등 에코시스템영향. 
  손상된 파일을 /lost+found 디렉터리 이동 : $hdfs fsck / -move