슬기로운 개발생활
데이터 적재 시스템 구축
Ssemi-Column
2024. 2. 5. 19:41
728x90
신규 데이터 분석을 위해, 선발된 데이터들을 BigQuery와 Mixpanel에 등록해야 한다.
■ As-is
- BigQuery에 주기적으로 데이터를 insert, update해야한다.
- EC2 to BigQuery는 전송 가능하지만, EC2 to Mixpanel은 보안상 전송할 수 없다
■ Challenge
- 주기적으로 데이터를 전송하도록 Jenkins Scheduler사용.
- BigQuery to Mixpanel로 데이터를 전송하도록 결정.
- GCP의 vm instance에 cron으로 GCP Scheduler 사용.
- bq 명령어를 사용하여 Buckit에 전송 데이터 적재.
- Cloud Function의 Trigger를 사용하여 Buckit Update시 Mixpanel로 데이터 전송.
■ To-be
- 신규 데이터 분석 구축.
- 해당 기능을 사용하여 다른 데이터도 적재 파이프라인도 쉽게 구축할 수 있다.
Mixpanel에 관련
■ As-is
- Java용 Mixpanel 라이브러리가 없다.
- 사용자의 Identity ID를 발급, 확인 할 수 없다.
- Identity ID 대신 Distinct ID로 등록할 수 있지만, 이 경우 사전 작업이 필요하다.
- Java에서 데이터를 바로 업로드할 수 없다.
■ Challenge
- 프론트앤드 팀에서 Distinct ID를 백엔드팀에서 전달받아 등록하기로 결정.
- Distinct ID는 자체 설정 가능하여 사용자 ID를 Hash화 하여 저장.
- Key-value 값으로 저장하기에 RDB대신 Redis를 사용하여 저장.
- 클라이언트에서 요청시 있으면 결과를 리턴하고, 없으면 생성 후 리턴.
- 업로드 이슈는 GCP에서 보내는 방법으로 수정.
BigQuery 관련
■ As-is
- 대용량의 데이터를 insert, update 하는데 시간이 오래 걸린다.
- Jenkins Scheduler의 ReadTimeout을 무한정 기다릴수 없다.
- BigQuery의 Update Query처리 속도가 느려 실패하는 데이터가 발생한다.
- Insert는 500개씩 Bulk처리가 가능하지만, Update는 1개의 row씩 수정할 수 밖에없다.
- BigQuery에서 Buckit으로 데이터 전송 시 하나의 테이블 데이터만 전송 할 수 있어, 데이터 조합을 할 수 없다.
- BigQuery의 데이터를 Mixpanel API가 원하는 형태로 변경해야 한다.
■ Challenge
- RabbitMQ를 사용하여 Jenkins Scheduler와 비동기 처리.
- 이중화된 서버에서 RabbitMQ의 Consumer를 1개에서 5개로 늘려 총 10개의 Consumer로 분산처리.
- Conumser의 Prefetch Count 설정을 1로 변경하여 처리가 오래걸리는 Update Query를 여러개 들고있지 않도록 수정.
- Update도 Bulk로 처리하기 위해, 데이터 분석팀과 협의 후 Type을 나누고 최대한 Bulk처리.
- GCP vm instance에서 bq 명령어를 통해 임시 BigQuery 테이블을 만들고, 여러 BigQuery 테이블을 조합하여 데이터를 신규 BigQuery 테이블에 저장후, Buckit으로 데이터를 전송
■ To-be
- Update Query로 인해 7시간이상 또는 전송 실패하던 로직을 1시간 이내로 성공하도록 변경.
■ Will
- 회사에서 Amazon Web Service를 사용하니까.. 위와 같은 분석툴도 Amazon Web Service것을 사용하면 더 좋을 것 같다.
728x90
반응형
LIST