본문으로 건너뛰기
최종 수정: 에

데이터 계보

핵심 요약 Apache Doris는 모든 INSERT, INSERT OVERWRITE, CREATE TABLE AS SELECT의 분석된 Nereids 플랜에서 컬럼 수준 계보를 추출하며, 여기에는 JOIN, FILTER, GROUP BY, WINDOW, CASE WHEN 의존 관계가 포함됩니다. 이벤트는 SPI를 통해 직접 구현한 이벤트 발신기, OpenLineage 수신기, Apache Atlas, DataHub 등 배포한 계보 백엔드로 전달됩니다. 애드혹 쿼리의 테이블 수준 계보는 audit_log 시스템 테이블에서 확인할 수 있으며, 이 테이블은 쿼리별 원본 테이블과 선택된 구체화된 뷰를 기록합니다.

Apache Doris 데이터 계보: Nereids 플랜에서 컬럼 수준 계보를 추출하여 플러그인 방식의 SPI를 통해 거버넌스 도구로 전달하고, 감사 로그에는 테이블 수준 추적 정보를 기록합니다.

Apache Doris 데이터 계보를 사용하는 이유는 무엇인가요?​

Apache Doris 데이터 계보는 플래너가 이미 계산한 컬럼 수준 의존 관계를 제공합니다. 따라서 거버넌스 도구 내부에 SQL 파서를 직접 만들지 않고도 영향 분석과 감사 관련 질문에 답할 수 있습니다. 기본 테이블의 컬럼 타입을 변경한 뒤 네 시간이 지나 대시보드가 NULL을 반환하기 시작했다고 가정해 보겠습니다. 또는 누군가 tgt_region_revenue.revenue의 값이 실제로 어디에서 오는지 물었는데, 솔직한 답은 "지난 세 해 동안 쌓인 INSERT 문 어딘가"인 상황일 수도 있습니다. 의존 관계는 실제로 존재하고 SQL도 시스템에 있지만, 이를 조회할 수 있는 그래프로 연결해 놓은 사람이 없는 것입니다. 다중 Catalog 연합을 거치거나 증분 구체화된 뷰에 기록하는 쓰기 작업은 이 그래프를 더욱 크게 만듭니다.

거버넌스 도구 내부에 SQL 파서를 직접 만드는 것은 적절한 해결책이 아닙니다. 데이터베이스는 이미 SQL을 파싱했습니다. 필요한 것은 데이터베이스가 찾아낸 의존 관계를 컬럼 단위로 전달하고, 각 출력 컬럼을 생성한 변환 정보도 함께 제공하는 것입니다. 그러면 계보는 DDL을 정적으로 해석한 결과가 아니라 실제로 실행된 내용을 반영합니다.

이를 통해 답할 수 있는 대표적인 질문은 다음과 같습니다.

  • orders.o_discount를 삭제하면 어떤 하위 테이블과 컬럼에 문제가 생기나요?
  • 대시보드에 표시된 이 숫자는 어디에서 왔나요?
  • 이 사용자는 지난주에 어떤 규제 대상 테이블에 접근했나요?

Apache Doris 데이터 계보란 무엇인가요?​

Apache Doris 데이터 계보는 Nereids 플래너에 내장된 컬럼 수준 계보 추출 기능과, 추출한 이벤트를 운영 중인 거버넌스 백엔드로 전달하는 SPI로 구성됩니다. 내장 뷰어는 제공하지 않습니다. Apache Doris는 생산자이고, 기존에 사용하는 도구(Atlas, DataHub, OpenMetadata, 내부 서비스)는 소비자입니다. 쿼리 이력에서 테이블 수준 계보를 도출하려는 경우, audit_log 테이블이 이미 쿼리별 원본 테이블과 매칭된 구체화된 뷰를 기록하므로 플러그인을 작성하지 않고도 개략적인 그래프를 만들 수 있습니다.

주요 용어

  • LineageInfo: 메모리 내 이벤트 형식입니다. 출력 컬럼마다 직접 계보 유형(IDENTITY, TRANSFORMATION, AGGREGATION)과 원본 표현식을 저장하며, 데이터셋 수준의 간접 계보(JOIN, FILTER, GROUP_BY, SORT)와 컬럼별 간접 계보(WINDOW, CONDITIONAL)도 포함합니다.
  • LineagePlugin: LineageInfo 이벤트를 수신하기 위해 구현하는 SPI입니다. 클래스 경로에서 ServiceLoader를 통해 검색되거나, $plugin_dir/lineage/에 배치된 외부 jar로 검색됩니다.
  • activate_lineage_plugin: 이벤트를 수신할 플러그인 이름을 지정하는 FE 설정입니다. 기본값은 비어 있으므로 플러그인을 활성화하기 전에는 플래너가 계보 관련 작업을 수행하지 않습니다.
  • audit_log.queried_tables_and_views: ARRAY<STRING> 타입의 컬럼으로, __internal_schema.audit_log에 있습니다. 각 쿼리에서 접근한 테이블을 Catalog 이름까지 포함해 나열합니다.
  • audit_log.chosen_m_views: 옵티마이저가 재작성에 사용한 구체화된 뷰를 나열하는 관련 컬럼입니다.

Apache Doris 데이터 계보는 어떻게 작동하나요?​

Apache Doris는 최적화 전에 Nereids 플래너에 훅을 연결하고, 분석된 플랜을 순회하여 각 출력 컬럼의 원본을 추적합니다. JOIN/FILTER/GROUP BY/WINDOW/CASE WHEN 의존 관계를 기록한 뒤, 쿼리 스레드와 별도의 스레드에서 등록된 모든 LineagePlugin에 이벤트를 전달합니다.

  1. 플래너에 훅을 연결합니다. 각 쓰기 명령(INSERT INTO, INSERT OVERWRITE, CTAS)은 분석 플랜 훅을 등록합니다. 이 훅은 최적화 전에 분석된 LogicalPlan을 가져옵니다. 따라서 컬럼 참조에 원본 슬롯이 남아 있어 계보가 사용자가 작성한 SQL과 일치합니다.
  2. 직접 계보를 추출합니다. LineageInfoExtractor는 플랜을 순회하며 모든 출력 컬럼의 원본 표현식을 추적합니다. 단순 컬럼 참조는 IDENTITY가 됩니다. 스칼라 표현식은 TRANSFORMATION이 됩니다. 집계 함수는 AGGREGATION이 됩니다. CTE 소비자 슬롯은 생산자 슬롯으로 미리 해석하므로 추적이 WITH 절 경계에서 끊기지 않습니다.
  3. 간접 계보를 추출합니다. JOIN 키, 필터 조건식, GROUP BY 컬럼은 모든 출력에 영향을 주므로 데이터셋 수준의 간접 계보로 기록됩니다. WindowExpression의 파티션 키와 CaseWhen/If/Coalesce의 분기는 출력 컬럼별로 기록되므로, 개별 값이 특정 경로를 거친 이유를 추적할 수 있습니다.
  4. 비동기로 제출합니다. 단일 워커 스레드가 용량이 제한된 큐(lineage_event_queue_size, 기본값 50000)에서 이벤트를 꺼내 활성화된 모든 플러그인에 순서대로 전달합니다. 플러그인 작업은 쿼리 스레드 밖에서 수행되므로, 다운스트림 시스템이 느려지면 큐 처리가 지연될 뿐 사용자가 기다리는 쿼리는 느려지지 않습니다.
  5. 불필요한 작업은 건너뜁니다. VALUES만 사용하는 삽입과 __internal_schema를 대상으로 하는 쓰기는 추출 전에 걸러냅니다. 옵티마이저는 필요하지 않은 이벤트를 처리하는 비용을 부담하지 않습니다.

쓰기 작업으로 이어지지 않는 애드혹 SELECT 트래픽의 경우에는 더 간단합니다. 감사 로그에는 이미 쿼리별 원본 테이블과 매칭된 구체화된 뷰가 기록되므로, 이 정보에서 테이블 수준 계보를 도출할 수 있습니다.

빠른 시작​

-- 1. Enable the audit plugin so query-level lineage is recorded.
SET GLOBAL enable_audit_plugin = true;

-- 2. Run a query that joins two base tables.
SELECT n.n_name, SUM(o.o_totalprice)
FROM orders o JOIN nation n ON o.o_custkey = n.n_nationkey
GROUP BY n.n_name;

-- 3. Read the lineage out of the audit log.
SELECT time, queried_tables_and_views, chosen_m_views, stmt_id
FROM internal.__internal_schema.audit_log
WHERE user = CURRENT_USER() AND is_query = 1
ORDER BY time DESC LIMIT 5;

예상 결과

+---------------------+--------------------------------------------+----------------+
| time | queried_tables_and_views | chosen_m_views |
+---------------------+--------------------------------------------+----------------+
| 2026-05-09 10:14:22 | ["internal.tpch.orders","internal.tpch. | [] |
| | nation"] | |
+---------------------+--------------------------------------------+----------------+

이 행에는 Catalog 이름까지 포함한 테이블 이름과 옵티마이저가 재작성에 사용한 MV가 담겨 있습니다. 이 정보만으로 애드혹 쿼리의 테이블 수준 그래프를 그릴 수 있습니다. 쓰기 작업의 컬럼 수준 계보를 얻으려면 LineagePlugin을 구현하고, jar를 plugin_dir/lineage/에 배치한 뒤, 플러그인 이름을 activate_lineage_plugin에 추가합니다. 이후 모든 INSERT와 CTAS가 LineageInfo 이벤트를 생성합니다.

Apache Doris 데이터 계보는 언제 사용해야 하나요?​

Apache Doris 데이터 계보는 영향 분석, 규정 준수 이력, MV 거버넌스, 외부 Catalog(Atlas, DataHub, OpenMetadata)에 컬럼 수준 이벤트를 전달하는 용도에 적합합니다. 내장 계보 탐색 도구는 아니며, 순수 SELECT 트래픽의 컬럼 수준 계보는 지원하지 않습니다.

적합한 용도

  • 스키마 변경의 영향 분석. "orders.o_discount를 삭제하면 어떤 하위 테이블과 컬럼에 문제가 생기나요?"라는 질문은 컬럼별 원본 표현식으로 정확히 답할 수 있습니다.
  • 특정 기간에 규제 대상 테이블을 읽은 모든 내역을 보여줘야 하는 감사 및 규정 준수 이력. 감사 로그는 사용자, 시간, SQL과 함께 쿼리별 테이블 목록을 제공합니다.
  • 구체화된 뷰 거버넌스. 감사 로그의 chosen_m_views를 비동기 구체화된 뷰와 함께 활용하면 실제로 쿼리를 처리하는 MV와 사용되지 않고 자원만 차지하는 MV를 확인할 수 있습니다.
  • 외부 메타데이터 Catalog(Apache Atlas, DataHub, OpenMetadata, 내부 서비스)에 OpenLineage 이벤트를 내보내는 LineagePlugin으로 컬럼 수준 계보를 전달하는 용도.
  • Doris가 공유 Catalog에 기록하는 여러 생산자 중 하나인 환경에서의 엔진 간 계보.

적합하지 않은 용도

  • 내장 계보 탐색 도구. Doris는 이벤트를 내보냅니다. 시각화는 거버넌스 도구가 담당합니다. 거버넌스 환경이 없는 상태에서 바로 그래프가 필요하다면 DataHub 또는 Marquez를 배포하고 플러그인이 해당 도구로 이벤트를 보내도록 설정하세요.
  • 쓰기 작업으로 이어지지 않는 순수 SELECT 쿼리의 계보. Nereids 추출기는 INSERT, INSERT OVERWRITE, CTAS에서만 실행됩니다. 읽기 전용 트래픽에는 감사 로그의 queried_tables_and_views 배열을 사용해 테이블 수준 계보를 확보하세요.
  • Doris에 전혀 접근하지 않는 시스템 간의 계보. 플러그인은 Doris 측 쿼리만 볼 수 있습니다. Spark 작업이 Parquet을 기록하고 Doris가 나중에 이를 읽는 경우에는 Spark 측 계측(예: OpenLineage의 Spark 통합)이 필요하며, 두 이벤트 스트림은 Catalog에서 합쳐집니다.
  • 메타데이터의 기준 저장소. 계보 이벤트는 외부로 전송되며 Doris 내부에는 보관되지 않습니다. 선택한 Catalog에 영구 저장하세요.
  • __internal_schema를 대상으로 하는 작업과 VALUES만 사용하는 삽입. 이 작업들은 설계상 제외되며 계보 이벤트를 생성하지 않습니다.

더 읽어보기​

  • audit_log 시스템 테이블: 테이블 수준 계보를 조회할 때 사용하는 queried_tables_and_views 및 chosen_m_views 배열을 포함한 전체 컬럼 참조 문서입니다.
  • 감사 로그 플러그인: enable_audit_plugin을 활성화하고, 배치 간격과 SQL 길이를 설정하며, 내부 사용자를 제외하는 방법을 설명합니다.
  • 비동기 구체화된 뷰: 재작성 엔진의 결정은 chosen_m_views에 나타나며, 기본 테이블 의존 관계는 MTMVRelationManager가 추적합니다.
  • 증분 구체화된 뷰: 쓰기 경로의 컬럼 수준 계보를 보완하는, MV와 기본 테이블 사이의 파티션 수준 의존 관계 추적을 설명합니다.
  • OpenLineage 명세: 컬럼 수준 계보 이벤트를 위한 개방형 표준으로, LineagePlugin 구현의 대상 스키마로 활용할 수 있습니다.
  • 레이크 테이블 관리: Iceberg, Paimon, Hive에 대한 쓰기도 계보 이벤트를 생성합니다. 이 카드에서는 관련 쓰기 경로를 다룹니다.
  • Apache Atlas 개요: 현재 OpenLineage를 수신하고 컬럼 수준 그래프를 시각화하는 일반적인 다운스트림 수신 시스템입니다.
  • Iceberg: 스냅샷 이력이 Doris 내부 테이블과 함께 계보 그래프에 반영되는 외부 테이블 형식입니다.