본문 바로가기

data engineering/spark

더미데이터 생성기

*지난 7월 1일 ~ 8월 15일까지 6주간 진행했던 데이터 엔지니어링 프로젝트에 대한 회고 포스팅이다

 

실제 데이터 웨어하우스를 구축해 서비스에 대한 데이터를 쌓아가는 회사에서는 사용자 데이터를 통해 서비스를 개선하고 상품을 추천하는 등의 일을 할 것이다. 그만큼 대용량의 데이터를 다루는게 요즘엔 흔한 데이터 엔지니어의 일상이기에 대용량의 데이터를 만져보고 싶다는 갈망이 있었다. 직접 몇천만명의 사용자를 받을 순 없었기에, 그만큼 큰 데이터를 활용하기는 어려웠다. 그렇다면 아예 포기해야 하는걸까? 이왕 프로젝트 하는 김에 더 해보자!하는 고민 끝에 더미데이터를 생성하기로 결정했다

 

 

1. 더미데이터 모델링

생성할 더미데이터에 대한 모델링을 먼저 진행했다

 

우리는 '사용자가 우리 서비스를 이용한다면 어떤 발자국을 남기게 될까?'라는 질문을 던졌고, 그에 해당하는 테이블들을 생성했다. 먼저 사용자가 홈페이지에 들어왔을때 세션이 생성될거고, 항공권을 검색, 클릭, 구매한 기록이 남을 것이다. 또한 가입한 사용자에 대해서는 사용자 정보가 생성될 것이다

 

 

2. 생성 시간에 대한 고민

처음에는 더미데이터를 로컬에서 생성하고자 했다. 파이썬의 faker 라이브러리를 이용해 단일 프로세스로 1000만건의 사용자 정보를 생성하는 것부터 시작했는데, 1시간 14분이 소요됐다. 1억건의 데이터를 생성하려면 노트북을 12시간 이상 켜놔야하고, 중간에 오류가 발생한다면 다시 생성해야한다는 문제가 있었다

단일 프로세스로 생성 & 동기

 

이를 해결하기 위해 어떤 방법을 써야할까 고민과 실험을 진행했다

1) 멀티 스레딩 혹은 멀티 프로세싱으로 작업

단일 프로세스내에서 멀티 스레딩 혹은 멀티 프로세싱을 구현하면 어떨까? 파이썬은 멀티 스레딩을 지원하지 않았고, 멀티 프로세싱으로 로컬 컴퓨터에서 구현해도 듀얼 코어였기 때문에 성능상의 이점이 거의 없을거라 판단했다. 사실 속는셈 치고 멀티 프로세싱으로 구현해봤는데 성능상의 이점이 미미했다

 

2) 비동기로 작업

프로세스는 CPU bound 혹은 I/O bound가 많은 작업으로 갈린다. 데이터를 생성하는건 CPU bound 작업이기에 I/O 시간을 최소화해봤자 성능상의 이점이 없었다. 실제로 구현한 결과도 예상과 같았다

단일 프로세스로 생성 & 비동기

 

3) glue의 serverless spark 사용

우리가 처한 상황을 어떻게 해결할 수 있을까에 대한 고민이 많았다. 이대로 더미데이터 생성을 포기할 것인가?(프로젝트 기간이 촉박했기에 이것만 붙들고 있을수 없었다) 혹은 우리가 사용할 수 있는 툴을 최대한 활용해볼 것인가?

 

스파크는 데이터 분산 처리를 위한 도구지, 보통 데이터 생성을 위해 쓰이지는 않는다. 하지만 데브코스 측에서 Glue 서비스를 사용할 수 있게 열어주었기에 서버리스 스파크를 사용해 분산 시스템의 이점으로 더미데이터를 빠르게 생성할 수 있을거라 판단하고 진행했다

 

 

5개의 DPU를 설정했을때 5 - 1(관리 시스템 용도) = 4개의 워커 노드가 있고, G.1X는 1DPU당 4개의 코어로 이루어져 있기 때문에 16개의 코어를 사용할 수 있다. 우리는 7개의 프로세스로 병렬 생성을 시도했고 그 결과 1000만건의 사용자 정보를 생성하는데 11분이 소요되었다. 이를 통해 4억건에 달하는 클릭 로그도 25분 내로 생성할 수 있었다

 

지금 생각해보면 급해서 후다랍하느라 스파크에 대한 깊은 이해를 가지고 실행하진 못했는데, 16개의 코어가 있으니 16개의 태스크로 병렬처리 했다면 더 좋았겠다는 생각이 든다

 

 

3. 정리

프로젝트를 하면서 어떻게 풀어낼 수 있을지에 대한 고민이 많았던 부분이다. 틀에 갇혀 대용량의 데이터는 절대 맛볼 수 없을거라고 단언했다면 시도해보지 않고 넘어갔을 것이다. 하지만 우리가 처한 상황에서 쓸 수 있는 도구를 최대한 활용하려 노력했고, 그 결과 평소에는 맛보지 못했던 억단위의 데이터를 사용해 볼 수 있었다. 이것도 회사에 비하면 아주 타이니한 데이터겠지만 죠금은 뿌듯했다