📊
데이터공학
데이터 레이크
Data Lake
원시 데이터를 저장하는 중앙 저장소. 스키마 온 리드.
Data Lake
원시 데이터를 저장하는 중앙 저장소. 스키마 온 리드.
데이터 레이크(Data Lake)는 구조화, 반구조화, 비구조화 데이터를 원시 형태 그대로 저장하는 중앙 집중식 저장소입니다. 전통적인 데이터 웨어하우스의 '스키마 온 라이트(Schema on Write)'와 달리, 데이터 레이크는 '스키마 온 리드(Schema on Read)' 방식으로 데이터 저장 시점이 아닌 읽기 시점에 스키마를 적용합니다.
Amazon S3, Azure Data Lake Storage, Google Cloud Storage 같은 객체 스토리지가 기반 기술이며, 페타바이트 규모의 데이터를 저비용으로 저장할 수 있습니다. Parquet, ORC, Avro 같은 컬럼형 포맷을 사용하면 쿼리 성능과 압축 효율을 크게 높일 수 있습니다.
데이터 레이크는 일반적으로 계층 구조(Zones)로 관리됩니다. Raw Zone에 원시 데이터를 수집하고, Bronze/Silver/Gold Zone을 거치며 데이터를 정제하고 가공합니다. AWS Glue Catalog나 Hive Metastore로 테이블 스키마와 파티션 정보를 관리합니다.
AI/ML 학습 데이터 준비, 로그 분석, IoT 센서 데이터 수집 등 다양한 유스케이스에 활용되며, Spark, Presto, Trino 같은 분산 처리 엔진으로 대용량 데이터를 병렬 처리합니다.
# AWS S3 기반 데이터 레이크 아키텍처
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
import boto3
# S3 데이터 레이크 계층 구조
DATA_LAKE = "s3://company-datalake"
ZONES = {
"raw": f"{DATA_LAKE}/raw/", # 원시 데이터
"bronze": f"{DATA_LAKE}/bronze/", # 정제된 데이터
"silver": f"{DATA_LAKE}/silver/", # 변환/집계 데이터
"gold": f"{DATA_LAKE}/gold/" # 분석용 마트
}
# Spark 세션 초기화
spark = SparkSession.builder \
.appName("DataLakeProcessing") \
.config("spark.sql.extensions",
"io.delta.sql.DeltaSparkSessionExtension") \
.getOrCreate()
# Raw Zone: 원시 JSON 데이터 수집
raw_events = spark.read \
.option("multiLine", True) \
.json(f"{ZONES['raw']}/events/2024/01/15/")
# Bronze Zone: 정제 및 파티셔닝
bronze_events = raw_events \
.dropDuplicates(["event_id"]) \
.withColumn("event_date", to_date("timestamp")) \
.withColumn("event_hour", hour("timestamp"))
bronze_events.write \
.partitionBy("event_date", "event_hour") \
.mode("append") \
.parquet(f"{ZONES['bronze']}/events/")
print(f"Processed {bronze_events.count()} events to Bronze Zone")
# AWS Glue Catalog에 테이블 등록
glue = boto3.client('glue')
glue.create_table(
DatabaseName='bronze_db',
TableInput={
'Name': 'events',
'StorageDescriptor': {
'Location': f"{ZONES['bronze']}/events/",
'InputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
}
}
)