오브젝트 스토리지 기반으로 원시 데이터를 그대로 보관, 필요 시점에 스키마 적용.
Lakehouse / ETL / ELT요금: 별도문의
데이터 레이크 / ETL
원천 데이터 수집부터 정제·카탈로그·거버넌스·오케스트레이션까지, 분석과 AI가 바로 쓰는 레이크하우스 기반을 제공합니다.
Spark/Flink 기반 대용량 배치, Kafka/Flink로 실시간 처리.
메타데이터/파티션 관리, Parquet/ORC 최적화, 데이터 계보(라인리지).
IAM 역할/정책, 암호화, 감사로그, 디도스보호(프록시) 연동.
레퍼런스 아키텍처
구성요소
- 수집층: Kafka Connect / HTTP Ingest / DB CDC
- 저장층: 오브젝트 스토리지(Parquet/ORC), 파일 스토리지(NFS)
- 처리층: Spark(배치), Flink(스트림), SQL 엔진
- 카탈로그: 메타스토어/스키마 레지스트리
- 거버넌스: IAM/정책/암호화/감사
- 오케스트레이션: Airflow/워크플로
데이터 플로우(요약)
[Producers]
└─(CDC/Kafka/HTTP)──▶ [Ingest]
└─▶ [Raw Zone (S3 호환)]
└─▶ [ETL/ELT: Spark/Flink]
└─▶ [Curated Zone]
└─▶ [Catalog/BI/AI]
수집/연결 커넥터
전체배치스트림
| 소스 | 프로토콜 | 모드 | 비고 |
|---|---|---|---|
| RDBMS(MySQL/Postgres) | JDBC + 병렬 스냅샷 | 배치 | 증분키/타임스탬프 |
| RDBMS CDC | Debezium/Kafka Connect | 스트림 | 변경이벤트 캡처 |
| 파일 업로드 | S3 API/NFS | 배치 | CSV/JSON/Parquet |
| 로그/이벤트 | Kafka / HTTP | 스트림 | 웹/앱/IoT |
| IoT/센서 | Mqtt/HTTP | 스트림 | 타임시리즈 |
저장소 & 포맷
| 유형 | 포맷 | 압축 | 주요 용도 |
|---|---|---|---|
| 오브젝트 | Parquet/ORC | Snappy/Zstd | 분석/머신러닝 |
| 오브젝트 | JSON/CSV | Gzip | 원시/교환 |
| 파일(NFS) | 행/열 혼합 | - | DL/레거시 호환 |
| * 스키마/파티션은 카탈로그에서 관리됩니다. | |||
처리(배치/스트림)
| 엔진 | 모드 | 스케일 | 사례 |
|---|---|---|---|
| Spark | 배치 | 수십~수백 노드 | 정규화/집계/피처 생성 |
| Flink | 스트림 | 밀리초 SLA | 실시간 ETL/알림 |
| SQL 엔진 | 인터랙티브 | 서버리스/MPP | 애드혹 분석 |
카탈로그 / 거버넌스
메타데이터 — 테이블/파티션/스키마 버전.
보안 — IAM(사용자/역할/정책), 컬럼 마스킹, 행 수준 필터.
암호화 — 저장/전송 시 암호화, 키 관리.
감사 — 감사로그/라인리지로 변경 추적.
오케스트레이션(워크플로)
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.providers.apache.spark.operators.spark_submit import SparkSubmitOperator
from datetime import datetime
with DAG("daily_lake_etl", start_date=datetime(2025,1,1), schedule_interval="@daily", catchup=False) as dag:
extract = BashOperator(task_id="extract", bash_command="python3 extract_rdbms.py {{ ds }}")
transform = SparkSubmitOperator(task_id="transform", application="etl/jobs/curate_parquet.py", application_args=["--date", "{{ ds }}"])
load = BashOperator(task_id="load", bash_command="python3 load_dw.py {{ ds }}")
extract >> transform >> load
-- 파티션드 테이블 예시
CREATE TABLE lake.sales_curated (
date DATE, region STRING, sku STRING, qty INT, amount DOUBLE
) USING PARQUET
PARTITIONED BY (date)
LOCATION 's3://lake/curated/sales';
INSERT OVERWRITE TABLE lake.sales_curated
SELECT date, region, sku, SUM(qty), SUM(amount)
FROM lake.raw_sales
WHERE date = '${date}'
GROUP BY date, region, sku;
모니터링 / 라인리지
| 영역 | 지표/로그 | 알림 |
|---|---|---|
| 수집 | 오프셋/지연/실패율 | 지연/실패 임계 초과 |
| 처리 | 잡 시간/스테이지 재시도 | 런타임/오류율 |
| 저장 | IOPS/지연/오브젝트 수 | 용량 임계/비정상 패턴 |
| 라인리지 | 컬럼 변환/의존성 | 스키마 변화 감지 |
비용 최적화 가이드
포맷/압축 — Parquet+Zstd, 컬럼 프루닝/푸시다운.
파티셔닝 — 날짜/지역 등 선택적 스캔.
수명주기 — 핫→웜→아카이브 계층화.
스팟/선점형 — 배치 잡 컴퓨팅 비용 절감.
메트릭기반 — 실패 재시도/자동 스케일.
전송최적화 — 같은 리전 간 전송 우선, 캐시.
추가 샘플
Flink SQL — 실시간 윈도 집계
CREATE TABLE clicks ( user_id STRING, ts TIMESTAMP(3), WATERMARK FOR ts AS ts - INTERVAL '5' SECOND ) WITH (...); CREATE TABLE agg AS SELECT window_start, window_end, user_id, COUNT(*) AS c FROM TABLE( TUMBLE(TABLE clicks, DESCRIPTOR(ts), INTERVAL '1' MINUTE) ) GROUP BY window_start, window_end, user_id;
Kafka Connect — S3 싱크 (개념요약)
{
"connector.class": "io.confluent.connect.s3.S3SinkConnector",
"topics": "events",
"s3.bucket.name": "lake/raw/events",
"format.class": "io.confluent.connect.s3.format.parquet.ParquetFormat",
"flush.size": 100000
}
요금 안내
| 항목 | 산정 | 비고 |
|---|---|---|
| 스토리지 | GB·월 | 계층별 단가 상이 |
| 컴퓨팅 | vCPU·시간 | 배치/스트림 워커 |
| 전송 | GB 당 | 리전/외부 전송 과금 |
| 카탈로그/메타 | 요청/시간 | 구성에 따라 |
| * 실제 제공 범위/단가는 상담 후 확정됩니다. 요금은 별도문의. | ||
데이터 레이크/ETL 도입, 지금 시작하세요
원천 시스템/규모/목표 KPI만 알려주시면 아키텍처/비용안을 제안드립니다.
데이터 레이크/ETL 상담
ℹ️
개인정보 처리 안내
문의 응대를 위해서만 사용되며 일정 기간 후 파기됩니다.