빅데이터

[빅데이터] Oozie 사용 해 보기.

allempty_sheep 2024. 6. 14. 17:20
반응형
🎁 본 글은 실무로 '배우는 빅데이터기술' 책을 따라해보고 실행하여보는 과정을 기록한 글이다.

🎁 빅데이터 처리의 전체적인 흐름과 과정을 학습하기 쉬우며 빅데이터에 관심있는 사람들에게 추천한다.

 

Oozie 를 이용하여 스케줄링을 해볼 것이다. (server02)

cd /home/pilot-pjt/working

 

프로세스를 하나 실행한다. 스마트가의 상태 로그를 만들어준다.

java -cp bigdata.smartcar.loggen-1.0.jar com.wikibook.bigdata.smartcar.loggen.CarLogMain 20240614 100 &

 

데이터가 쌓이는 위치에 가서 확인 해 보자.

cd /home/pilot-pjt/working/SmartCar
tail -f SmartCarStatusInfo_20240614.txt

 

데이터가 계속 쌓이면 시스템이 느려질 수 있으니 10분 후에 프로세스를 종료해줄 것이다.

ps -ef | grep smartcar.log
kill -9 XX XX XX

 

파일을 복사 해주자.

mv /home/pilot-pjt/working/SmartCar/SmartCarStatusInfo_20240614.txt /home/pilot-pjt/working/car-batch-log/

 

목록을 조회 해 보자.

hdfs dfs -ls -R /pilot-pjt/collect/car-batch-log/

 

스마트카 운전자의 운행 로그를 만들어보자.

cd /home/pilot-pjt/working
java -cp bigdata.smartcar.loggen-1.0.jar com.wikibook.bigdata.smartcar.loggen.DriverLogMain 20240614 100 &

 

데이터는 이곳에 저장된다.

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

 

10분 후 아까와 같이 해당 프로세스를 죽여주자

 

Hue Hbase 에서 확인 해 볼 것이다. (에러가 나면 HBase를 재시작 해주자)

 

 

오늘 14일자 데이터가 없다. 뭔가가 이상하다. 처음부터 데이터를 생성해주자.

어제 jar 파일을 수정해서 다시 만들었는데 책에서 주는 jar file을 사용해서 다시 해 보도록 하겠다.

bigdata.smartcar.storm-1.0.jar 을 아래에 업로드 하였다.

cd /home/pilot-pjt/working/

 

스톰 서비스를 재시작 해보자

service storm-nimbus restart
service storm-supervisor restart
service storm-ui restart

service storm-nimbus status
service storm-supervisor status
service storm-ui status

 

사용하던 스톰을 죽이고, 새로운 파일로 실행 시킨다.

storm kill DriverCarInfo
cd /home/pilot-pjt/working
storm jar bigdata.smartcar.storm-1.0.jar com.wikibook.bigdata.smartcar.storm.SmartCarDriverTopology DriverCarInfo

 

원래있던 프로세스를 죽이자 (있으면)

ps -ef | grep smartcar.log
kill -9 XX XX

 

자료를 생성해 보자.

cd /home/pilot-pjt/working
java -cp bigdata.smartcar.loggen-1.0.jar com.wikibook.bigdata.smartcar.loggen.CarLogMain 20240615 100 &

 

데이터가 생성 되었는지 확인 해 보자.

cd /home/pilot-pjt/working/SmartCar
tail -f SmartCarStatusInfo_20240615.txt

 

데이터를 옮기자.

 mv /home/pilot-pjt/working/SmartCar/SmartCarStatusInfo_20240615.txt /home/pilot-pjt/working/car-batch-log/

 

플럼이 수집을 잘 하는지 확인 해주자.

cd /var/log/flume-ng
tail -f /var/log/flume-ng/flume-cmf-flume-AGENT-server02.hadoop.com.log

 

hdfs dfs -ls -R /pilot-pjt/collect/car-batch-log/wrk_date=20240615

 

진행할때 

org.apache.flume.source.SpoolDirectorySource: The channel is full

이라는 문구가 많이 나왔다.

server02 를 재시작 해주고 storm 서비스들을 재 시작해준다. 그리고 혹시몰라 flume 서비스도 재 시작 해주었다.

그러고 플럼이 잘 돌아가는지 확인 하였다.

 

아직 무슨 내용인지는 잘 모른다.

org.apache.flume.sink.hdfs.HDFSEventSink: Writer callback called.

이라는 문구가 나오면 flume 이 데이터를 제대로 수집하고 있다고 하는데 나는 아무리 찾아봐도 없지만 

15일으로 지정한 데이터가 Hue - HBase 에서 나타났다.

 

 

과속차량 조회

redis-cli
smembers 20240615

 

오류가 있어서 많이 늦어버렸다. 이제 정말 Oozie 를 사용 해 보자.

사용하지 않을 Spark, Flume, Kafka 를 Cloudera에서 정지.

 

Storm 관련 서비스들을 정지 

service storm-nimbus stop
service storm-supervisor stop
service storm-ui stop

 

redis 관련 서비스 종료

service redis_6379 stop

(고사양 컴퓨터라면 안 꺼도 괜찮을지도..)

 

Hue - 메뉴 문서에 들어가서 hive_script 폴더를 만들어준다.

그 밑에 다시 5개의 폴더를 만들어준다.

workflow
 -hive_script
  --subject1
  --subject2
  --subject3
  --subject4
  --subject5

 

그 다음 쿼리로 이동하여 다음을 입력하여 준다.

create table if not exists Managed_SmartCar_Status_Info (
car_number string,
sex string,
age string,
marriage string,
region string,
job string,
car_capacity string,
car_year string,
car_model string,
tire_fl string,
tire_fr string,
tire_bl string,
tire_br string,
light_fl string,
light_fr string,
light_bl string,
light_br string,
engine string,
break string,
battery string,
reg_date string
)
partitioned by( biz_date string )
row format delimited
fields terminated by ','
stored as textfile;

 

 

성공 후 아래 쿼리도 입력 해 본다. 변수에 20240614 값을 입력 해 준다.

alter table SmartCar_Status_Info
      add if not exists partition(wrk_date='${working_day}');

 

set 은 자료가 많으면 자동으로 파티션을 나누어 준다.

두번째 set 은 partition key가 자동으로 생성 된다.

실행 시킬때 주의 점이 있는데 Ctrl + a 로 모든 라인을 드래그하여 지정해 준 후 실행 해 주어야 한다.

set hive.exec.dynamic.partition=true;  
set hive.exec.dynamic.partition.mode=nonstrict; 

insert overwrite table Managed_SmartCar_Status_Info partition(biz_date)  
select 
 t1.car_number,
 t1.sex,
 t1.age,
 t1.marriage,
 t1.region,
 t1.job,
 t1.car_capacity,
 t1.car_year,
 t1.car_model,
 t2.tire_fl,
 t2.tire_fr,
 t2.tire_bl,
 t2.tire_br,
 t2.light_fl,
 t2.light_fr,
 t2.light_bl,
 t2.light_br,
 t2.engine,
 t2.break,
 t2.battery,
 t2.reg_date,
 substring(t2.reg_date, 0, 8) as biz_date 
from  SmartCar_Master_Over18 t1 join SmartCar_Status_Info t2 
on t1.car_number = t2.car_number and t2.wrk_date = '${working_day}';

 

데이터를 확인 해 보자.

select *
  from  Managed_SmartCar_Status_Info
limit 10;

 

아까 만든 폴더에 파일로 만들어서 저장을 해줘야 하는데 실행 만 해 보았다. (Oozie 로 실행 예약을 해두기 위해)

suject1 에 아래의 문장을 해당 이름으로 저장 해 준다.

 

파일이름 : create_table_managed_smartcar_status_info.hql

create table if not exists Managed_SmartCar_Status_Info (
car_number string,
sex string,
age string,
marriage string,
region string,
job string,
car_capacity string,
car_year string,
car_model string,
tire_fl string,
tire_fr string,
tire_bl string,
tire_br string,
light_fl string,
light_fr string,
light_bl string,
light_br string,
engine string,
break string,
battery string,
reg_date string
)
partitioned by( biz_date string )
row format delimited
fields terminated by ','
stored as textfile;

 

아래 내용들도 저장 해 준다.

 

파일 이름 : alter_partition_smartcar_status_info.hql

alter table SmartCar_Status_Info
      add if not exists partition(wrk_date='${working_day}');

 

파일이름 : insert_table_managed_smartcar_status_info.hql

set hive.exec.dynamic.partition=true;  
set hive.exec.dynamic.partition.mode=nonstrict; 

insert overwrite table Managed_SmartCar_Status_Info partition(biz_date)  
select 
 t1.car_number,
 t1.sex,
 t1.age,
 t1.marriage,
 t1.region,
 t1.job,
 t1.car_capacity,
 t1.car_year,
 t1.car_model,
 t2.tire_fl,
 t2.tire_fr,
 t2.tire_bl,
 t2.tire_br,
 t2.light_fl,
 t2.light_fr,
 t2.light_bl,
 t2.light_br,
 t2.engine,
 t2.break,
 t2.battery,
 t2.reg_date,
 substring(t2.reg_date, 0, 8) as biz_date 
from  SmartCar_Master_Over18 t1 join SmartCar_Status_Info t2 
on t1.car_number = t2.car_number and t2.wrk_date = '${working_day}';

 

Workflow를 만들어 보자

쿼리 - 스케쥴러 - Workflow
Hive 꿀벌 모양을 드래그하여 여기에 작업 두기로 이동
파일을 선택하여 추가한다.
두번째 insert 추가
매개 변수도 추가해 준다.

working_day=${today}

 

세번째 insert 스케쥴러도 추가해주면 아래와 같은 모양이 된다.

매개 변수도 추가 해 준다.

 

Workflow 이름 변경 후 저장을 하자.

 

Hue 메인 로고를 눌러보면 워크플로우가 저장이 잘 된 것을 확인 할 수 있다.

 

예약을 해주자

 

'Subject1 - 예약' 이라는 이름으로 예약을 해줄것이다.

 

Workflow 선택을 눌러서 아까 저장한 Workflow를 저장 해 준다.

 

시간을 지정해준다.

몇일, 월, 년 같은 단위와 시간을 지정하고

언제부터 언제까지 실행할지 선택한다.

 

매개변수를 추가 해 준다.

당일 매개변수

${coord:formatTime(coord:dateTzOffset(coord:normalTime(),"Asia/Seoul"),'yyyyMMdd')}

 

아래와 같이 예약 된 것을 볼 수 있다.

 

즉시 실행을 하려면 Workflow에 매개변수를 다음과 같이 변경 해 준다.

working_day=20240614

 

변경 후 실행 버튼 클릭

모의 테스트를 해볼수도 있다. 

제출을 눌러보자

 

다음과 같이 실행 되는 모습을 볼 수 있다.

 

Job 을 클릭해보면 현재 어떤 내용이 실행 되는지 확인 할 수 있다.

 

다되면 아래와 같이 초록색 100% 가 된 것을 볼 수 있다.

 

Hive 쿼리에서 데이터를 확인 해보자.

select *
  from managed_smartcar_status_info
limit 100;