개요
BigQuery 사용 후기입니다.
서론
누군가의 퇴사로 인해 BigQuery에 있는 데이터 활용을 제가 하게 되었습니다.
쿼리 개선, 대시보드 구성… 한마디로 일이 늘어났습니다.
BigQuery는 무엇인가?
BigQuery는 큰 데이터에 대한 SQL 쿼리를 빠르게 수행해주는 GCP 서비스 중 하나입니다.
몇 가지 간단한 설정으로 애플리케이션에서 발생한 로그, 예를 들면 Firebase 데이터를 쉽게 BigQuery로 이관하고 활용할 수 있습니다.
개선한 쿼리
UNNEST 기능에 대한 부분적인 쿼리 개선을 했습니다.
// unnest 의 무분별한 호출을 우선 변경하였다 성능도 테스트 당시 만족스러웠다
// 기존 쿼리
SELECT
event_date
, p1.value.string_value as p1
, p2.value.string_value as p2
, p3.value.string_value as p3
, p4.value.string_value as p4
from `{프로젝트}.events_*`
, unnest(event_params) as p1
, unnest(event_params) as p2
, unnest(event_params) as p3
, unnest(event_params) as p4
where
_table_suffix between '20230601' and '20230601'
and p1.key = 'p1'
and p2.key = 'p2'
and p3.key = 'p3'
and p4.key = 'p4'
group by user_pseudo_id,event_timestamp
// 변경 쿼리
select
event_date
, MAX(if(param.key = "p1", param.value.string_value, NULL)) as p1
, MAX(if(param.key = "p2", param.value.string_value, NULL)) as p2
, MAX(if(param.key = "p3", param.value.string_value, NULL)) as p3
, MAX(if(param.key = "p4", param.value.string_value, NULL)) as p4
from (
SELECT event_date, user_pseudo_id, event_timestamp, param
from `{프로젝트}.events_*`
, UNNEST(event_params) AS param
where
_table_suffix between '20230601' and '20230601'
)
group by user_pseudo_id, event_timestamp
DAU, WAU, MAU를 간략하게나마 볼 수 있도록 제공했습니다.
이쪽은 전문 분야가 아니다 보니, 다음과 같은 결과가 나오도록 작업했습니다.
- DAU/WAU/MAU: 일별 접속한 사용자 전체
- 복귀: 14일 동안 접속이 없는 회원
- 신규
- 기존
복귀와 신규를 구분하려면 회원 단위 데이터도 필요했습니다. 스케줄링으로 처리할 경우 다음과 같이 데이터가 생성됩니다.
이때 스케줄링 처리는 Vertex AI를 사용했고, Python 기반으로 쿼리를 작성했습니다.
- 유저 테이블: 회원, 최초 접속 확인 날짜
- 회원 일 단위 접속 정보: 복귀 여부 판단을 위해 일 단위 접속 회원 기록
- DAU: 일 단위 접속 회원 통계
- WAU: 1주일 동안 접속한 회원 통계
- MAU: 한 달 동안 접속한 회원 통계
최근 3일 데이터를 지속적으로 업데이트하고 있습니다.
“왜 3일 데이터를 조회 및 갱신하는가?”, “유저 테이블에 마지막 접속일을 넣으면 복귀 구분이 가능하지 않나?”라는 의문이 들 수 있습니다. 그 이유는 아쉬운 점에 남깁니다.
결과
최소한의 DAU, WAU, MAU 대시보드 데이터 구성이 되었습니다.
Spring Boot에서 기간을 넣으면 조회 가능하게도 구현했습니다.
아쉬운 점
너무 많습니다.
Spring Boot에서 BigQuery 호출 시 연결 속도나 쿼리 결과가 너무 느렸습니다.
그래서 배치를 돌려 DAU/WAU/MAU처럼 확정된 내용만 MySQL로 가져오는 식으로 할까 생각했지만, 내일의 나에게 미룬 상태입니다.
그리고 3일치 데이터를 처리하는 이유는 Firebase에서 BigQuery로 데이터 이관이 최대 3일까지 지속적으로 발생하기 때문입니다. 3일 전 내용이 오늘에서야 들어올 수 있는 구조라 3일 데이터를 조회 및 갱신하고 있었습니다.
4일 이전 데이터가 Firebase에 발생하더라도 BigQuery에는 반영되지 않습니다. 공식 문서에 써 있더군요.
그러다 보니 DAU/WAU/MAU 작업 시 위와 같은 구조로 처리하게 되었습니다.