런칭 후 약 1년 간 타다 서비스의 데이터 웨어하우스의 변화 과정에 대해 소개합니다. 서버 데이터베이스의 Read Replica 로 시작해서, RDBMS 로 데이터를 모으던 과도기를 거쳐, 현재 BigQuery 에 이르기까지. 각 단계별로 가능했던 것들과 아쉬웠던 것들, 그리고 이를 해결하기 위한 고민 들에 대해 얘기합니다.
방식으로 데이터 추출 및 전달 ◦ 이메일, 슬랙, 구글 시트 (직접 Sheets API 써서 개발하려면 은근 번거로움), SFTP ◦ e.g. 구글 시트로 Raw 데이터 추출 -> (구글 시트만 쓸 줄 알면) 원하는 형태로 대시보드 제작 광고 X 2019.10.19 데이터야 놀자
◦ 새로운 테이블 -> Read Replica 가 아닌 Master 에 + Read 가 아닌 Write 권한 필요 ◦ Master 의 schema 변경 -> 서버 배포 파이프라인 중 일부 (Liquibase 로 관리) ◦ 서버 개발 프로세스에 엮이기보다, 독립적으로 진행하고 싶은 마음 ▪ 서버 개발 = 핵심 비즈니스 로직 / 협업 / 신중한 배포 ▪ 분석은 이와는 별개의 작업 런칭 직후 : 아쉬운 점 2019.10.19 데이터야 놀자
Aurora MySQL 2.x (2.04.6 이 최신) ~ MySQL 5.7 Compatible ◦ Analytic Function 은 MySQL 8.0.2 부터 지원 ▪ e.g. 유저의 직전 호출 시각 -> Analytic Function 이 없다면 힘듦 어찌 저찌 할 수는 있음 ◦ Array, Struct 타입도 지원하지 않음 ▪ e.g. 유저의 리뷰 항목들 2019.10.19 데이터야 놀자
(+ Holistics) ◦ 코드 1줄 없이 설정 + SQL 만으로 빠르게 리포트 / 대시보드 생성 가능 ◦ 새로운 테이블 추가 힘듦, SQL 표현력 아쉬움, 여러 데이터 소스 JOIN 불가능 ◦ 아직 데이터 웨어하우스는 아님 • 리포트 / 대시보드 작업 2019.10.19 데이터야 놀자 Icon made by Freepik from www.flaticon.com
-> PostgreSQL 10 로 이동 ◦ MySQL 8.0.11 에서 TEXT 타입으로 partition by 했을 때 틀린 결과가 나온 경험 (TEXT -> CHAR 하면 됨) ◦ PostgreSQL 은 Array, Composite 타입 제공 ◦ date_trunc 함수 등 소소하지만 분석에 도움이 되는 기능들이 많음 2019.10.19 데이터야 놀자
해당 Primary Key 의 record 가 없으면 -> INSERT ◦ 기존 테이블에 해당 Primary Key 의 record 가 존재하면 -> UPDATE • 여러가지 방법이 가능 ◦ Dataset#foreachPartition 으로 뭉치 단위로 INSERT ◦ 적절한 단위로 (Partition) Read -> 임시 테이블로 Write -> UPSERT SQL 실행 -> 임시 테이블 Drop 2019.10.19 데이터야 놀자
고민 ◦ 테이블의 TIMESTAMP 타입 컬럼의 값과 비즈니스 로직을 적절히 활용 ◦ Partition 나누는 기준 = record 의 insert 시각 ◦ 비즈니스 로직을 고려하여 -> Partition 에 더 이상의 변화가 없을 때 까지 UPSERT • e.g. 유저의 호출이 하나의 record 로 쌓이는 ride 테이블 ◦ 호출 시각 (created_at) 기준으로 Partitioning ◦ 상태 (status) 컬럼 값이 DROPPED_OFF (하차) 혹은 CANCELED (취소) 가 될 때 까지 UPSERT • 관련하여 생각을 정리한 개인 블로그 포스트 2019.10.19 데이터야 놀자
선택 ◦ Record transform : X (서버 -> Kinesis Data Stream 으로 넣은 ndjson 그대로) ◦ Record format conversion : X (서버 -> Kinesis Data Stream 으로 넣은 ndjson 그대로) ◦ Destination : Amazon S3 / Amazon Redshift / Amazon Elasticsearch Service / Splunk ◦ Buffer size / Buffer interval : 둘 중 어느 하나 먼저 만족되면 -> S3 에 새로운 JSON 파일 Put ◦ 일단 쌓고 나중에 생각 • 필요하다면 transform, format conversion 가능 ◦ 데이터 전처리 / Format 변환 (e.g. Kinesis Data Stream 에는 JSON -> S3 에는 Parquet 로) 2019.10.19 데이터야 놀자
소스의 데이터를 한 곳으로 모으면서 -> JOIN 가능 ◦ 개선된 SQL 표현력 ◦ 서버와 별도의 데이터베이스 -> 새로운 테이블 추가가 용이 ◦ 리소스 관리가 힘듦 • 리포트 / 대시보드 작업 . . . . . . . 2019.10.19 데이터야 놀자 Icon made by Freepik from www.flaticon.com
◦ 서버 로그는 단일 data class 라서 근본적으로 STRUCT : 비즈니스 로직 추가 -> 컬럼 추가 발생 가능 ◦ (Athena 의 기반이 되는) Presto 0.172 버전은 STRUCT 타입의 schema update 를 허용하지 않음 2019.10.19 데이터야 놀자
제공 ◦ TIMESTAMP 타입 컬럼으로 Partitioning 해도 -> 실제 Partitioning 은 UTC 기준 DATE 단위로 ◦ (국내 서비스니까) Asia/Seoul 기준 DATE 컬럼을 달고 (= date_kr) 그 컬럼으로 Partitioning ◦ SQL 성능 UP + Partition 단위로 데이터 Load 할 수 있어 배치 (Batch) 작업에 편리 2019-10-19 ... 2019-10-01 ... 2019-01-01 where date(created_at, ‘Asia/Seoul’) = ‘2019-10-01’ 2019-10-19 ... 2019-10-01 ... 2019-01-01 where date_kr = ‘2019-10-01’ 2019.10.19 데이터야 놀자
때도 이미 Partition 단위로 처리 ◦ 본래 Spark Application 의 코드 패턴과 거의 유사 : Partition UPSERT 대신 Partition 교체 ◦ 작은 테이블 (처리 시간 10분 미만) -> 매번 전체 테이블 Overwrite ◦ 큰 테이블 -> Date Partitioned 테이블로 만들고 Partition 단위로 교체 2019.10.19 데이터야 놀자
데이터 웨어하우스 -> 인프라 관리 비용 ZERO ◦ 높은 확장성 + 강력한 SQL 표현력 + 편리한 Console -> 더 많은 팀원들의 + 더 많은 데이터 분석 ◦ + Firebase Analytics SDK 으로 찍는 라이더 앱 / 드라이버 앱 로그는 자동으로 BigQuery 에 쌓임 • 리포트 / 대시보드 작업 . . . . . . . 2019.10.19 데이터야 놀자 Icon made by Freepik from www.flaticon.com
풀고자 하는 미션 + 처한 상황에 따라 선택은 달라질 것 ▪ e.g. Cloud Storage / BigQuery 면 스토리지 비용 2배? AWS -> GCP 데이터 옮기는거 별론데? ◦ Google BigQuery -> 현재 저희 상황에 적합할 뿐 ◦ 다른 상황 / 다른 팀 -> 더 좋은 다른 데이터 웨어하우스가 있을 지도 2019.10.19 데이터야 놀자
장단점 파악하는 능력 중요 + 필요 ◦ AWS -> Amazon Redshift, Amazon Athena, Amazon Aurora Serverless 등 ◦ Azure -> SQL Data Warehouse 등 ◦ GCP -> Google BigQuery 등 ◦ On-Premise 혹은 매니지드 서비스 원치 않음 -> Presto, Apache Druid 등 ◦ 그 외의 다양한 선택지들 2019.10.19 데이터야 놀자
-> 시도 -> 해결 -> 성장 -> 문제 -> 시도 -> 해결 -> 성장 -> ... • 팀도 커졌고, • 앞으로 풀 재밌는 문제들도 많으니, 배치 작업 고도화, 스트리밍 아키텍처 고민, 시뮬레이터, MLOps ... • 함께하실 분들은 -> 타다 채용 • tadacareer.vcnc.co.kr • [email protected] 광고 O 2019.10.19 데이터야 놀자