1. Kafka에서 스트림 데이터 적재
2. Kafka의 스트림 데이터를 GPSS를 이용하여 Greenplum으로 데이터 적재시 Raw데이터는 단순 적재하고, 실시간 스트림 데이터는 사용자별로 가공하여 적재
- GPSS에서 1초 간격으로 데이터를 Ingestion할 때, 변환 가공하여 적재
- GPSS에서 polling 시간은 Default는 1초이지만, 0.1초까지 설정 변경 가능
- 데이터 트랜잭션은 Data Ingestion과 변환까지 하나의 트랜잭션으로 묶음.
3. Data Flow
Kafka -> GPSS -> weblog.stag_weblog_data (kafka 스트림 데이터의 staging 테이블에 적재)
-> weblog.sp_weblog_sum_user_dd() 프로시저 호출
-> weblog.weblog_data 데이터 적재: 웹로그 raw 데이터 적재:
-> weblog.weblog_sum_user_dd 데이터 적재: 일자별,유저별 웹로그 가공(weblog.sp_weblog_sum_user_dd 프로시저에서 가공)
README.md
1.gpss_kafka_install.txt : gpss & kafka 설치 및 연동 테스트 스크립트
2.weblog_realtime_analysis_ddl.sql : 웹로그 샘플 데이터 생성을 위한 DDL 스크립트
3.weblog_data_generation_dml.sql : 웹로그 샘플 데이터 생성을 위한 DML 스크립트
gpsspoc : Greenplum 사이드에서 테스트 스크립트(Greenplum mdw 서버)
check.sh : GPSS 수행되는 동안 TPS 측정
truncate_table.sql : 테이블 truncate 스크립트
gpss_daemon.sh : gpss 데몬 Start 스크립트 (경로 확인 필요)
job_list.sh : gpss job list 확인
job_remove.sh : gpss job 삭제
job_start.sh : gpss job 시작
job_stop.sh : gpss job 중지
job_submit.sh : gpss job submit
weblog.stag_weblog_data.yaml : kafka의 토픽을 Greenplum Table 컬럼 맵핑 및 데이터 가공 호출하는 설정 파일
kafka: Kafka 사이드에서 테스트 스크립트(kafka 서버)
kafka_data : kafka에 메시지를 넣기 위한 데이터 폴더
kafka_start.sh : kafka start
kafka_stop.sh : kafka stop
kafka_topic_create.sh : kafka 토픽 생성
kafka_topic_delete.sh : kafka 토픽 삭제
kafka_topic_list.sh. : kafka 토픽 리스트 확인
kafka_topic_load_all.sh : kafka 토픽에 메시지 적재 - 파일을 계속적으로 로딩 함(경로 확인 필요)
kafka_topic_show.sh : kafka 토픽 메시지 확인
unload_data.sh : Greenplum의 weblog.weblog_data 테이블의 데이터를 unloading(kafka에 psql이 설치되지 않았을 경우, Greenplum에서 unload 필요, 경로 확인 필요)
unload_data_split.sh : weblog.weblog_data 테이블 unloading된 파일을 50000건씩 파일을 쪼갬 (경로 확인 필욧)
zk_start.sh : zoo keeper start
zk_stop.sh : zoo keeper stop
1. gpss 설치, kafka 설치 및 kafka - gpss 연동 테스트 수행
- 1.gpss_kafka_install.txt 스크립트 참조
2. 웹로그 샘플 데이터 생성을 위한 DDL 수행 (Greenplum 마스터 노드에서 수행)
$ psql -ef weblog_realtime_analysis_ddl.sql
3. 웹로그 샘플 데이터 생성 (Greenplum 마스터 노드에서 수행)
$ psql -ef weblog_data_generation_dml.sql
4. kafka에 데이터 적재를 위한 데이터 파일 생성
- 테이블에 적재된 데이터 unloading 및 파일 split 수행 (Kafka 서버에서 수행)
$ cd kafka/
$ sh unload_data.sh
$ sh unload_data_split.sh
$ cd kafka_data/
$ ls | head
log_aa
log_ab
...
log_zbxx
weblog_data.csv
5. kafka에서 토픽 생성(Kafka 서버에서 수행)
[gpadmin@sdw2 kafka]$ ./kafka_topic_list.sh
__consumer_offsets
[gpadmin@sdw2 kafka]$ ./kafka_topic_create.sh
[gpadmin@sdw2 kafka]$ ./kafka_topic_list.sh
__consumer_offsets
weblog.stag_weblog_data
[gpadmin@sdw2 kafka]$
6. Greenplum에서 기존 데이터 정리 (Greenplum 마스터에서 수행)
$ cd gpsspoc
$ psql -ef truncate_table.sql
7. gpss 수행 (Greenplum 마스터에서 수행)
[gpadmin@mdw gpsspoc]$ ./job_list.sh
JobName JobID GPHost GPPort DataBase Schema Table Topic Status
[gpadmin@mdw gpsspoc]$ ./job_submit.sh
20220913 01:21:05 [INFO] JobID: 5ea72e6f86009c94a17c297ae1efa70a,JobName: weblog.stag_weblog_data
[gpadmin@mdw gpsspoc]$ ./job_start.sh
20220913 01:21:14 [INFO] Job weblog.stag_weblog_data is started
[gpadmin@mdw gpsspoc]$
[gpadmin@mdw gpsspoc]$ ./job_list.sh
JobName JobID GPHost GPPort DataBase Schema Table Topic Status
weblog.stag_weblog_data 5ea72e6f86009c94a17c297ae1efa70a mdw 6432 dev weblog stag_weblog_data weblog.stag_weblog_dataJOB_RUNNING
[gpadmin@mdw gpsspoc]$
8. kafka에서 토픽에 데이터 적재 (Kafka 서버에서 수행)
[gpadmin@sdw2 kafka]$ ./kafka_topic_list.sh
################### Beginning: load to kafka
################### File Count: 1
################### loading file name: log_aa
9. 데이터 적재 현황 확인 (Greenplum 마스터에서 수행)
[gpadmin@mdw gpsspoc]$ ./check.sh
[gpadmin@mdw gpsspoc]$ while true; do date; ./check.sh ; sleep 5;done
2022. 09. 13. (화) 01:28:29 EDT
1
2
3
2022-09-13 01:28:30
===================================
Number of table rows
-----------------------------------
STAGING : 0
PROCESSING : 3,400,000
FINAL RESULT : 94,263
===================================
Performance Summary
-----------------------------------
TPS : 21,706
TOTAL ROWS : 3,400,000
ELAPSED TIME : 00:02:36.635117
BEGINNING : 2022-09-13 01:25:51
LASTEST : 2022-09-13 01:28:27
===================================
10. Greenplum에서 데이터 적재 현황 확인 (Greenplum에 접속 후 확인)
set optimizer=off;
set random_page_cost=0;
set enable_nestloop=on;
select * from weblog.stag_weblog_data
limit 10;
select * from weblog.weblog_data
limit 10;
select * from weblog.weblog_sum_user_dd
where userid = '010681231' -- 생성된 데이터에서 확인 후 필터링
limit 10;
-- 가공된 데이터로 부터 사용자 이력 추출
select log_dt
,userid
,log_tm
,dd.eid
,dt
,d1||':'||coalesce (d2, '')||':'||coalesce (d3, '') page
from (
select log_dt, userid
,unnest(log_tm_arr) log_tm
,unnest(eid_arr) eid
,unnest(dt_arr) dt
from weblog.weblog_sum_user_dd
where userid = '010681231' -- 생성된 데이터에서 확인 후 필터링
) dd,
weblog.weblog_menu mn
where dd.eid = mn.eid
order by 1,2,3
;
--Raw 테이블로 부터 집계성 데이터 추출
SELECT to_char(log_tm, 'yyyymmdd') dt
, b.d1, b.d2, b.d3
, COUNT(DISTINCT userid) lv
, COUNT(*) pv
, SUM(dt) dt
FROM weblog.weblog_data a
, weblog.weblog_menu b
WHERE a.eid = b.eid
GROUP BY to_char(log_tm, 'yyyymmdd')
, b.d1, b.d2, b.d3
order by 1, 2, 3, 4, 5
;
[gpadmin@mdw gpsspoc]$ cat weblog.stag_weblog_data.yaml
DATABASE: dev ### 데이터베이스명
USER: gpadmin ### 사용 유저
HOST: mdw ### Greenplum 호스트명
PORT: 6432 ### Greenplum 마스터 Port, 보통 5432이며, 포트 확인 필요
KAFKA:
INPUT:
SOURCE:
BROKERS: sdw2:9092 ### Kafka 브로커 호스트명:포트
TOPIC: weblog.stag_weblog_data ### kafka 토픽이름
COLUMNS:
- NAME: uqid ### 토픽 컬럼명, Greenplum에서 사용하기 위함
TYPE: text ### 토픽 컬럼 Data Type, Greenplum에서 사용하기 위함
- NAME: userid
TYPE: text
- NAME: eid
TYPE: int
- NAME: log_tm
TYPE: timestamp
- NAME: peid
TYPE: int
- NAME: dt
TYPE: int
- NAME: ip
TYPE: text
FORMAT: csv ### 토픽 포맷, csv, json 등 다양한 포맷 사용 가능
ERROR_LIMIT: 125 ### 에러 limit 개수 설정, 0건 에러일 경우에는 해당 옵션 삭제하면 됨.
OUTPUT:
SCHEMA: weblog ### Greenplum에 적재할 스키마명
TABLE: stag_weblog_data ### Greenplum에 적재할 테이블 명
MAPPING: ### kafka 토픽과 Greenplum에서 적재할 때 맵핑
- NAME: uqid ### Greenplum 테이블에 적재되는 컬럼명
EXPRESSION: uqid ### kafka 토픽에서 사용되는 이름, substr()과 같은 함수 적용 가능
- NAME: userid
EXPRESSION: userid
- NAME: eid
EXPRESSION: eid
- NAME: log_tm
EXPRESSION: log_tm
- NAME: peid
EXPRESSION: peid
- NAME: dt
EXPRESSION: dt
- NAME: ip
EXPRESSION: ip
COMMIT:
MINIMAL_INTERVAL: 1000 ### kafka 메시지를 Greenplum에 적재시 간격 (ms)
TASK:
POST_BATCH_SQL: select weblog.sp_weblog_sum_user_dd(); ### kafka 메시지 적재 후 호출되는 프로시저, 함수까지 하나의 트랜잭션, 여기에서 데이터 가공 함.
BATCH_INTERVAL: 1
[gpadmin@mdw gpsspoc]$