← Tilbage til koncepter

Data Lakes

Arkitektur

Centraliseret repository til at gemme alle strukturerede, semi-strukturerede og ustrukturerede data i råformat.

Beskrivelse

Et Data Lake er en moderne tilgang til datalagring hvor alle data - uanset type eller struktur - gemmes i sin rå, originale 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-sensordata, clickstream-hændelser - alt sammen i samme repository. Data lakes bruger typisk billig objektlagring (AWS S3, Azure Data Lake, Google Cloud Storage) og kan skalere til petabytes. Data organiseres ofte i zoner: raw (ubehandlet), cleansed (valideret), curated (forretningsklar). Værktøjer som Apache Spark, Presto og Athena lader dig forespørge data direkte i data lake. Den store udfordring er at undgå 'data swamps' hvor data bliver uorganiseret og ubrugelig. Moderne lakehouse-arkitektur (Databricks Delta Lake, Apache Iceberg) kombinerer fordele fra både lakes og warehouses.

Problem

Traditionelle data warehouses er dyre, rigide (fast skema) og kan ikke håndtere ustrukturerede data som logs, billeder eller streaming-hændelser. De kræver at du definerer skema før data loading, hvilket er upraktisk for eksplorativ analyse og machine learning.

Løsning

Data Lakes gemmer ALT data i råformat til billig lagring. Skema defineres kun når data læses, så samme data kan bruges til forskellige formål. Data scientists kan eksperimentere frit uden dyre ETL-processer. Understøtter både strukturerede, semi-strukturerede og ustrukturerede 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 lagring til massive datamængder
  • Fleksibilitet - intet fast skema
  • Understøtter alle datatyper
  • Ideel til machine learning
  • Kan gemme data før brugsscenarie er kendt

Udfordringer

  • Kan blive 'data swamp' uden governance
  • Ydeevne kan være dårligere end warehouse
  • Kræver datakatalog og metadatastyring
  • Sikkerhed og adgangskontrol-kompleksitet
  • Forespørgselsmotorer er separate tjenester

Anvendelsesområder

  • Machine learning feature stores
  • Log-aggregering og -analyse
  • IoT-sensordataindsamling
  • Clickstream og adfærdsanalyser
  • Arkivering af rådata

Eksempler fra den virkelige verden

  • Netflix: Clickstream-data til anbefalinger (petabytes)
  • Spotify: Brugerlyttedata til personalisering
  • Uber: GPS-data, turlogs til ruteoptimering
  • NASA: Satellitbilleder og telemetridata
  • Sundhedsvæsen: Medicinske billeder, genomikdatalagring