GCP Dataflow Pipeline'ında Veri Dönüşüm Hataları Çözme
Dataflow pipeline'larında veri dönüşüm sırasında oluşan hatalar üretim ortamında süreci durdurabilir. Hataları yakalamak, loglama yapmak ve sorunlu verileri ayrı kuyruğa yönlendirmek en etkili çözümdür.
Bir CSV dosyasını okuyup JSON'a dönüştüren pipeline'da hata işleme mekanizması ekleyelim. Bazı satırlar hatalı format içerebilir ve bu durumda pipeline çökmemelidir.
1import apache_beam as beam2from apache_beam.options.pipeline_options import PipelineOptions3import json4import logging56class TransformData(beam.DoFn):7def process(self, element):8try:9parts = element.split(',')10if len(parts)!= 3:11raise ValueError(f"Beklenen 3 alan, {len(parts)} bulundu")1213user_id, name, age = parts14age = int(age)1516if age < 0 or age > 150:17raise ValueError(f"Geçersiz yaş: {age}")1819yield {20'user_id': user_id.strip(),21'name': name.strip(),22'age': age23}24except Exception as e:25logging.error(f"Dönüşüm hatası - {element}: {str(e)}")26yield beam.pvalue.TaggedOutput('dead_letter', {27'raw_data': element,28'error': str(e)29})3031def run():32options = PipelineOptions()3334with beam.Pipeline(options=options) as p:35lines = p | 'Oku' >> beam.io.ReadFromText('gs://bucket/input.csv')3637results = (lines 38| 'Dönüştür' >> beam.ParDo(TransformData()).with_outputs(39'dead_letter', main='main'))4041(results['main'] 42| 'JSON Yaz' >> beam.Map(lambda x: json.dumps(x))43| 'Başarılı Yaz' >> beam.io.WriteToText('gs://bucket/output.json'))4445(results['dead_letter']46| 'Hata Yaz' >> beam.Map(lambda x: json.dumps(x))47| 'Hata Dosyası' >> beam.io.WriteToText('gs://bucket/errors.json'))4849if __name__ == '__main__':50run()Çalıştırma:
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1python pipeline.py --runner DataflowRunner --project PROJECT_ID --temp_location gs://bucket/tempBeklenen çıktı: Başarılı satırlar `output.json`'a, hatalı satırlar `errors.json`'a yazılır. Pipeline hiçbir hatada durmaz.
Sık yapılan hata: `beam.pvalue.TaggedOutput` kullanmadan hataları `yield` etmeye çalışmak. Bu durumda pipeline çöker. Ayrıca logging seviyesini `DEBUG` olarak ayarlamak production'da kaynak tüketimini artırır; `ERROR` seviyesi yeterlidir.
0 yorum