Pinterest 가 ML 모델 학습·서빙에 쓰는 사용자 시퀀스 데이터(최근 N개 행동) 플랫폼을 비용·속도·사용성 면에서 다시 설계한 사례를 다룬다. 학습·분석·온라인 추론 세 곳에서 쓰이며 ML 데이터 스택에서 가장 비싸고 깨지기 쉬운 부분이던 것을, 설정-코드·공유 엔진·Lambda 아키텍처·칼럼형 저장으로 풀었다.
핵심 포인트- 사용자 시퀀스는 학습·분석·추론 세 곳에서 쓰여 신선도와 완전성, 배치-실시간 드리프트, 스키마 일관성이 충돌했다.
- 이벤트 필터·보강 신호 매핑을 Python 설정-코드로 정의해 새 신호를 설정 변경만으로 추가하게 했다.
- 공유 실행 엔진+플러그인 구조로 배치·실시간 코드 중복과 드리프트를 줄였다.
- Lambda 아키텍처로 스트림은 현재, 배치는 과거 수정·백필을 맡게 분리했다.
- 칼럼형·시간 분할 저장으로 필요한 칼럼만 읽어 압축률·대역폭·쿼리 효율을 높였다.
상세 정리- 문제: 사용자의 최근 N개 행동을 보강 신호와 함께 학습·서빙용 형식으로 제공해야 하는데, 학습·오프라인 분석·온라인 추론 세 곳 요구가 달라 시퀀스가 ML 스택에서 가장 비싸고 깨지기 쉬운 부분이었다.
- 충돌 축: 신선도 vs 완전성, 배치 vs 실시간 경로의 데이터 드리프트, 스키마 일관성 유지가 동시에 걸렸다.
- 설정-코드: 이벤트 필터링·보강 신호 매핑·데이터 소스를 Python 설정 스키마로 정의해, 새 신호 추가 시 설정 변경과 최소 코드만 들게 했다.
- 공유 엔진: 프레임워크가 데이터소스 연결·동시성·재시도·역압을, Executor 가 필터링·특성화 비즈니스 로직을 맡아 배치·실시간 코드 중복과 드리프트를 줄였다.
- Lambda 아키텍처: 스트리밍 경로가 근실시간 시퀀스를 유지하고 배치 경로가 역사 데이터 수정·백필을 맡아, 스트림은 현재·배치는 과거 수정으로 병합한다.
- 저장소: 큰 보강 이벤트 블롭 대신 칼럼별 분리+시간 파티션으로 바꿔, 필드 일부만 필요해도 전체를 로드하던 비효율을 없애고 압축률·대역폭·쿼리를 개선했다.
- 서빙 API: 신호·특성명으로 시퀀스를 요청하면 필요한 칼럼만 페치하고 요청 시점 보강과 "최근 N개" 자르기를 적용한다.
- 마이그레이션: 신규 파이프라인을 병렬로 돌려 섀도우 시퀀스를 만들고, 이벤트 레벨 필드 비교와 시퀀스 레벨 전체 비교 2계층 검증에 A/B 실험을 병행한 뒤 단계적으로 전환했다.
- 검증 이유: 온라인 시스템은 100% 일치가 불가능해 "대략적 동등성"을 증명하는 방식을 택했다.
- 결과: 저장·전송 효율화로 인프라 비용이 줄고, 새 보강 신호 온보딩 시간이 단축됐으며, 주요 추천 표면의 참여 지표가 개선됐다.
왜 읽나대규모 추천·ML 학습용 사용자 시퀀스/피처 파이프라인을 설계하는 데이터 엔지니어에게, 설정-코드·Lambda·칼럼형 저장 결정과 섀도우 검증 마이그레이션 레퍼런스.