2024-11-26

AWS Üzerinde Üretim Düzeyinde Filo Telematiği ETL Boru Hattı Oluşturmak

A

Filo telematiği devasa miktarda veri üretir. Her araç birkaç saniyede bir konum, hız ve motor metriklerini içeren JSON sinyalleri (ping) gönderir. Bu bilgi selini analiz etmek, sağlam ve ölçeklenebilir bir mimari gerektirir. Bu rehberde, maliyetleri minimumda tutarken AWS Glue, Python ve Terraform kullanarak üretim düzeyinde bir ETL (Ayıkla, Dönüştür, Yükle) boru hattının nasıl oluşturulacağını inceleyeceğiz.

Bu kılavuz, ham sensör okumalarından yakıt verimliliği, filo kullanımı ve sürücü güvenlik puanları gibi metrikler için eyleme dönüştürülebilir panolara (dashboard) nasıl geçileceğini göstermektedir.

AWS Üzerinde ETL Zihinsel Modeli

ETL üç temel aşamadan oluşur: verileri çıkarmak, temiz bir biçime dönüştürmek ve sorgulama için yüklemek. Modern bir bulut ortamında, yönetilen hizmetlere (managed services) güvenmek, sunucularla uğraşmak yerine özellikler geliştirmeye zaman ayırmanızı sağlar.

Mimari, büyük ölçüde depolama ve işlemin ayrıştırılmasına (decoupling) dayanır. Amazon S3 uygun maliyetli depolama katmanı olarak hizmet verirken, AWS Glue ve Athena gibi işlem hizmetleri bağımsız olarak ölçeklenir ve yalnızca aktif olduklarında maliyet oluşturur.

Boru Hattı Mimarisi

Tipik veri akışı şu şekildedir:

  1. Ayıklama (Extract): Araç cihazları verileri Kinesis Firehose'a gönderir, o da ham JSON'u bir S3 ham alanına (raw zone) bırakır.
  2. Dönüştürme (Transform): PySpark çalıştıran bir AWS Glue görevi ham verileri işler, iş mantığını uygular ve küratörlü bir S3 alanına Parquet dosyaları olarak çıkarır.
  3. Yükleme ve Sorgulama (Load): Bir Glue Data Catalog tarayıcısı (crawler) verileri kaydeder, Amazon Athena üzerinden sorgulanabilir hale getirir ve bu da panoları besler.

Tüm bu süreç Step Functions ve EventBridge kullanılarak yönetilir (orchestrated), CloudWatch ile izlenir ve IAM aracılığıyla güvence altına alınır.

Verileri PySpark ile Dönüştürmek

Boru hattının çekirdeği AWS Glue PySpark görevidir. Temel mantık, her aracın sinyallerini kronolojik olarak sıralamayı ve her sinyali bir öncekiyle karşılaştırmayı içerir. Bu basit karşılaştırma, önemli içgörüler ortaya çıkarır.

# Her aracın sinyallerini sırala, ardından önceki sinyale bak
w = Window.partitionBy("vehicle_id").orderBy("ts")
enriched = (
    clean
    .withColumn("prev_speed", F.lag("speed_kph").over(w))
    .withColumn("gap_sec", F.col("ts").cast("long") - F.lag("ts").over(w).cast("long"))
    # 10 dakikadan uzun bir boşluktan sonra yeni bir yolculuk başlar
    .withColumn("new_trip",
        F.when(F.col("gap_sec") > 600, 1).otherwise(0))
    # Sert frenleme: hız ~3 saniye içinde >30 km/s düştü
    .withColumn("harsh_brake",
        ((F.col("prev_speed") - F.col("speed_kph") > 30) & (F.col("gap_sec") <= 3)).cast("int"))
)

Bu görev, sinyalleri yolculuklara gruplar, sert frenleme veya hız ihlali olaylarını işaretler, geçersiz okumaları kaldırır ve araç başına günlük bir özet oluşturur. Çıktı, tarihe göre bölümlenmiş (partitioned) Parquet formatında yazılır. Tarih bölümlemesiyle birleştirilen sütunlu sıkıştırma, tek bir günün verisini sorgulamanın hızlı ve uygun maliyetli olmasını sağlar.

Terraform ile Kod Olarak Altyapı

Altyapıyı AWS konsolunda manuel olarak yapılandırmak üretim için ölçeklenebilir değildir. S3 klasörleri (buckets), IAM rolleri, Glue görevleri ve Step Functions gibi kaynakları Terraform'da tanımlayarak üretim disiplinini sağlarsınız.

Kod Olarak Altyapı (IaC) kullanmak aynı zamanda önemli bir maliyet avantajı da sağlar: kullanımda olmadığında tüm yığını (stack) yıkabilir ve gerektiğinde aynı şekilde yeniden oluşturabilirsiniz.

Örneğin, uygun maliyetli bir Glue görevi yapılandırmak şu şekildedir:

resource "aws_glue_job" "etl" {
  name              = "telematics-etl-job"
  role_arn          = aws_iam_role.glue.arn
  glue_version      = "4.0"
  worker_type       = "G.1X"
  number_of_workers = 2          # minimum
  execution_class   = "FLEX"     # en ucuz yürütme modu
  timeout           = 15         # dakika — takılan bir görev fatura kabartamaz
}

Dağıtım, sadece terraform init ve terraform apply komutlarını çalıştırmak kadar basittir.

Maliyet Stratejisi ve Korkuluklar (Guardrails)

Büyük veri boru hatları yanlış yapılandırılırsa pahalı olabilir. Özellikle ücretsiz bir planda bütçe içinde kalmak için sıkı korkuluklar uygulayın:

  • Athena Sorgu Sınırları: Maliyetli yanlışlıkla tüm tablo taramalarını (full-table scans) önlemek için bir bytes_scanned_cutoff_per_query limiti ayarlayın.
  • AWS Bütçeleri: Düşük eşikli bütçe uyarıları yapılandırın.
  • Geçici Altyapı: Test oturumları arasında yığını (stack) yok edin.

Boru Hattını Test Etmek

Boru hattı ile etkileşime girmek için boto3 SDK'sı ile Python kullanabilirsiniz. İş akışı, örnek sinyaller göndermeyi, boru hattını tetiklemeyi ve sonuçları sorgulamayı içerir.

# Alma tarafı — ham alana bir dizi sinyal bırak
client.send_pings(pings, ingest_date="2026-08-05")

# ETL'yi tetikle ve bekle
client.run_pipeline()

# Sunum tarafı — sonuçları Athena ile sorgula
rows = client.get_vehicle_day("VH-0001", "2026-08-05")

Kodunuzun, sabit kodlanmış AWS anahtarları yerine kimlik bilgileri için IAM rollerine dayandığından emin olun.

Sık Karşılaşılan Boru Hattı Zorlukları

Bu mimariyi dağıtırken (deploy), birkaç yaygın engelle karşılaşabilirsiniz:

  1. Tarayıcı (Crawler) Yarış Durumları: Step Functions tarayıcıları asenkron olarak tetikler. Athena'yı hemen sorgularsanız TABLE_NOT_FOUND hatası alabilirsiniz. Bir yeniden deneme mekanizması uygulayın veya tarayıcının READY durumuna ulaşmasını bekleyin.
  2. Athena Sonuç Konumları: Athena, sorgu sonuçlarını depolamak için bir S3 konumu gerektirir. Varsayılan çalışma grubu (workgroup) yerine, Terraform komut dosyanızda tanımlanan doğru yapılandırılmış Athena çalışma grubunu kullandığınızdan emin olun.
  3. Planlanmış Çalıştırmalar: Gecelik bir EventBridge programınız varsa, günlük ücretlerin birikmesini önlemek için aktif olarak test yapmadığınızda bunu devre dışı bırakmayı veya yığını yok etmeyi unutmayın.

Sonuç

Bu mimari zarif bir şekilde ölçeklenir. Veri hacmi arttıkça, Glue görevinize daha fazla Spark işçisi ekler ve yalnızca yeni verileri işlemek için görev yer imlerini (job bookmarks) kullanırsınız. Gerçek bir kurumsal dağıtım, gerçek zamanlı akış yolları (streaming paths) veya otomatik veri kalitesi kontrolleri ekleyebilir, ancak bu temel kalıp (ham JSON ayıklama, PySpark ile dönüştürme ve küratörlü Parquet dosyalarını Athena üzerinden sorgulama) AWS üzerindeki büyük veri iş yükleri için kanıtlanmış bir standart olmaya devam etmektedir.