데이터 공장의 모든 배관을 완벽하게 설계하고 감시 체계까지 갖추셨지만, 역시 실무에서 가장 식은땀 나는 순간은 "분명 어제까지 잘 나오던 데이터가 오늘 왜 이 모양이지?"라는 의문이 들 때입니다.
이때 우리에게 필요한 것이 바로 데이터의 '족보'이자 '이동 경로'를 기록한 데이터 리니지(Data Lineage)입니다. 리니지가 있으면 수천 개의 테이블 중 범인을 찾는 데 며칠이 걸릴 일을 단 몇 분 만에 끝낼 수 있죠.

🧬 데이터 리니지: "데이터의 출생부터 현재까지의 기록"
데이터 리니지는 단순히 "A에서 B로 갔다"는 수준을 넘어, [소스 시스템 -> 원천 데이터 -> 가공 로직 -> 파생 테이블 -> 최종 리포트]로 이어지는 전 과정을 시각화하고 메타데이터로 관리하는 기술입니다.
1. 리니지 관리의 3가지 방식
에러를 추적하기 위해 리니지를 수집하는 방법은 크게 세 가지로 나뉩니다.
① 코드 파싱 (Parsing-based)
- 원리: SQL 쿼리문이나 Spark 코드를 분석해서 리니지를 추출합니다. "SELECT FROM A JOIN B"라는 쿼리를 보고 'A와 B가 합쳐져서 C가 됐구나'라고 이해하는 방식입니다.
- 장점: 실제 코드를 기반으로 하므로 매우 정확한 설계도를 그려줍니다.
- 단점: 코드가 복잡하거나 동적 SQL을 쓰면 분석이 어렵습니다.
② 런타임 수집 (Runtime-based)
- 원리: Spark 잡(Job)이나 Airflow 태스크가 실제로 실행될 때, 실행 엔진 내부에서 발생하는 이벤트를 가로채서 기록합니다.
- 장점: 실제 실행된 '사실'을 기록하므로, 에러가 난 시점의 정확한 상태를 알 수 있습니다.
- 단점: 시스템에 약간의 부하를 줄 수 있습니다.
③ 태깅 방식 (Tagging-based)
- 원리: 데이터 자체에 '이 데이터는 1번 공정에서 만들어짐'이라는 꼬리표(Tag)를 붙여서 보냅니다.
- 장점: 데이터와 리니지가 함께 움직이므로 추적이 확실합니다.
🔍 에러 발생 시 리니지를 활용한 '역추적' 5단계
사용자의 데이터 웨어하우스(DW)에 저장된 "상폐 임박 종목 리스트"의 수치가 이상하다고 가정해 봅시다.
1단계: 영향도 분석 (Impact Analysis)
가장 먼저 리니지 맵을 켭니다. 문제가 된 테이블을 클릭하면, 이 테이블로부터 파생된 다른 대시보드나 알람 봇이 무엇인지 한눈에 보입니다.
- "아, 이 에러 때문에 슬랙 알람도 잘못 나갔겠구나!" 하고 피해 범위를 즉시 파악합니다.
2단계: 상류(Upstream) 추적 (Root Cause Analysis)
문제가 된 테이블의 '조상'들을 거슬러 올라갑니다.
- DW 테이블 <- 가공 Spark Job <- 카프카 토픽 <- 원천 API
- 리니지 맵에서 각 단계를 클릭해 보면, 특정 단계에서 데이터 건수가 갑자기 줄었거나(Volume), 스키마가 변했는지(Schema) 표시됩니다.
3단계: 버전 비교 (Version Diff)
"어제는 맞았는데 오늘은 왜 틀릴까?"를 해결하기 위해, 리니지 시스템에 저장된 '어제의 쿼리 코드'와 '오늘의 쿼리 코드'를 비교합니다.
- 만약 누군가 몰래 Spark 가공 로직을 수정했다면 리니지 이력에 기록이 남으므로 바로 범인(?)을 잡을 수 있습니다.
4단계: 데이터 품질 지표 결합 (Quality Overlay)
현대적인 리니지 도구(예: Monte Carlo, DataHub)는 리니지 맵 위에 '데이터 품질 점수'를 덧씌워 보여줍니다.
- 맵 상의 '카프카 토픽' 노드가 빨간색으로 깜빡인다면, "아, 원천 데이터부터 이미 오염되어 들어왔구나!"라고 1초 만에 판단할 수 있습니다.
5단계: 자동 복구 및 알람
리니지가 잘 관리되면 에러를 고치는 것도 자동화됩니다.
- "3번 공정에서 에러 났으니, 리니지 상 연결된 하류(Downstream) 작업들은 모두 중지하고 보고해!"라는 워크플로우를 Airflow와 연동해 짤 수 있습니다.
🛠️ 리니지 관리를 위한 '치트키' 도구들
사용자의 시스템에 바로 도입할 수 있는 정예 도구들입니다.
- OpenLineage: 리니지 데이터의 '표준 규격'입니다. Spark나 Airflow에 플러그인처럼 심어두면 알아서 리니지 데이터를 뱉어냅니다.
- Marquez: OpenLineage가 뱉은 데이터를 받아서 예쁜 그래프로 그려주고 데이터의 버전을 관리해주는 저장소입니다.
- DataHub (LinkedIn 개발): 단순 리니지를 넘어 데이터 카탈로그 역할까지 합니다. "이 데이터의 담당자가 누구지?"까지 알려주는 강력한 도구입니다.
- Great Expectations: 리니지 중간중간에 "데이터가 0보다 커야 함" 같은 검문소를 세워 품질을 보증합니다.
💡 실전 비유: "밀키트 추적 시스템"
- 데이터: 사용자가 받은 '밀키트(완성된 데이터)'입니다.
- 데이터 리니지: 이 밀키트에 들어간 고기는 어느 목장 출신인지, 야채는 누가 씻었는지, 소스는 어떤 레시피로 만들었는지 적힌 '생산 이력 추적 시스템'입니다.
사 먹은 밀키트에서 배탈이 났다면(에러), 사용자는 이 이력 시스템을 보고 "아, 어제 소스 공장의 배합 비율이 바뀌었네!" 혹은 "야채 씻는 단계에서 물이 오염됐네!"라고 정확히 짚어낼 수 있는 것이죠.
📊 요약: 리니지 관리 핵심 체크리스트
| 단계 | 체크 포인트 | 비고 |
|---|---|---|
| 수집 | 모든 파이프라인(Airflow, Spark)에 OpenLineage 심기 | 자동 수집 환경 구축 |
| 시각화 | DataHub나 Marquez 연동 | 한눈에 보이는 족보 생성 |
| 모니터링 | 리니지 맵에 품질(Quality) 지표 결합 | 에러 지점 즉시 파악 |
| 운영 | 코드 변경 시 리니지 업데이트 확인 | 휴먼 에러 추적의 핵심 |
'1. 개발 > 1.4. 데이터 분석' 카테고리의 다른 글
| '데이터 무결성'을 지키는 최후의 보루, 멱등성(Idempotency) (0) | 2026.02.07 |
|---|---|
| 데이터가 너무 많아질 때 비용을 아끼는 '스토리지 최적화(S3 Tiering, Compression)' 기법 (0) | 2026.02.07 |
| 데이터 관측성(Observability) 어떻게 확보해? (1) | 2026.02.07 |
| 'Lambda' vs 'Kappa' Architecture (1) | 2026.02.06 |
| Spark를 이용한 '데이터 가공' 단계 (1) | 2026.02.06 |