Background
Ontul

Ontul분산 통합 데이터 엔진

Ontul 주요 기능

배치 처리, 스트림 처리, 인터랙티브 SQL을 하나의 엔진으로 통합한 분산 데이터 엔진의 핵심 기능을 소개합니다.

통합 데이터 엔진

배치 처리, 스트림 처리, 인터랙티브 SQL 쿼리를 하나의 클러스터에서 실행합니다. 별도의 시스템 없이 모든 데이터 워크로드를 통합합니다.

Arrow 네이티브 실행 엔진

Apache Arrow 컬럼나 포맷으로 모든 데이터를 처리합니다. Iceberg Parquet 데이터 파일을 컬럼 단위로 Arrow 벡터에 직접 디코드하고, Iceberg 파일 프루닝·Parquet 로우그룹 스킵으로 읽을 데이터를 최소화하며, 컬럼형 집계와 bounded-heap Top-N, 제로카피 실행으로 최상급 분석 성능을 실현합니다.

인터랙티브 SQL

Arrow Flight SQL을 통한 JDBC 연결(DBeaver, DataGrip)과 다중 카탈로그 페더레이션 쿼리를 지원합니다. JOIN(INNER·LEFT·RIGHT·FULL), GROUP BY/HAVING, CTE, DISTINCT 등 표준 SQL을 지원합니다. 엔진이 정확히 계산할 수 없는 구문은 실행 전에 명시적 오류로 거부하므로, 조용히 틀린 숫자가 대시보드나 에이전트 답변에 흘러들지 않습니다. 컴파일된 plan 캐시와 스냅샷 기반 결과 캐시로 변경 없는 데이터에 대한 반복 쿼리는 실행 자체를 건너뛰어 BI·AI 에이전트 워크로드의 인터랙티브 QPS를 높입니다. MCP 서버는 JSON-RPC 배치 요청을 동시 처리해 에이전트의 다중 도구 호출을 한 번의 왕복으로 처리합니다.

Ontul Flow — 시각적 스트리밍 파이프라인

Spark의 마이크로배치가 아닌 Flink처럼 이벤트가 도착하는 즉시 처리하는 continuous processing 방식(TUMBLING·SLIDING·SESSION 윈도우, multi-worker 해시 셔플)입니다. Admin UI의 Ontul Flow에서 source→transform→sink 파이프라인을 드래그&드롭 또는 YAML/JSON으로 작성해 이름 붙여 저장·시작·중지하고, 실시간 메트릭·로그·데이터 미리보기·실행 이력을 한 화면에서 관찰합니다. 소스는 Kafka·Debezium CDC(Postgres/MySQL/SQL Server/Oracle/Db2)·Iceberg(증분·changelog)·S3 파일·NeorunBase, 싱크는 Iceberg·JDBC·Kafka·REST·Elasticsearch·NeorunBase를 지원하며, Iceberg/JDBC CDC-apply(SCD Type 1/2, hard·soft·ignore 삭제)로 OLTP 복제본을 실시간 유지합니다. 플로우는 소유자 기반 IAM으로 제어되고 워커 장애 시 마지막 체크포인트에서 자동 복구됩니다. 해석할 수 없는 레코드는 조용히 사라지지 않습니다 — 싱크에 절대 기록되지 않고 사유별로 집계되어 Flow 목록의 Rejected 열에 드러나며, errorSink에 격리 테이블을 지정하면 원본 페이로드와 사유·오프셋까지 남아 고쳐서 재처리할 수 있습니다. 소스 스키마가 변하면(상류 ALTER TABLE, 프로듀서의 신규 필드) 대상 Iceberg 테이블에 컬럼을 자동 추가하고(int→long, float→double 승격 포함) 무시·중단 정책도 선택할 수 있습니다. 지연은 건수(Kafka consumer lag)와 시간(최신 레코드의 나이) 두 축으로 보여, 밀리고 있는지 한눈에 확인됩니다.

Exchange Manager

Query/Batch/Streaming 모든 경로를 위한 통합 fault-tolerance 인프라입니다. 메모리 초과 시 data spill, 스트리밍 checkpoint 상태 저장을 하나의 시스템으로 관리하며, 모든 데이터는 KMS 봉투 암호화됩니다. 로컬 디스크 또는 S3-primary(Trino식) 모드를 선택할 수 있고, S3 모드에서는 spill·checkpoint를 S3에 직접 읽고 써 실패한 태스크를 다른 워커에서 복구합니다. 스트리밍 태스크가 실패하면 마스터가 마지막 체크포인트에서 자동 재시작합니다.

Exactly-Once 보장

Master 조율 barrier checkpoint로 transactional sink(Iceberg, JDBC, NeorunBase, Kafka Transactions)에서 exactly-once 전달을 보장합니다. Sink commit → offset commit 순서로 데이터 정합성을 확보합니다.

커넥터 아키텍처

플러그인 기반 커넥터로 다양한 데이터 소스에 접근합니다. Iceberg, NeorunBase, JDBC, Lance, Elasticsearch 등을 런타임에 동적으로 등록/해제할 수 있으며, Admin UI에서 카탈로그·연결을 등록합니다. Elasticsearch는 소스+싱크로, 인덱스를 테이블처럼 쿼리(숫자·불리언 조건 pushdown, 병렬 sliced-scroll)하고 _bulk로 씁니다(idField로 upsert). Kafka는 스트리밍 소스/싱크입니다.

페더레이션 쿼리

여러 데이터 소스에 걸친 크로스 카탈로그 조인을 단일 SQL로 실행합니다. Iceberg, NeorunBase, JDBC 테이블을 하나의 쿼리로 결합합니다.

시맨틱 레이어

메트릭, 디멘전, 다국어 동의어, 거버넌스, 컨폼드 디멘전 조인, 파생 메트릭, 멀티테넌트 강제 필터를 정의하면 Ontul 플래너가 쿼리 시점에 자동 재작성합니다. SELECT revenue FROM sales 만 써도 SUM(...) 집계와 GROUP BY, JOIN, 행 필터까지 서버에서 처리됩니다.

Agentic AI 준비

내장 MCP 서버가 LLM 에이전트에게 메트릭 발견과 자연어 검색(한국어 매출 ↔ revenue), 인증 메타데이터를 제공합니다. 시맨틱 레이어가 집계·조인·RBAC을 서버에서 처리하므로 에이전트는 컬럼명만 알면 되며, 멀티테넌트 정책도 사용자 컨텍스트로 자동 적용됩니다.

Apache Iceberg v2 · v3 네이티브

Iceberg v2와 v3를 모두 네이티브로 지원합니다. 분산 INSERT/CTAS와 MOR 기반 DELETE/UPDATE/MERGE, hidden partitioning, schema evolution, time travel, branches/tags를 제공하며, v3에서는 position-delete 파일 대신 deletion vector(Puffin)를 직접 쓰고 읽습니다 — 모든 운영 기능을 단일 엔진에서. Write-Audit-Publish(WAP)도 지원하여 SET으로 비-main 브랜치에 INSERT/UPDATE/DELETE/MERGE를 스테이징·격리 검증한 뒤 ALTER TABLE EXECUTE fast_forward/cherrypick으로 main에 게시합니다. 또한 Spark 스타일 테이블 유지관리 프로시저(optimize·expire_snapshots·rewrite_manifests·remove_orphan_files·rollback)를 ALTER TABLE EXECUTE로 제공하며, retain_last·min_input_files·dry_run·window_hours 같은 세분 파라미터를 지원합니다(window_hours는 스트리밍으로 쌓이는 소형 파일을 최근 N시간 단위로 증분 컴팩션). Admin UI에서는 테이블별로 작업 토글과 이들 파라미터, 그리고 CRON 스케줄까지 지정해 자동 유지관리를 운영할 수 있습니다. 또한 $snapshots·$history·$files·$metadata_files 같은 Iceberg 메타데이터 테이블을 SQL로 바로 조회해 커밋 통계(추가·총 레코드/파일/바이트), 소형 파일 진단, 그리고 같은 경로에 재생성된 테이블의 UUID 세대 경계까지 확인할 수 있습니다. 나아가 이 메타데이터를 상시 관측으로 끌어올립니다 — Admin UI의 Iceberg Health 페이지가 테이블별 상태를 계속 수집해 0~100 헬스 점수와 함께 소형 파일, 스냅샷 누적, delete 파일 부채, metadata.json 증식, 매니페스트 파편화, 지연·실패한 유지관리를 진단하고, 각 진단마다 그것을 해결하는 유지관리 작업을 버튼으로 바로 제시합니다. 수집은 2단계로 분리되어 있어 관측 자체가 부하가 되지 않습니다 — 스냅샷 summary만 읽는 저비용 단계는 자주(기본 60초), 매니페스트를 전수로 읽어 파일 크기 분포를 만드는 고비용 단계는 드물게(기본 30분) 수행합니다. 무엇보다 유지관리 실행 전후를 각각 측정해 그 작업이 실제로 무엇을 바꿨는지 기록합니다(예: 데이터 파일 9개 → 1개, delete 파일 3개 → 0개, 점수 65 → 100) — 탐지에서 끝나지 않고 교정과 검증까지 닫힌 루프입니다. 동일한 지표는 테이블 라벨이 붙은 Prometheus 게이지로도 노출되어 기존 모니터링에 그대로 연결됩니다.

Lance 커넥터 — 벡터 · 멀티모달 레이크하우스

LanceDB의 Lance 포맷을 1급 카탈로그 커넥터로 통합합니다(벤더 중립 org.lance 계보로 Spark·Trino lance 커넥터와 포맷 호환). 벡터 ANN과 풀텍스트(BM25) 검색을 SQL 함수 vector_search()·match()로 제공하고, 한국어/CJK 풀텍스트는 lindera/ko-dic 형태소 분석을 pylance 사이드카로 처리합니다(기본형 명사 "데이터베이스"가 굴절형 "데이터베이스를"을 매칭). CREATE INDEX(btree·bitmap·ivf·inverted)로 보조·벡터·FTS 인덱스를 만들고, INSERT/CTAS는 워커가 fragment를 쓰고 마스터가 단일 커밋하는 분산 쓰기로, DELETE는 deletion vector, MERGE는 네이티브 upsert(mergeInsert), UPDATE는 엔진 재작성으로 지원합니다. Kafka→Lance 스트리밍 싱크와, 스트리밍에 최적화된 2단계 유지관리(OPTIMIZE 컴팩션 + VACUUM 회수)를 제공하며, OPTIMIZE는 window_hours·cooldown·min_input_files·dry_run으로 "최근 커밋분만" 증분 컴팩션해 전체 테이블을 스캔하지 않습니다(Lance엔 hidden partition이 없어 버전 타임스탬프로 fragment 윈도우를 산출). 비디오·오디오·이미지·문서 같은 비정형 데이터를 Blob V2 컬럼으로 테이블 안에 직접 저장해, 임베딩·메타데이터와 같은 트랜잭션·버전 관리되는 한 행에 함께 둡니다. 검색으로 찾은 그 행에서 원본까지 바로 받을 수 있고, 바이트는 거버넌스(IAM)가 적용된 스트리밍 경로로 엔진을 통해(Python SDK 포함) 구간 단위로 읽어들여 대용량 자산도 접근 제어를 우회하지 않습니다. 멀티-GB 원본은 외부 참조로 두고 임베딩·썸네일 등 파생물만 인라인으로 함께 저장하는 하이브리드 구성도 지원합니다. Apache Polaris Generic Tables를 공유 카탈로그로 사용해 동일한 Lance 테이블을 Spark·Trino와 교차 엔진으로 함께 읽고 쓰며, 컴팩션·정리 후에도 데이터 정합성이 유지됩니다. 시맨틱 리트리버의 backend로도 동작해 RAG 벡터·FTS 검색을 인-엔진으로 수행하며, IAM 컬럼 마스킹·로우레벨 정책이 스캔 출력에 그대로 적용됩니다.

보안 (IAM & KMS)

AES-256-GCM 봉투 암호화, 내장 KMS, Exchange Manager 데이터 암호화, 카탈로그/테이블/컬럼/행 수준 IAM 정책, STS 임시 자격 증명을 지원합니다.

BI 통합 (Tableau · Power BI · Looker)

Arrow Flight SQL JDBC로 Tableau, Power BI, Looker, DBeaver가 라이브 연결합니다. 시맨틱 뷰는 측정값(measure)·디멘전이 자동 분류되어 노출되며, /api/v1/bi/connection-info 엔드포인트가 드라이버 정보와 도구별 설정 가이드를 한 번에 제공합니다.

온톨로지 & 액션 (Objects · Links · Actions)

데이터를 업무 개념으로 모델링하는 온톨로지 계층입니다. 오브젝트 타입(속성↔컬럼)과 링크 타입(관계형 JOIN 또는 NeorunBase 그래프 순회)으로 엔티티와 관계를 정의하고, 에이전트·앱은 논리 속성명만으로 인스턴스를 조회하고 관계를 순회합니다. 쓰기는 거버넌스되는 액션(원천 시스템에 대한 DML, 또는 ERP·CRM·결제 같은 운영 시스템에 대한 REST 오퍼레이션)으로 수행되며 RBAC·승인·멱등성·감사가 강제됩니다. 액션은 REST뿐 아니라 SQL `CALL catalog.schema.action(param => value)` 로도 호출되어, BI 도구와 에이전트가 이미 쓰는 JDBC 연결 그대로 거버넌스된 쓰기를 실행합니다. 두 경로는 같은 실행 경로를 지나므로 인가·멱등성·승인·감사·리니지가 어느 쪽에서든 동일하게 적용되고, 외부 시스템에 쓰는 권한은 읽기 권한과 분리해 부여합니다. 여러 액션은 하나의 거버넌스 단위인 액션 워크플로우(YAML로 작성하는 DAG 기반 Saga)로 묶여, 실패 시 완료된 단계를 역순으로 보상(compensation)하고 실제 실행은 배치·스트리밍 잡처럼 워커로 위임됩니다. MCP 도구를 통해 에이전트가 온톨로지로 안전하게 읽고 변경합니다. 정의에는 인증(certification)이 붙습니다. 인증은 서명한 사람이 서버에 기록되는 별도 행위이며(페이로드로 스스로를 인증할 수 없습니다), 인증 시점의 정의를 지문으로 남깁니다. 이후 읽기 원본이나 속성↔컬럼 매핑이 바뀌면 자동으로 STALE로 강등되고, 설명·태그 수정은 서명을 취소하지 않습니다. 신뢰는 의존 대상을 넘지 못해 — DRAFT 뷰 위에 얹힌 오브젝트 타입, 인증되지 않은 엔드포인트를 가진 링크는 실질 DRAFT로 보고됩니다. 이 판정은 모든 조회 응답에 effectiveStatus 한 필드로 실려 나가므로, 에이전트는 "이 답변이 인증된 정의에서 나왔는가"를 스스로 계산하지 않고 그대로 표시할 수 있습니다.

데이터 리니지 & 감사 (멀티 엔진)

CTAS·INSERT·MERGE·VIEW의 리니지를 Calcite 쿼리 플랜에서 테이블·컬럼 단위로 자동 추출하고, 누가·어떤 엔진이·어떤 테이블을·무슨 쿼리로 접근했는지 감사 로그로 남깁니다. 감사 로그는 리더에 기록되어 스탠바이 마스터로 복제되므로 장애 조치 후에도 유지되며, 쓰기 경로는 IAM을 우회(내부 컴포넌트만 기록)하고 읽기 경로는 IAM으로 통제됩니다. Admin UI 설정만으로 오래된 감사를 S3 Iceberg(v2) 또는 Parquet로 티어링하며(Ontul 자체 Iceberg 핸들러로 대량 적재), Iceberg 티어링을 켜면 감사 테이블을 시간별 Iceberg 유지관리(컴팩션·스냅샷 만료·오펀 정리)에 자동 등록합니다. 읽기 감사는 샘플링·보존일수로 볼륨을 제어하며, Trino·Spark·Flink authz 플러그인은 REST로 리니지·감사를 Ontul에 모읍니다. Admin UI에서 사용자→엔진→테이블 관계 그래프의 노드를 클릭해 해당 read/write 감사를 드릴다운하거나 전용 검색 페이지로 조회합니다.

Agentic AI · Semantic Layer

시맨틱 레이어 — Agentic AI를 위한 단일 진실 공급원

One definition of truth per metric — enforced server-side.

Ontul의 시맨틱 레이어는 에이전트에게 두 가지를 줍니다. ① 숫자(메트릭) — 매출·이익률 같은 분석 정의를 한 번 정의하면 LLM 에이전트·Tableau·분석가가 모두 같은 숫자를 봅니다. ② 관련 컨텍스트(리트리버) — 텍스트나 이미지로 관련 문서를 찾는 멀티모달 검색. 메트릭이 "매출 얼마?"에 답한다면, 리트리버는 "관련 문서 찾아줘"에 답합니다. 에이전트는 한 인터페이스로 둘 다 가져옵니다.

핵심 기능

서버 사이드 쿼리 재작성

SELECT revenue, customer.region FROM sales 한 줄이면 Ontul 플래너가 SUM(amount * (1-discount)) 집계, LEFT JOIN customer ON ..., GROUP BY customer.region을 자동으로 재작성합니다. 클라이언트가 공식을 외울 필요 없습니다.

MCP 기반 메트릭 발견

LLM 에이전트는 ontul_search_metrics, ontul_describe_semantic_view 도구로 매출·revenue·net_revenue·sales_amount 등 다국어 동의어를 통해 메트릭을 찾고 정의를 읽습니다. 한 번 정의된 메트릭은 모든 에이전트가 공유합니다.

파생 메트릭 (Derived Metrics)

profit = revenue - cost, profit_margin = (revenue - cost) / revenue 처럼 다른 메트릭을 참조해 정의합니다. Ontul 플래너가 재귀적으로 풀어주며 순환 참조는 자동 감지합니다.

컨폼드 디멘전 조인

한 번 선언한 조인은 사용될 때만 자동 주입됩니다. SELECT customer.region, revenue 라고 쓰면 LEFT JOIN customer ON ... 가 자동으로 붙고, 미참조 조인은 plan에서 제외되어 비용이 들지 않습니다.

멀티테넌트 강제 필터

뷰 단위 또는 메트릭 단위로 tenant_id = ${user.attr.tenant_id} 같은 강제 필터를 선언합니다. 인증된 사용자 컨텍스트에서 자동 치환되어 BI 대시보드든 LLM 쿼리든 동일한 RLS 정책이 일관되게 적용됩니다.

거버넌스 · RBAC

메트릭별 allowedRoles로 접근 제어, DRAFT → CERTIFIED → DEPRECATED 라이프사이클, 인증자/인증일시 감사, 자유로운 태그를 지원합니다. 재작성 시점에 검증되어 인증되지 않은 사용자에게는 공식조차 노출되지 않습니다.

리트리버 — 한 번에 멀티모달 검색

에이전트가 텍스트나 이미지로 "관련된 것"을 찾을 때 쓰는 검색 객체입니다. 벡터(의미)·키워드(BM25)·그래프(관계)를 NeorunBase에서 한 번에 실행하고, 메트릭과 똑같은 IAM·권한으로 보호됩니다. 에이전트는 SQL을 쓰지 않고 값만 채우면 되고 — 그게 곧 RAG입니다. 회수된 후보의 순서는 아래 리랭킹 단계로 다듬을 수 있습니다. (HYBRID_SEARCH / GRAPH_NEIGHBORS를 거버넌스되는 retriever 객체로 정의해 Ontul을 통해 푸시다운)

리랭킹 — 관련도 순으로 다시 정렬

회수는 질문과 문서를 각각 임베딩해 비교하므로 "환불 얘기를 하는 문서"와 "환불 기간에 답하는 문서"를 구분하지 못합니다. 리랭킹은 교차 인코더가 둘을 한 번에 놓고 비교해 상위 몇 건만 남깁니다. 모델은 Ontul 밖 엔드포인트에 두고 리트리버에는 커넥션 ID만 남기므로, 0.6B→4B 교체나 호스트 이전에도 리트리버 정의와 Ontul 배포는 그대로입니다. 엔드포인트가 죽으면 회수 순서로 폴백하고 그 사유를 응답에 남깁니다 — 조용히 품질만 떨어지지 않습니다.

한 줄로 충분합니다

사용자가 작성하는 SQL
SELECT customer.region, profit_margin
FROM saas.core.sales
WHERE ship_date >= DATE '2024-01-01';
Ontul이 실제로 실행하는 SQL
SELECT customer.region,
       (SUM(amount) - SUM(unit_cost * quantity)) / SUM(amount)
         AS profit_margin
FROM saas.core.sales
LEFT JOIN saas.core.customer customer
  ON sales.customer_id = customer.id
WHERE ship_date >= DATE '2024-01-01'
  AND tenant_id = 'acme-co'           -- 자동 RLS
  AND status = 'COMPLETED'             -- 메트릭별 필터
GROUP BY customer.region;

Agentic AI에 어떤 의미인가

환각 방지

메트릭 공식은 한 번만 정의되어 서버에서 강제됩니다. LLM이 SUM(amount) 대신 AVG(amount)를 잘못 추측해도 — 메트릭 이름만 맞으면 — 항상 옳은 집계가 실행됩니다.

권한 자동 전파

에이전트가 보는 메트릭과 행은 사용자의 IAM 정책이 정확히 결정합니다. 별도의 prompt-level 권한 로직이 필요 없고, 우회도 불가능합니다.

다국어 친화

"매출 어떻게 돼?" 같은 한국어 질문도 동의어 매칭으로 즉시 revenue 메트릭을 찾아냅니다. 비즈니스 용어는 팀마다 다르고, 시맨틱 레이어가 그 격차를 메웁니다.

BI · AI 일관성

Tableau에서 보는 revenue 와 LLM 에이전트가 답하는 revenue 는 같은 SQL로 실행됩니다. 두 채널 간 숫자 불일치가 사라집니다.

활용 사례

통합 데이터 처리

별도의 배치/스트리밍/쿼리 클러스터 없이 하나의 Ontul 클러스터로 모든 데이터 워크로드를 처리합니다.

AI 에이전트 분석

LLM 에이전트가 MCP 도구로 메트릭을 발견하고 자연어 쿼리를 Ontul SQL로 변환합니다. 시맨틱 레이어가 집계·조인·IAM을 자동 처리해 환각 없이 검증된 비즈니스 정의로 답합니다.

실시간 데이터 파이프라인

Kafka에서 데이터를 수집하여 Ontul에서 처리 후 Iceberg 테이블로 적재하는 실시간 ETL 파이프라인을 구축합니다.

데이터 레이크 분석

Iceberg, JDBC 등 다양한 소스에 걸친 페더레이션 쿼리로 통합 분석을 수행합니다.

분석 + RAG를 한 백엔드로

별도의 시맨틱 분석 도구와 벡터·그래프 검색 스택을 따로 운영하지 않고, 메트릭(분석)과 리트리버(멀티모달 검색)를 한 엔진·한 거버넌스로 묶습니다. 에이전트가 한 MCP 세션에서 "숫자"와 "관련 근거"를 함께 가져옵니다.

Ontul 도입을 검토하고 계신가요?

Unified. Arrow-Native. Agentic AI-Ready.

배치, 스트리밍, SQL, 시맨틱 레이어를 하나로 통합한 분산 데이터 엔진으로 BI와 AI 에이전트가 같은 진실로 답하게 하세요.