← Tilbage til koncepter

Data Lakes

Arkitektur

Centraliseret repository til at gemme alle structured, semi-structured og unstructured data i raw format.

Beskrivelse

Et Data Lake er en modern tilgang til data storage hvor alle data - uanset type eller struktur - gemmes i sin raw, original form. I modsætning til data warehouses der kræver schema-on-write (definer struktur ved skrivning), bruger data lakes schema-on-read (definer struktur ved læsning). Dette giver ekstrem fleksibilitet: du kan gemme JSON logs, CSV filer, billeder, video, IoT sensor data, clickstream events - alt sammen i samme repository. Data lakes bruger typisk billig object storage (AWS S3, Azure Data Lake, Google Cloud Storage) og kan skalere til petabytes. Data organiseres ofte i zones: raw (uprocessed), cleansed (validated), curated (business-ready). Tools som Apache Spark, Presto og Athena lader dig query data direkte i data lake. Den store udfordring er at undgå 'data swamps' hvor data bliver uorganiseret og ubrugelig. Modern lakehouse arkitektur (Databricks Delta Lake, Apache Iceberg) kombinerer fordele fra både lakes og warehouses.

Problem

Traditionelle data warehouses er dyre, rigid (fixed schema), og kan ikke håndtere unstructured data som logs, images, eller streaming events. De kræver at du definerer schema før data loading, hvilket er upraktisk for explorative analytics og machine learning.

Løsning

Data Lakes gemmer ALT data i raw format til billig storage. Schema defineres kun når data læses, så samme data kan bruges til forskellige formål. Data scientists kan eksperimentere frit uden expensive ETL. Understøtter både structured, semi-structured og unstructured data.

Eksempel

// Data Lake Arkitektur Eksempel

// ============ ZONES/LAYERS ============

// 1. RAW ZONE (Landing) - Original data, no processing
s3://company-datalake/raw/
  ├── web-logs/2024/01/15/server1-access.log
  ├── transactions/2024/01/15/orders.json
  ├── customer-data/full-dump.csv
  ├── product-images/img-12345.jpg
  └── iot-sensors/device-readings.parquet

// 2. CLEANSED ZONE - Validated, deduplicated
s3://company-datalake/cleansed/
  ├── web-logs/year=2024/month=01/day=15/
  ├── transactions/year=2024/month=01/day=15/
  └── customers/snapshot=2024-01-15/

// 3. CURATED ZONE - Business-ready aggregates
s3://company-datalake/curated/
  ├── customer-360/
  ├── sales-metrics/
  └── ml-features/

-----------------------------------------------------

// ============ INGESTION EXAMPLES ============

// 1. Stream IoT data direkte til S3
const AWS = require('aws-sdk');
const s3 = new AWS.S3();

function ingestSensorData(sensorId, reading) {
  const key = `raw/iot-sensors/date=${new Date().toISOString().split('T')[0]}/sensor-${sensorId}-${Date.now()}.json`;
  
  return s3.putObject({
    Bucket: 'company-datalake',
    Key: key,
    Body: JSON.stringify(reading),
    ContentType: 'application/json'
  }).promise();
}

// 2. Bulk load fra database
// Export til Parquet (column format, compressed)
SELECT * FROM customers
INTO 's3://company-datalake/raw/customers/snapshot=2024-01-15/'
FORMAT PARQUET;

-----------------------------------------------------

// ============ QUERYING DATA LAKE ============

// AWS Athena - Query S3 data med SQL
CREATE EXTERNAL TABLE web_logs (
  timestamp STRING,
  ip STRING,
  user_id INT,
  url STRING,
  status_code INT
)
PARTITIONED BY (year INT, month INT, day INT)
STORED AS PARQUET
LOCATION 's3://company-datalake/cleansed/web-logs/';

-- Query uden at loade data
SELECT 
  url,
  COUNT(*) as page_views
FROM web_logs
WHERE year = 2024 AND month = 1
  AND status_code = 200
GROUP BY url
ORDER BY page_views DESC
LIMIT 10;

-----------------------------------------------------

// Apache Spark - Process massive datasets
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('DataLakeETL').getOrCreate()

# Læs raw JSON logs
logs = spark.read.json('s3://company-datalake/raw/web-logs/**/*.json')

# Transform
cleaned = logs \
  .filter(logs.status_code == 200) \
  .withColumn('date', to_date(logs.timestamp)) \
  .dropDuplicates(['user_id', 'timestamp'])

# Write tilbage til lake som Parquet med partitioning
cleaned.write \
  .partitionBy('year', 'month', 'day') \
  .mode('overwrite') \
  .parquet('s3://company-datalake/cleansed/web-logs/')

-----------------------------------------------------

// ============ DATA LAKE vs DATA WAREHOUSE ============

/*
DATA LAKE:
- Schema-on-read (fleksibel)
- All data types (structured, unstructured)
- Billig storage (object storage)
- Explorative analytics, ML
- Data scientists
- Eksempel: S3 + Athena + Spark

DATA WAREHOUSE:
- Schema-on-write (rigid)
- Structured data only
- Dyrere storage
- Known queries, BI reports
- Business analysts
- Eksempel: Snowflake, Redshift

MODERN LAKEHOUSE:
- Best of both worlds!
- ACID transactions på data lake
- Eksempel: Delta Lake, Iceberg
*/

Fordele

  • Billig storage til massive data volumes
  • Fleksibilitet - ingen fixed schema
  • Understøtter alle data typer
  • Ideel til machine learning
  • Kan gemme data før use case er kendt

Udfordringer

  • Kan blive 'data swamp' uden governance
  • Performance kan være dårligere end warehouse
  • Kræver data catalog og metadata management
  • Security og access control kompleksitet
  • Query engines er separate services

Anvendelsesområder

  • Machine learning feature stores
  • Log aggregation og analysis
  • IoT sensor data collection
  • Clickstream og behavioral analytics
  • Arkivering af raw data

Eksempler fra den virkelige verden

  • Netflix: Clickstream data til recommendations (petabytes)
  • Spotify: User listening data for personalization
  • Uber: GPS data, trip logs for routing optimization
  • NASA: Satellite imagery og telemetry data
  • Healthcare: Medical imaging, genomics data storage