Veri Mühendisliğinde Cron İşleri: Veri Hatları Nasıl Zamanlanır
Veri mühendisliğinde cron işlerini nasıl kullanacağınızı öğrenin—tekrarlayan görevleri otomatikleştirmek, güvenilirliği artırmak ve iş akışlarını optimize etmek için ideal.
Sık sık yinelenen görevleri elle yönetiyorsanız, bunun yalnızca zahmetli olmadığını bilirsiniz — kaçırılan son teslim tarihlerine ve tutarsız veri boru hatlarına davetiye çıkarır.
Cron işleri, Unix tabanlı sistemlerde tekrarlayan görevleri otomatikleştirmek için başvurulan bir çözümdür. Belirli aralıklarla çalışacak komutları veya betikleri zamanlamanıza olanak tanır. Cron'un basit ve esnek zamanlama sisteminden yararlanarak, temel veri toplamadan aksi takdirde sürekli manuel müdahale gerektirecek karmaşık ETL iş akışlarına kadar her şeyi otomatikleştirebilirsiniz. Bu otomatik süreçleri kurmak, insan hatasını ortadan kaldırır ve veri boru hatlarınızın tutarlı ve güvenilir şekilde çalışmasını sağlar.
Cron işlerini ustalıkla kullanmak, Unix ortamlarında çalışan her veri mühendisliği profesyoneli için kritik öneme sahiptir. Otomatik görevleri zamanlama ve yönetme becerisi, iş akışınızı katbekat iyileştirir ve bakım yükünü azaltır.
Bu kapsamlı kılavuzda, veri mühendisliği için cron işleri hakkında bilmeniz gereken her şeyi — temel kurulumdan gelişmiş kullanım örneklerine ve en iyi uygulamalara kadar — adım adım anlatacağım.
Cron işi, Unix işletim sistemlerinde komutları belirli zamanlarda, tarihlerde veya aralıklarda otomatik olarak çalıştırmanıza olanak tanıyan zaman tabanlı bir zamanlayıcıdır.
Cron'u, görevleri tam olarak istediğiniz zamanda, manuel müdahale olmadan çalıştıran kişisel asistanınız gibi düşünün. Veri mühendisleri için bu; veritabanı yedeklerini, veri transferlerini, rapor üretimini ve daha fazlasını otomatikleştirebileceğiniz anlamına gelir.
Cron işleri, "crontab" (cron tablosu) adı verilen basit bir metin dosyasında yer alır. Bu dosyadaki her satır, belirli bir formata sahip altı bileşenden oluşan zamanlanmış bir görevi temsil eder:
* * * * * command-to-execute
│ │ │ │ │
│ │ │ │ └─── Day of week (0-6, where 0 is Sunday)
│ │ │ └───── Month (1-12)
│ │ └─────── Day of month (1-31)
│ └───────── Hour (0-23)
└─────────── Minute (0-59)Altyapı:
İlk beş alan, cron'a komutunuzu tam olarak ne zaman çalıştıracağını söyler. Belirli değerleri, aralıkları (ör. 1-5), listeleri (ör. 1, 3, 5) veya her zaman birimini ifade eden yıldız işaretlerini (*) kullanabilirsiniz. Altıncı bileşen ise çalıştırmak istediğiniz asıl komuttur.
Örneğin, her gün gece yarısında bir Python betiğini çalıştırarak bir API'den veri çıkarmak isterseniz, cron işiniz şöyle görünür:
Bu, cron'a betiğinizi 0. dakikada, 0. saatte (gece yarısı), ayın her günü, her ay ve haftanın her günü çalıştırmasını söyler. Hem Python yorumlayıcısının hem de betiğinizin mutlak yolunu kullanmak, ortamdan bağımsız olarak işin doğru çalışmasını sağlar.
Daha karmaşık zamanlamalar da oluşturabilirsiniz. Diyelim ki veritabanı temizliğini Pazartesi, Çarşamba ve Cuma günleri saat 15:30'da çalıştırmak istiyorsunuz; cron ifadeniz şöyle olur:
Her yıldız işareti bir joker karakter görevi görür ve tam ihtiyaçlarınıza uyan esnek zamanlamalar oluşturmanızı sağlar. Yaygın zamanlama kalıplarını daha okunur kılmak için @daily, @weekly veya @monthly gibi özel kısayolları da kullanabilirsiniz.
Temeller bu kadar. Sırada, veri mühendisliği görevleri için cron işleriyle pratik olarak nasıl çalışacağınızı göstereceğim.
Veri Mühendisliği Görevleri için Cron İşi Kurulumu
Artık cron işlerinin ne olduğunu anladığınıza göre, ilk otomatik görevinizi oluşturalım. Süreç basittir ve başlamak için sadece birkaç komut gerektirir.
crontab dosyasını düzenleme
Cron işleri oluşturmak veya değiştirmek için crontab dosyanıza erişmeniz gerekir. Bunu crontab -e komutuyla yapabilirsiniz:
Yukarıdaki komut, zamanlanmış görevleri ekleyebileceğiniz, düzenleyebileceğiniz veya kaldırabileceğiniz vi metin düzenleyicisini açar.
Crontab dosyanız, daha önce hiç kullanmadıysanız boş olabilir. Yeni bir cron işi eklemek için, daha önce açıkladığım cron sözdizimini izleyen yeni bir satır eklemeniz yeterlidir. Her satır hem zamanlama hem de çalıştırılacak komutu içermelidir.
Örneğin, bir betiği her gün saat 03:00'te çalıştırmak için şu satırı ekleyin:
Dosyayı kaydedip düzenleyiciden çıkın. Cron, yeni crontab'ınızı otomatik olarak yükler ve işleri belirtilen zamanlarda çalıştırmaya başlar.
Basit bir veri mühendisliği görevinin zamanlanması
Pratik bir örnekle başlayalım: bir Python betiğini bir API'den veri çekmek üzere her dakika çalışacak şekilde zamanlamak. Aşağıda, bir REST API uç noktasına bağlanan, nesne verilerini alan ve bir CSV dosyasına kaydeden eksiksiz bir Python betiği yer alıyor — sadece Python yorumlayıcınızda requests ve pandas paketlerinin kurulu olduğundan emin olun:
# fetch_api_data.pyimport requests
import pandas as pd
import os
from datetime import datetime
# Create a timestamp for the filename
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")# Set file paths - CHANGE THIS
data_dir ="/Users/dradecic/Desktop/cron/data"
output_file =f"{data_dir}/objects_{timestamp}.csv"# Make sure the data directory exists
os.makedirs(data_dir, exist_ok=True)# Fetch data from the APItry:
response = requests.get("https://jsonplaceholder.typicode.com/posts")if response.status_code ==200:
data = response.json()# Check if we have dataif data:
df = pd.DataFrame([{"id": row.get("id",""),"user_id": row.get("userId",""),"title": row.get("title",""),"body": row.get("body","")}for row in data
])
df.to_csv(output_file, index=False)print(f"Data successfully saved to {output_file}")else:print("API returned empty data")else:print(f"API request failed with status code: {response.status_code}")except Exception as e:print(f"Error occurred: {str(e)}")Altyapı:
Şimdi bu betiği cron ile her gün saat 02:00'de çalışacak şekilde zamanlamak için:
Bu satır, Python betiğinizi her günün her dakikasında çalıştırmasını cron'a söyler. Hem Python yorumlayıcısı (/Users/dradecic/miniforge3/bin/python benim durumumda) hem de betiğiniz (/Users/dradecic/Desktop/cron/fetch_api_data.py benim durumumda) için mutlak yollar kullandığınızdan emin olun.
Neden mutlak yollar? Cron sınırlı bir ortamla çalışır; bu nedenle kabuğunuzun PATH değişkenini veya mevcut dizininizi bilmez. Mutlak yollar olmadan, cron kullanmak istediğiniz komutları veya dosyaları bulamadığı için işiniz başarısız olabilir.
Siz bunu okurken, data klasörüme birkaç CSV dosyası kaydedildi; bu da cron işinin beklendiği gibi çalıştığını gösteriyor:
Görsel 3 - Kaydedilen CSV dosyaları
ETL görevlerini zamanlama
Daha karmaşık veri mühendisliği iş akışları örneğin ETL (Extract, Transform, Load) işleri için, çok adımlı süreçleri zamanlamak amacıyla cron'u kullanabilirsiniz. Yaygın bir yaklaşım, tüm ETL adımlarınızı içeren bir kabuk betiği oluşturmak ve ardından bu betiği cron ile zamanlamaktır.
Basitlik adına, aşağıdaki .sh betiğinde göreceğiniz kod yalnızca teoriktir ve herhangi bir veri kaynağına bağlanmaz:
#!/bin/bash# etl_pipeline.sh# Extract data from source
/usr/bin/psql -U username -d source_db -c"COPY (SELECT * FROM source_table) TO '/tmp/extracted_data.csv' WITH CSV HEADER;"# Transform data
/usr/bin/python3 /home/username/scripts/transform_data.py
# Load data into target
/usr/bin/psql -U username -d target_db -c"\COPY target_table FROM '/tmp/transformed_data.csv' WITH CSV HEADER;"# Log completionecho"ETL job completed at $(date)">> /home/username/logs/etl_job.logAltyapı:
Bu kısmı hallettikten sonra, kabuk betiğinizi çalıştırılabilir hale getirmek isteyeceksiniz:
Bir veri mühendisiyseniz, ETL görevlerini cron ile zamanlamanın şu avantajları vardır:
Karmaşık iş akışlarını okunabilir bir betikte tutabilirsiniz.
Betik hata yakalama ve günlükleme (logging) içerebilir.
Betik dosyasını doğrudan çalıştırarak ETL sürecinizi manuel olarak test edebilirsiniz.
Crontab temiz ve basit kalır.
Daha büyük ETL süreçleri için betiklerinize hata yönetimi eklemek isteyebilirsiniz:
#!/bin/bash# etl_pipeline.sh# Set error handlingset-e# Exit immediately if any command fails# Execute ETL steps# ...# If we get here, all steps succeededecho"ETL job completed successfully at $(date)">> /home/username/logs/etl_job.logAltyapı:
Ve hepsi bu! ETL boru hattınız planlanan zamanlarda otomatik olarak çalışır, verilerinizi işler ve izleme amaçlı durumunu günlüklere yazar.
Cron İşlerini Yönetme ve İzleme
Cron işlerini kurduktan sonra, beklendiği gibi çalıştıklarından emin olmak için bunları yönetmeniz ve izlemeniz gerekir.
Bundan kastım; şu anda hangi işlerin zamanlandığını kontrol etmek, eski işleri kaldırmak ve yürütmelerini izlemektir. Bu bölümde, cron işlerinizi zahmetsizce sürdürmek için temel komut ve teknikleri göreceksiniz.
Mevcut cron işlerini görüntüleme
Şu anda zamanlanmış tüm cron işlerinizi görmek için crontab -l komutunu kullanın:
Bu komut, zamanlamaları ve komutları dâhil olmak üzere tüm zamanlanmış işleri gösteren mevcut crontab dosyanızın içeriğini görüntüler. Düzenleme moduna girmeden hangi işlerin etkin olduğunu hızlıca doğrulamanın bir yoludur.
Önceki bölümü takip ettiyseniz, çıktınız aşağıdakine benzeyecektir:
Görsel 4 - Etkin cron işleri
Başka bir kullanıcının cron işlerini kontrol etmeniz gerekirse (root erişimi gerekir), bunun yerine şu komutu çalıştırın:
Artık ihtiyaç olmadığında cron işlerini kaldırmanın veya devre dışı bırakmanın birden fazla yolu vardır. Belirli bir işi kaldırmak için crontab'ınızı düzenleme modunda açın ve ilgili satırı silin:
Bu komutu dikkatli kullanın — hiçbir onay istemi olmadan tüm zamanlanmış işlerinizi kaldırır. Yanlışlıkla silmeyi önlemek için önce crontab'ınızın yedeğini alabilirsiniz:
Varsayılan olarak cron, işlerin çıktısını crontab'ın sahibi olan kullanıcıya e-postayla göndermeye çalışır. Ancak bunun için düzgün yapılandırılmış bir posta sistemi gerekir ve bu her zaman mevcut olmayabilir. Bunun yerine, daha kolay takip ve sorun giderme için çıktıyı günlük dosyalarına yönlendirebilirsiniz.
Hem standart çıktıyı hem de hata mesajlarını yakalamak için şu yönlendirme söz dizimini kullanın:
Arıza durumunda bildirim gerektiren kritik işler için e-posta uyarıları kurabilirsiniz. Sisteminizde bir posta aktarım aracısı (ör. postfix veya sendmail) kurulu olduğunu varsayarsak, iş yalnızca başarısız olursa e-posta gönderecek şekilde cron işinizi değiştirebilirsiniz:
Daha gelişmiş izleme araçlarısını, örneğin Node Exporter ile Prometheus veya adaha adanmış cron izleme servislerini kullanabilirsiniz; ancak bu basit günlükleme ve e-posta teknikleri, çoğu veri mühendisliği ihtiyacı için etkili bir izleme sağlar.
Veri Mühendisliğinde İleri Düzey Cron İşi Kullanım Senaryoları
Şimdiye kadar, günlükleri ve hataları yakalamak için temel cron komutlarını ve kalıplarını öğrendiniz. Başlamak için iyidir, ancak üretim senaryolarında daha gelişmiş komutları ve konteyner teknolojileriyle entegrasyonu keşfetmek isteyeceksiniz.
Bu bölümde, daha sofistike veri mühendisliği iş akışları için cron işi uygulamanızı nasıl bir üst seviyeye taşıyacağınızı göreceksiniz.
Birden çok komutla cron işleri çalıştırma
Ayrı kabuk betiklerine gerek kalmadan, tek bir cron işinde birden çok komutu zincirleyerek karmaşık iş akışları oluşturabilirsiniz.
Komutları birleştirmenin birkaç yolu vardır.
Önceki komutların başarı durumundan bağımsız olarak komutları ardışık çalıştırmak için noktalı virgül kullanabilirsiniz:
Bu yaklaşım, daha basit çok adımlı iş akışları için iyi çalışır. Ancak çok sayıda adım, koşullu mantık veya hata yönetimi içeren çok karmaşık boru hatları için özel bir kabuk betiği hâlâ daha iyi bir seçenektir.
Docker ile cron işleri
Docker konteynerleri, modern veri mühendisliği yığınlarının vazgeçilmez bir parçası haline geldi. Zamanlanmış görevlerinizin tutarlı ve izole ortamlarda çalışmasını sağlamak için cron'u Docker ile çeşitli güçlü şekillerde entegre edebilirsiniz.
Göstermek için, fetch_api_data.py betiğini biraz değiştirerek veri alma ve günlükler için ayrılmış dizinler kullanacağım ve betiğin bir konteyner ortamında çalışabilmesi için yolları güncelleyeceğim:
# fetch_api_data.pyimport requests
import pandas as pd
import os
import uuid
from datetime import datetime
# Set file paths
data_dir ="/app/data"
log_dir ="/app/logs"
output_file =f"{data_dir}/objects_{str(uuid.uuid4())}.csv"# Make sure the data directory exists
os.makedirs(data_dir, exist_ok=True)
os.makedirs(log_dir, exist_ok=True)deflog_message(message):print(f"{datetime.now().isoformat()}: {message}")# Fetch data from the APItry:
log_message("Starting API data fetch")
response = requests.get("https://jsonplaceholder.typicode.com/posts")if response.status_code ==200:
data = response.json()# Check if we have dataif data:
df = pd.DataFrame([{"id": row.get("id",""),"user_id": row.get("userId",""),"title": row.get("title",""),"body": row.get("body",""),}for row in data
])
df.to_csv(output_file, index=False)
log_message(f"Data successfully saved to {output_file}")else:
log_message("API returned empty data")else:
log_message(f"API request failed with status code: {response.status_code}")except Exception as e:
log_message(f"Error occurred: {str(e)}")Altyapı:
Yani hem alınan veriler hem de günlükler /app/runs klasörüne kaydedilecek.
Sıradaki adım, Docker'a konteynerin nasıl oluşturulacağını ve çalıştırılacağını anlatan tek bir dosya olan bir Dockerfile oluşturmaktır:
Neredeyse hazırız. Şimdi imajı oluşturmak ve Docker konteynerini çalıştırmak için aşağıdaki komutu çalıştırabilirsiniz
docker build --no-cache -t api-cron-job .&&\docker run --rm--name api-fetcher api-cron-jobAltyapı:
Konteynere bağlanırsanız, Python betiğinin her dakika çalıştırıldığını görürsünüz:
Görsel 11 - Docker konteynerinde çalışan cron işi
Diğer yandan, bir veri mühendisliği boru hattını bir Docker konteynerinde kron zamanlamasıyla çalıştırmanın bir yolunu arıyorsanız, fetch_api_data.py betiğini değiştirmeden bırakın ancak Dockerfile'ı düzenleyin:
# Use Python 3.12 slim as base imageFROM python:3.12-slim# Install required Python packagesRUN pip install --no-cache-dir requests pandas# Set working directoryWORKDIR /app# Copy the script into the containerCOPY fetch_api_data.py /app/# Set execution permissionsRUN chmod +x /app/fetch_api_data.py# Run the scriptCMD ["/usr/local/bin/python", "/app/fetch_api_data.py"]Altyapı:
Ardından sisteminizdeki crontab dosyasına şunları ekleyin:
*/2 * * * * cd /path/to/root/project/folder &&docker build --no-cache -t api-cron-job .&&docker run --rm--name api-fetcher api-cron-jobAltyapı:
Bu, container'ı her 2 dakikada bir oluşturup çalıştıracaktır.
Cron işlerini uzak sunucularda çalıştırma
Dağıtık veri mühendisliği iş akışlarında, süreçleri uzak sunucularda yürütmeniz sıkça gerekir. Cron işleri, SSH kullanarak bu uzak işlemleri tetikleyebilir.
Örneğin, uzak bir sunucuda bir cron işini çalıştırmak için şu komutu kullanabilirsiniz:
Daha karmaşık uzak işlemler için SSH'i kabuk betikleriyle birleştirebilirsiniz:
#!/bin/bash# remote_etl.sh# Run extraction on the data source serverssh username@source-server 'python3 /path/to/extract.py'# Transfer the extracted data to the processing serverscp username@source-server:/path/to/extracted_data.csv /local/temp/
# Run transformation locally
python3 /path/to/transform.py
# Transfer the transformed data to the warehouse serverscp /local/temp/transformed_data.csv username@warehouse-server:/path/to/data/
# Trigger the load process on the warehouse serverssh username@warehouse-server 'python3 /path/to/load.py'Altyapı:
Bu yaklaşım, çok sunuculu veri boru hatlarını doğrudan cron işlerinden orkestre etmenize olanak tanır. İşe yarar, ancak çok karmaşık dağıtık iş akışları için özel orkestrasyon araçlarını, örneğin Apache Airflow veya Prefect'i düşünebilirsiniz.
Veri Mühendisliği için Cron İşi En İyi Uygulamaları
En iyi tasarlanmış cron işleri bile doğru operasyonel uygulamalarla hayata geçirilmezse başarısız olabilir veya sorunlara yol açabilir.
Bir veri mühendisi olarak, zamanlanmış görevlerinizin güvenilir şekilde çalışmasını, hatalarda zarifçe toparlanmasını ve sorun giderme için yeterli görünürlük sağlamasını temin etmeniz gerekir. Bu bölümde bunu nasıl yapacağınızı göstereceğim.
Doğru günlükleme ayarlayın
Günlükleme, doğrudan gözetim olmadan çalışan otomatik süreçler için kritik öneme sahiptir. Onlar olmadan, cron işleriyle ilgili sorunları teşhis etmek neredeyse imkansız hale gelir.
Temel günlükleme kurmak için, hem standart çıktıyı hem de hata mesajlarını günlük dosyalarına yönlendirebilirsiniz:
Görsel 12 - Cron işi günlükleme yapılandırması (1)
Bu komut, betiğinizi her dakika çalıştırır ve tüm çıktıyı bir günlük dosyasının sonuna ekler. >> işleci çıktıyı üzerine yazmak yerine eklerken, 2>&1 hem standart hatayı (dosya tanımlayıcı 2) hem de standart çıktıyı (dosya tanımlayıcı 1) aynı günlük dosyasına yönlendirir.
Daha yapısal günlükleme için zaman damgaları ve iş tanımlayıcıları ekleyebilirsiniz:
* * * * * (echo "=== Job started at $(date) ==="; /Users/dradecic/miniforge3/bin/python /Users/dradecic/Desktop/cron/fetch_api_data.py;echo"=== Job finished at $(date) with exit code $? ===")>> /Users/dradecic/Desktop/cron/logs/script.log 2>&1Altyapı:
Görsel 13 - Cron işi günlükleme yapılandırması (2)
Bu geliştirilmiş komut, betiğinizi çalıştırmadan önce zaman damgalı net bir başlangıç işareti ve tamamlandıktan sonra hem zaman damgası hem de çıkış kodu içeren bir bitiş işareti ekler. Parantezler bu komutları bir arada gruplar, böylece tüm çıktı günlük dosyasına yönlendirilir. $? değişkeni en son çalıştırılan komutun çıkış kodunu içerir; bu da betiğin başarılı olup olmadığını (çıkış kodu 0) veya başarısız olup olmadığını (sıfırdan farklı çıkış kodu) belirlemenize yardımcı olur.
Günlüklerin aşırı disk alanı tüketmesini önlemek için günlük döndürme uygulayabilirsiniz. Çoğu Linux dağıtımında bulunan logrotate aracını kullanın:
/etc/logrotate.d/cron-jobs konumunda bir yapılandırma dosyası oluşturun:
Günlük dosyaları eksikse hata raporlamasını atla (missingok)
Silmeden önce günlükleri 14 gün sakla (rotate 14)
Alan kazanmak için eski günlükleri sıkıştır (compress)
Önceki günün günlüğünü sıkıştırmayı ikinci güne ertele (delaycompress)
Günlük dosyası boşsa döndürmeyi atla (notifempty)
Yeni günlük dosyalarını belirli izinler ve sahiplikle oluştur (create 0640 username groupname)
Sistemin logrotate servisi bu ayarları otomatik olarak uygular ve genellikle günde bir kez çalışır. Çalıştığında mevcut günlük dosyanızın adını değiştirir (tarih soneki ekleyerek), daha eski günlükleri sıkıştırır, 14 günden eski günlükleri siler ve yeni kayıtlar için taze bir günlük dosyası oluşturur.
Hataları ve yeniden denemeleri yönetin
Sağlam veri mühendisliği iş akışları, hataları ele almak için stratejilere ihtiyaç duyar. Betiklerinize veya cron işlerinize yeniden deneme mantığı entegre edebilir ya da cron işlerinizi izleme sistemlerine bağlayabilirsiniz.
Bu bölümde bu seçeneklerin tümünü nasıl uygulayacağınızı göstereceğim.
Yerleşik yeniden deneme mantığı doğrudan Python betiklerinize aşağıdaki gibi uygulanabilir:
import time
import random
deffetch_data_with_retry(max_attempts=3, backoff_factor=1.5):
attempt =1while attempt <= max_attempts:try:# Try to fetch datareturn fetch_data()except Exception as e:print(f"Attempt {attempt} failed: {str(e)}")# Calculate backoff time with jitter
backoff_time = backoff_factor **(attempt -1)*(random.uniform(0.8,1.2))if attempt < max_attempts:print(f"Retrying in {backoff_time:.2f} seconds...")
time.sleep(backoff_time)else:print("Max retry attempts reached. Giving up.")raise
attempt +=1Altyapı:
Bu Python fonksiyonu, jitter ile üstel geri çekilme stratejisi uygular. Nasıl çalıştığına bakalım:
Veri getirme işlemini en fazla max_attempts kez (varsayılan 3) yürütmeyi dener.
İşlem başarısız olursa, yeniden denemeden önce bir bekleme süresi hesaplar.
Bekleme süresi her denemede üstel olarak artar (geri çekilme katsayısı, (deneme-1) üstü).
Rastgele jitter (hesaplanan sürenin %80–%120'si), birden fazla yeniden deneme sürecinin senkronize yük artışları oluşturmasını önler.
Maksimum deneme sayısından sonra vazgeçer ve istisnayı yeniden yükseltir.
Bu desen, ağ sorunları veya API hız sınırları gibi geçici hataları ele almak için idealdir. Bekleme süresinin üstel olarak artması, harici sistemin toparlanmasına zaman tanırken jitter "ani yüklenme" sorunlarını önler.
Cron tabanlı yeniden denemeler de geçerli bir seçenektir. Başarısız işleri, ihtiyaç duyulandan daha sık zamanlayarak yeniden deneyebilirsiniz.
Aşağıda iki cron işi kurduğum bir örnek yer alıyor:
Python betiğini her 10 dakikada bir çalıştırır. Görev başarıyla biterse, betiğin 10 dakika içinde tekrar çalışmasını engelleyen bir success_flag dosyası oluşturulur.
Her gün gece yarısında bir kez çalışarak başarı işareti dosyasını kaldırır ve böylece ilk işin ertesi gün yeniden çalışmasına izin verir.
Betiğin çalışması başarılı olursa başarı işareti dosyasını oluşturur (touch /path/to/success_flag)
İkinci iş gece yarısında (0 0 * * *) çalışır ve başarı işaretini kaldırır; böylece sürecin ertesi gün tekrar çalışmasına izin verir.
Bu teknik, günde bir kez tamamlanması gereken ancak geçici olarak başarısız olabilen görevler için kullanışlıdır. İş, gün boyunca başarıya ulaşana kadar denemeye devam eder.
İzleme entegrasyonu cron işlerinizi Prometheus gibi izleme sistemlerine bağlamanıza imkan tanır. Bu başlı başına bir konudur, bu yüzden burada yalnızca üst düzey bir genel bakış sunacağım.
Aşağıda göreceğiniz betik, gerçek işinizin etrafına sarılan ve Prometheus’a metrik toplayıp raporlayan bir sarmalayıcıdır. Betiğin yaptığı adımlar şunlardır:
İşin başlangıç zamanını kaydeder.
Asıl iş betiğinizi çalıştırır.
Çıkış kodunu yakalar (başarı için 0, başarısızlık için sıfırdan farklı).
İşin çalışmasının ne kadar sürdüğünü hesaplar.
Prometheus’un Pushgateway servisine üç metrik gönderir: saniye cinsinden süre, çıkış kodu ve tamamlanma zaman damgası.
Gerçek işle aynı çıkış koduyla çıkar.
#!/bin/bash# monitored_job.sh# Define pushgateway URLPUSHGATEWAY="http://prometheus-pushgateway:9091"# Start time in secondsSTART_TIME=$(date +%s)# Run the actual job
/path/to/actual_job.sh
EXIT_CODE=$?# End time in secondsEND_TIME=$(date +%s)DURATION=$((END_TIME - START_TIME))# Push metrics to Prometheuscat<<EOF|curl --data-binary @- ${PUSHGATEWAY}/metrics/job/cron_job/instance/$(hostname)
# HELP cron_job_duration_seconds How long the cron job took to execute
# TYPE cron_job_duration_seconds gauge
cron_job_duration_seconds{name="data_extraction"} ${DURATION}
# HELP cron_job_exit_code Exit code of the cron job
# TYPE cron_job_exit_code gauge
cron_job_exit_code{name="data_extraction"} ${EXIT_CODE}
# HELP cron_job_last_run_timestamp Timestamp of last job run
# TYPE cron_job_last_run_timestamp gauge
cron_job_last_run_timestamp{name="data_extraction"} ${END_TIME}
EOFexit${EXIT_CODE}Altyapı:
Bu metrikler şunları yapmanızı sağlar:
İş başarısızlıkları (sıfırdan farklı çıkış kodları) için uyarılar ayarlamak.
Performans sorunları için iş süresi eğilimlerini izlemek.
İş yürütmesini doğrulamak ve son başarılı çalışmayı izlemek.
Planlanmış tüm işlerinizin sağlığını gösteren panolar oluşturmak.
Pushgateway bir ara katman olarak görev yapar; kısa ömürlü cron işinin metriklerini Prometheus’a iletmesine olanak tanır; Prometheus da bunları uyarı ve görselleştirme için saklar.
Saat dilimi hususları
Saat dilimi sorunları, özellikle küresel veri kaynakları veya dağıtık sistemlerle çalışırken, veri mühendisliğinde sık karşılaşılan zorluklardır.
Bekleneceği üzere, cron işleri saat dilimi ayarlarına duyarlıdır.
Varsayılan olarak, cron sistemin yerel saat dilimini kullanır. Sisteminizin saat dilimini şu Linux komutuyla kontrol edebilirsiniz:
Yukarıdaki komut, sisteminizin mevcut saat ve saat dilimi yapılandırmasını gösterir. Sunucunuz America/New_York gibi yerel bir saat dilimini kullanacak şekilde yapılandırılmışsa tüm cron zamanlamaları o saat diliminde yorumlanır.
Sunucu konumundan veya yaz saati uygulaması değişikliklerinden bağımsız olarak tutarlı zamanlama sağlamak için cron işlerinizde UTC kullanın:
# Set the CRON_TZ environment variable at the top of your crontabCRON_TZ=UTC
# Now all job schedules will use UTC00 * * * /path/to/daily_job.shAltyapı:
Crontab dosyanızın en üstüne CRON_TZ=UTC satırını ekleyerek, cron’a tüm zaman belirtimlerini yerel saat yerine UTC olarak yorumlamasını söylersiniz.
Bu, işin sunucunun yerel saat diliminden veya yaz saati uygulamasından bağımsız olarak her gün UTC’ye göre gece yarısında çalışacağı anlamına gelir. UTC (Eşgüdümlü Evrensel Zaman) yaz saati uygulaması için değişmez ve tüm konumlar arasında tutarlı bir referans noktası sağlar.
Veri Mühendisleri için Cron İşi Rehberinin Özeti
Bir veri mühendisiyseniz, cron işleri paha biçilmez bir araçtır.
Tekrarlayan görevleri otomatikleştirmenize ve güvenilir veri hatları oluşturmanıza yardımcı olabilirler. Betikleri zamanlamak ve çok adımlı ETL süreçlerinin karmaşık orkestrasyonunu gerçekleştirmek için tutarlı ve güçlü bir yol sunarlar. Sözdizimine alışmak biraz zaman alır ama birkaç gün içinde ikinci doğanız haline gelecektir.
Cron işlerini veri mühendisliği çalışmalarınıza uygularken, günlükleme, hata yönetimi ve saat dilimi yönetimine ilişkin en iyi uygulamaları takip etmeyi unutmayın. Doğru günlükleme, iş yürütmesine görünürlük sağlar ve sorun gidermeyi kolaylaştırır. Yeniden deneme mekanizmaları içeren iyi hata yönetimi teknikleri, hatlarınızın geçici hatalardan kurtulmasını sağlar. Dikkatli saat dilimi yönetimi, özellikle küresel veri kaynakları veya dağıtık ekiplerle çalışırken zamanlamalarınızı tutarlı kılar.
Elbette, özelleşmiş iş akışı orkestrasyon araçları olan Apache Airflow veya Prefect, karmaşık veri hatları için daha gelişmiş özellikler sunar; ancak cron, birçok veri mühendisliği görevi için hâlâ geçerliliğini korur. Kullanımı basit, güvenilir ve düşük ek yük gerektirir—tüm bunlar onu otomasyon ihtiyaçları için ideal kılar.
Veri mühendisliği hakkında daha fazlasını öğrenmek için DataCamp’in şu kurslarına kaydolun:
Cron işi nedir ve veri mühendisleri için neden kullanışlıdır?⌄
Cron işi, Unix işletim sistemlerinde belirlenen zamanlarda, tarihlerde veya aralıklarda komutları otomatik olarak çalıştıran zamana dayalı bir zamanlayıcıdır. Veri mühendisleri, veri çıkarma, veritabanı yedekleme, rapor oluşturma ve ETL iş akışları gibi tekrarlayan görevleri otomatikleştirerek tutarlılık ve güvenilirlik sağladığı ve manuel müdahaleyi azalttığı için cron işlerini özellikle faydalı bulurlar.
Bir cron işinin ne zaman çalışacağını nasıl belirtirim?⌄
Cron işleri, işin ne zaman çalışacağını belirleyen beş zaman alanına sahip belirli bir sözdizimi kullanır: dakika (0-59), saat (0-23), ayın günü (1-31), ay (1-12) ve haftanın günü (0-6, 0 Pazar). Her zaman birimi için belirli değerler, aralıklar (1-5), listeler (1,3,5) veya yıldız işareti (*) ile "her" anlamını kullanabilirsiniz. Örneğin, 0 2 * * * her gün saat 02:00’de bir işi çalıştırır.
Cron işi çıktısını günlüklerken bazı en iyi uygulamalar nelerdir?⌄
Cron işi günlüklemesi için en iyi uygulamalar arasında şunlar yer alır: >> ve 2>&1 işleçlerini kullanarak standart çıktı ve hata mesajlarını günlük dosyalarına yönlendirmek, günlük girdilerine zaman damgası eklemek, aşırı disk alanı kullanımını önlemek için günlük döndürme uygulamak ve sorun gidermeyi kolaylaştırmak için günlükleri yapılandırmak. Kritik işler için, hatalar durumunda e-posta bildirimleri kurmak da isteyebilirsiniz.
Cron işlerinde hataları ve yeniden denemeleri nasıl yönetebilirim?⌄
Cron işlerinde hataları çeşitli yaklaşımlarla ele alabilirsiniz: üstel geri çekilme gibi teknikler kullanarak doğrudan betiklerinizde yeniden deneme mantığı uygulamak, başarı işaretlerini kontrol ederek başarısız işleri cron ile yeniden denemek, Prometheus gibi izleme sistemleriyle entegre olarak iş durumunu takip etmek veya hata ayıklama için başarısız girdileri koruyan bir "ölü mektup" desenini uygulamak.
Docker konteynerleri cron işleriyle nasıl çalışır?⌄
Docker konteynerleri cron işleriyle iki ana şekilde entegre edilebilir: uygulamanızla birlikte bir Docker konteyneri içinde cron çalıştırmak (zamanlanmış görevleri çalışma ortamıyla paketlemek için kullanışlıdır) veya ana sistemin cron’unu kullanarak Docker konteynerlerini belirli zamanlarda çalışacak şekilde zamanlamak. Bu yaklaşım, zamanlanmış görevleriniz için tutarlılık ve izolasyon sağlar; böylece farklı ortamlarda daha taşınabilir ve bakımı kolay hale gelirler.
Hırvatistan merkezli Kıdemli Veri Bilimci. 700’ün üzerinde yayımlanmış makaleyle 10 M+ görüntüleme elde eden, önde gelen bir teknoloji yazarı. TPOT ile Makine Öğrenimi Otomasyonu kitabının yazarı.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Sık sık yinelenen görevleri elle yönetiyorsanız, bunun yalnızca zahmetli olmadığını bilirsiniz — kaçırılan son teslim tarihlerine ve tutarsız veri boru hatlarına davetiye çıkarır.
Cron işleri, Unix tabanlı sistemlerde tekrarlayan görevleri otomatikleştirmek için başvurulan bir çözümdür. Belirli aralıklarla çalışacak komutları veya betikleri zamanlamanıza olanak tanır. Cron'un basit ve esnek zamanlama sisteminden yararlanarak, temel veri toplamadan aksi takdirde sürekli manuel müdahale gerektirecek karmaşık ETL iş akışlarına kadar her şeyi otomatikleştirebilirsiniz. Bu otomatik süreçleri kurmak, insan hatasını ortadan kaldırır ve veri boru hatlarınızın tutarlı ve güvenilir şekilde çalışmasını sağlar.
Cron işlerini ustalıkla kullanmak, Unix ortamlarında çalışan her veri mühendisliği profesyoneli için kritik öneme sahiptir. Otomatik görevleri zamanlama ve yönetme becerisi, iş akışınızı katbekat iyileştirir ve bakım yükünü azaltır.
Bu kapsamlı kılavuzda, veri mühendisliği için cron işleri hakkında bilmeniz gereken her şeyi — temel kurulumdan gelişmiş kullanım örneklerine ve en iyi uygulamalara kadar — adım adım anlatacağım.
>Veri Mühendisliğine tamamen yabancı mısınız? Kursumuz terimleri sadeleştirip kavramları açıklar.
Cron İşi Nedir?
Cron işi, Unix işletim sistemlerinde komutları belirli zamanlarda, tarihlerde veya aralıklarda otomatik olarak çalıştırmanıza olanak tanıyan zaman tabanlı bir zamanlayıcıdır.
Cron'u, görevleri tam olarak istediğiniz zamanda, manuel müdahale olmadan çalıştıran kişisel asistanınız gibi düşünün. Veri mühendisleri için bu; veritabanı yedeklerini, veri transferlerini, rapor üretimini ve daha fazlasını otomatikleştirebileceğiniz anlamına gelir.
Cron işleri, "crontab" (cron tablosu) adı verilen basit bir metin dosyasında yer alır. Bu dosyadaki her satır, belirli bir formata sahip altı bileşenden oluşan zamanlanmış bir görevi temsil eder:
İlk beş alan, cron'a komutunuzu tam olarak ne zaman çalıştıracağını söyler. Belirli değerleri, aralıkları (ör. 1-5), listeleri (ör. 1, 3, 5) veya her zaman birimini ifade eden yıldız işaretlerini (*) kullanabilirsiniz. Altıncı bileşen ise çalıştırmak istediğiniz asıl komuttur.
Örneğin, her gün gece yarısında bir Python betiğini çalıştırarak bir API'den veri çıkarmak isterseniz, cron işiniz şöyle görünür:
Bu, cron'a betiğinizi 0. dakikada, 0. saatte (gece yarısı), ayın her günü, her ay ve haftanın her günü çalıştırmasını söyler. Hem Python yorumlayıcısının hem de betiğinizin mutlak yolunu kullanmak, ortamdan bağımsız olarak işin doğru çalışmasını sağlar.
Daha karmaşık zamanlamalar da oluşturabilirsiniz. Diyelim ki veritabanı temizliğini Pazartesi, Çarşamba ve Cuma günleri saat 15:30'da çalıştırmak istiyorsunuz; cron ifadeniz şöyle olur:
Her yıldız işareti bir joker karakter görevi görür ve tam ihtiyaçlarınıza uyan esnek zamanlamalar oluşturmanızı sağlar. Yaygın zamanlama kalıplarını daha okunur kılmak için
@daily,@weeklyveya@monthlygibi özel kısayolları da kullanabilirsiniz.Temeller bu kadar. Sırada, veri mühendisliği görevleri için cron işleriyle pratik olarak nasıl çalışacağınızı göstereceğim.
Veri Mühendisliği Görevleri için Cron İşi Kurulumu
Artık cron işlerinin ne olduğunu anladığınıza göre, ilk otomatik görevinizi oluşturalım. Süreç basittir ve başlamak için sadece birkaç komut gerektirir.
crontab dosyasını düzenleme
Cron işleri oluşturmak veya değiştirmek için crontab dosyanıza erişmeniz gerekir. Bunu
crontab -ekomutuyla yapabilirsiniz:Görsel 1 - Bir crontab dosyasını düzenleme
Yukarıdaki komut, zamanlanmış görevleri ekleyebileceğiniz, düzenleyebileceğiniz veya kaldırabileceğiniz vi metin düzenleyicisini açar.
Crontab dosyanız, daha önce hiç kullanmadıysanız boş olabilir. Yeni bir cron işi eklemek için, daha önce açıkladığım cron sözdizimini izleyen yeni bir satır eklemeniz yeterlidir. Her satır hem zamanlama hem de çalıştırılacak komutu içermelidir.
Örneğin, bir betiği her gün saat 03:00'te çalıştırmak için şu satırı ekleyin:
Dosyayı kaydedip düzenleyiciden çıkın. Cron, yeni crontab'ınızı otomatik olarak yükler ve işleri belirtilen zamanlarda çalıştırmaya başlar.
Basit bir veri mühendisliği görevinin zamanlanması
Pratik bir örnekle başlayalım: bir Python betiğini bir API'den veri çekmek üzere her dakika çalışacak şekilde zamanlamak. Aşağıda, bir REST API uç noktasına bağlanan, nesne verilerini alan ve bir CSV dosyasına kaydeden eksiksiz bir Python betiği yer alıyor — sadece Python yorumlayıcınızda
requestsvepandaspaketlerinin kurulu olduğundan emin olun:Şimdi bu betiği cron ile her gün saat 02:00'de çalışacak şekilde zamanlamak için:
Görsel 2 - Etkin crontab'leri listeleme
Bu satır, Python betiğinizi her günün her dakikasında çalıştırmasını cron'a söyler. Hem Python yorumlayıcısı (
/Users/dradecic/miniforge3/bin/pythonbenim durumumda) hem de betiğiniz (/Users/dradecic/Desktop/cron/fetch_api_data.pybenim durumumda) için mutlak yollar kullandığınızdan emin olun.Neden mutlak yollar? Cron sınırlı bir ortamla çalışır; bu nedenle kabuğunuzun
PATHdeğişkenini veya mevcut dizininizi bilmez. Mutlak yollar olmadan, cron kullanmak istediğiniz komutları veya dosyaları bulamadığı için işiniz başarısız olabilir.Siz bunu okurken,
dataklasörüme birkaç CSV dosyası kaydedildi; bu da cron işinin beklendiği gibi çalıştığını gösteriyor:Görsel 3 - Kaydedilen CSV dosyaları
ETL görevlerini zamanlama
Daha karmaşık veri mühendisliği iş akışları örneğin ETL (Extract, Transform, Load) işleri için, çok adımlı süreçleri zamanlamak amacıyla cron'u kullanabilirsiniz. Yaygın bir yaklaşım, tüm ETL adımlarınızı içeren bir kabuk betiği oluşturmak ve ardından bu betiği cron ile zamanlamaktır.
Basitlik adına, aşağıdaki
.shbetiğinde göreceğiniz kod yalnızca teoriktir ve herhangi bir veri kaynağına bağlanmaz:Bu kısmı hallettikten sonra, kabuk betiğinizi çalıştırılabilir hale getirmek isteyeceksiniz:
Son olarak, cron ile örneğin her iş günü saat 01:00'de çalışacak şekilde zamanlayın:
Bir veri mühendisiyseniz, ETL görevlerini cron ile zamanlamanın şu avantajları vardır:
Daha büyük ETL süreçleri için betiklerinize hata yönetimi eklemek isteyebilirsiniz:
Ve hepsi bu! ETL boru hattınız planlanan zamanlarda otomatik olarak çalışır, verilerinizi işler ve izleme amaçlı durumunu günlüklere yazar.
Cron İşlerini Yönetme ve İzleme
Cron işlerini kurduktan sonra, beklendiği gibi çalıştıklarından emin olmak için bunları yönetmeniz ve izlemeniz gerekir.
Bundan kastım; şu anda hangi işlerin zamanlandığını kontrol etmek, eski işleri kaldırmak ve yürütmelerini izlemektir. Bu bölümde, cron işlerinizi zahmetsizce sürdürmek için temel komut ve teknikleri göreceksiniz.
Mevcut cron işlerini görüntüleme
Şu anda zamanlanmış tüm cron işlerinizi görmek için
crontab -lkomutunu kullanın:Bu komut, zamanlamaları ve komutları dâhil olmak üzere tüm zamanlanmış işleri gösteren mevcut crontab dosyanızın içeriğini görüntüler. Düzenleme moduna girmeden hangi işlerin etkin olduğunu hızlıca doğrulamanın bir yoludur.
Önceki bölümü takip ettiyseniz, çıktınız aşağıdakine benzeyecektir:
Görsel 4 - Etkin cron işleri
Başka bir kullanıcının cron işlerini kontrol etmeniz gerekirse (root erişimi gerekir), bunun yerine şu komutu çalıştırın:
Cron işlerini kaldırma veya devre dışı bırakma
Artık ihtiyaç olmadığında cron işlerini kaldırmanın veya devre dışı bırakmanın birden fazla yolu vardır. Belirli bir işi kaldırmak için crontab'ınızı düzenleme modunda açın ve ilgili satırı silin:
Bir işi silmeden geçici olarak devre dışı bırakmak için, satırın başına bir
#ekleyerek yorum satırı yapın:Görsel 5 - Bir cron işini geçici olarak devre dışı bırakma
Yorum satırı yapılan iş, ileride başvurmak üzere crontab'ınızda kalır, ancak tanımlanan zamanlamada çalıştırılmaz.
Tüm crontab'ınızı (tüm işleri) kaldırmak isterseniz,
-rseçeneğini kullanın:Görsel 6 - Tüm crontab'ı silme
Bu komutu dikkatli kullanın — hiçbir onay istemi olmadan tüm zamanlanmış işlerinizi kaldırır. Yanlışlıkla silmeyi önlemek için önce crontab'ınızın yedeğini alabilirsiniz:
Bu işlem, mevcut crontab'ınızı gerektiğinde işlerinizi geri yüklemek için kullanabileceğiniz bir dosyaya kaydeder:
Görsel 7 - Bir yedekten crontab geri yükleme
Cron işi çıktısını izleme
Varsayılan olarak cron, işlerin çıktısını crontab'ın sahibi olan kullanıcıya e-postayla göndermeye çalışır. Ancak bunun için düzgün yapılandırılmış bir posta sistemi gerekir ve bu her zaman mevcut olmayabilir. Bunun yerine, daha kolay takip ve sorun giderme için çıktıyı günlük dosyalarına yönlendirebilirsiniz.
Hem standart çıktıyı hem de hata mesajlarını yakalamak için şu yönlendirme söz dizimini kullanın:
Bu yönlendirme ilk bakışta göz korkutucu görünebilir; parçalayalım:
>>, çıktıyı belirtilen dosyanın sonuna ekler.2>&1, stderr'i (hata mesajları) stdout ile (standart çıktı) aynı konuma yönlendirir.Görsel 8 - Cron işi günlüklerini yakalama
Daha iyi günlük yönetimi için günlük girdilerinize zaman damgaları ekleyebilirsiniz:
Görsel 9 - Zaman damgalı cron işi günlüklerini yakalama
Normal çıktı ve hatalar için ayrı günlük dosyaları istiyorsanız, şunu kullanın:
Görsel 10 - Cron işi günlük ve hata dosyaları
Arıza durumunda bildirim gerektiren kritik işler için e-posta uyarıları kurabilirsiniz. Sisteminizde bir posta aktarım aracısı (ör.
postfixveyasendmail) kurulu olduğunu varsayarsak, iş yalnızca başarısız olursa e-posta gönderecek şekilde cron işinizi değiştirebilirsiniz:Bu,
||işleçini kullanır; bu da "önceki komut başarısız olursa posta komutunu çalıştır" anlamına gelir.“Başarı” e-posta bildirimleri için ise şunu kullanın:
Daha gelişmiş izleme araçlarısını, örneğin Node Exporter ile Prometheus veya adaha adanmış cron izleme servislerini kullanabilirsiniz; ancak bu basit günlükleme ve e-posta teknikleri, çoğu veri mühendisliği ihtiyacı için etkili bir izleme sağlar.
Veri Mühendisliğinde İleri Düzey Cron İşi Kullanım Senaryoları
Şimdiye kadar, günlükleri ve hataları yakalamak için temel cron komutlarını ve kalıplarını öğrendiniz. Başlamak için iyidir, ancak üretim senaryolarında daha gelişmiş komutları ve konteyner teknolojileriyle entegrasyonu keşfetmek isteyeceksiniz.
Bu bölümde, daha sofistike veri mühendisliği iş akışları için cron işi uygulamanızı nasıl bir üst seviyeye taşıyacağınızı göreceksiniz.
Birden çok komutla cron işleri çalıştırma
Ayrı kabuk betiklerine gerek kalmadan, tek bir cron işinde birden çok komutu zincirleyerek karmaşık iş akışları oluşturabilirsiniz.
Komutları birleştirmenin birkaç yolu vardır.
Önceki komutların başarı durumundan bağımsız olarak komutları ardışık çalıştırmak için noktalı virgül kullanabilirsiniz:
Ya da
&&kullanarak, önceki komut başarılı olursa sonraki komutu çalıştır (ilk hatada durur) kuralını uygulayabilirsiniz:Alternatif olarak
||kullanarak, önceki komut başarısız olursa bir komutu çalıştırabilirsiniz (hata işleme):Daha karmaşık komut zincirleri için, komutları gruplayacak parantezleri kullanabilirsiniz:
Bu yaklaşım, daha basit çok adımlı iş akışları için iyi çalışır. Ancak çok sayıda adım, koşullu mantık veya hata yönetimi içeren çok karmaşık boru hatları için özel bir kabuk betiği hâlâ daha iyi bir seçenektir.
Docker ile cron işleri
Docker konteynerleri, modern veri mühendisliği yığınlarının vazgeçilmez bir parçası haline geldi. Zamanlanmış görevlerinizin tutarlı ve izole ortamlarda çalışmasını sağlamak için cron'u Docker ile çeşitli güçlü şekillerde entegre edebilirsiniz.
Göstermek için,
fetch_api_data.pybetiğini biraz değiştirerek veri alma ve günlükler için ayrılmış dizinler kullanacağım ve betiğin bir konteyner ortamında çalışabilmesi için yolları güncelleyeceğim:Yani hem alınan veriler hem de günlükler
/app/runsklasörüne kaydedilecek.Sıradaki adım, Docker'a konteynerin nasıl oluşturulacağını ve çalıştırılacağını anlatan tek bir dosya olan bir
Dockerfileoluşturmaktır:Neredeyse hazırız. Şimdi imajı oluşturmak ve Docker konteynerini çalıştırmak için aşağıdaki komutu çalıştırabilirsiniz
Konteynere bağlanırsanız, Python betiğinin her dakika çalıştırıldığını görürsünüz:
Görsel 11 - Docker konteynerinde çalışan cron işi
Diğer yandan, bir veri mühendisliği boru hattını bir Docker konteynerinde kron zamanlamasıyla çalıştırmanın bir yolunu arıyorsanız,
fetch_api_data.pybetiğini değiştirmeden bırakın ancakDockerfile'ı düzenleyin:Ardından sisteminizdeki crontab dosyasına şunları ekleyin:
Bu, container'ı her 2 dakikada bir oluşturup çalıştıracaktır.
Cron işlerini uzak sunucularda çalıştırma
Dağıtık veri mühendisliği iş akışlarında, süreçleri uzak sunucularda yürütmeniz sıkça gerekir. Cron işleri, SSH kullanarak bu uzak işlemleri tetikleyebilir.
Örneğin, uzak bir sunucuda bir cron işini çalıştırmak için şu komutu kullanabilirsiniz:
Bunun parolasız çalışması için sunucular arasında SSH anahtar tabanlı kimlik doğrulaması kurmanız gerekir.
Sunucular arasında zamanlanmış veri transferi yapmak için şu cron işini kullanın:
Daha karmaşık uzak işlemler için SSH'i kabuk betikleriyle birleştirebilirsiniz:
Ve ardından cron ile zamanlamak yeterlidir:
Bu yaklaşım, çok sunuculu veri boru hatlarını doğrudan cron işlerinden orkestre etmenize olanak tanır. İşe yarar, ancak çok karmaşık dağıtık iş akışları için özel orkestrasyon araçlarını, örneğin Apache Airflow veya Prefect'i düşünebilirsiniz.
Veri Mühendisliği için Cron İşi En İyi Uygulamaları
En iyi tasarlanmış cron işleri bile doğru operasyonel uygulamalarla hayata geçirilmezse başarısız olabilir veya sorunlara yol açabilir.
Bir veri mühendisi olarak, zamanlanmış görevlerinizin güvenilir şekilde çalışmasını, hatalarda zarifçe toparlanmasını ve sorun giderme için yeterli görünürlük sağlamasını temin etmeniz gerekir. Bu bölümde bunu nasıl yapacağınızı göstereceğim.
Doğru günlükleme ayarlayın
Günlükleme, doğrudan gözetim olmadan çalışan otomatik süreçler için kritik öneme sahiptir. Onlar olmadan, cron işleriyle ilgili sorunları teşhis etmek neredeyse imkansız hale gelir.
Temel günlükleme kurmak için, hem standart çıktıyı hem de hata mesajlarını günlük dosyalarına yönlendirebilirsiniz:
Görsel 12 - Cron işi günlükleme yapılandırması (1)
Bu komut, betiğinizi her dakika çalıştırır ve tüm çıktıyı bir günlük dosyasının sonuna ekler.
>>işleci çıktıyı üzerine yazmak yerine eklerken,2>&1hem standart hatayı (dosya tanımlayıcı 2) hem de standart çıktıyı (dosya tanımlayıcı 1) aynı günlük dosyasına yönlendirir.Daha yapısal günlükleme için zaman damgaları ve iş tanımlayıcıları ekleyebilirsiniz:
Görsel 13 - Cron işi günlükleme yapılandırması (2)
Bu geliştirilmiş komut, betiğinizi çalıştırmadan önce zaman damgalı net bir başlangıç işareti ve tamamlandıktan sonra hem zaman damgası hem de çıkış kodu içeren bir bitiş işareti ekler. Parantezler bu komutları bir arada gruplar, böylece tüm çıktı günlük dosyasına yönlendirilir.
$?değişkeni en son çalıştırılan komutun çıkış kodunu içerir; bu da betiğin başarılı olup olmadığını (çıkış kodu 0) veya başarısız olup olmadığını (sıfırdan farklı çıkış kodu) belirlemenize yardımcı olur.Günlüklerin aşırı disk alanı tüketmesini önlemek için günlük döndürme uygulayabilirsiniz. Çoğu Linux dağıtımında bulunan
logrotatearacını kullanın:/etc/logrotate.d/cron-jobskonumunda bir yapılandırma dosyası oluşturun:Bu yapılandırma sisteme şunları söyler:
daily)missingok)rotate 14)compress)delaycompress)notifempty)create 0640 username groupname)Sistemin
logrotateservisi bu ayarları otomatik olarak uygular ve genellikle günde bir kez çalışır. Çalıştığında mevcut günlük dosyanızın adını değiştirir (tarih soneki ekleyerek), daha eski günlükleri sıkıştırır, 14 günden eski günlükleri siler ve yeni kayıtlar için taze bir günlük dosyası oluşturur.Hataları ve yeniden denemeleri yönetin
Sağlam veri mühendisliği iş akışları, hataları ele almak için stratejilere ihtiyaç duyar. Betiklerinize veya cron işlerinize yeniden deneme mantığı entegre edebilir ya da cron işlerinizi izleme sistemlerine bağlayabilirsiniz.
Bu bölümde bu seçeneklerin tümünü nasıl uygulayacağınızı göstereceğim.
Yerleşik yeniden deneme mantığı doğrudan Python betiklerinize aşağıdaki gibi uygulanabilir:
Bu Python fonksiyonu, jitter ile üstel geri çekilme stratejisi uygular. Nasıl çalıştığına bakalım:
max_attemptskez (varsayılan 3) yürütmeyi dener.Bu desen, ağ sorunları veya API hız sınırları gibi geçici hataları ele almak için idealdir. Bekleme süresinin üstel olarak artması, harici sistemin toparlanmasına zaman tanırken jitter "ani yüklenme" sorunlarını önler.
Cron tabanlı yeniden denemeler de geçerli bir seçenektir. Başarısız işleri, ihtiyaç duyulandan daha sık zamanlayarak yeniden deneyebilirsiniz.
Aşağıda iki cron işi kurduğum bir örnek yer alıyor:
success_flagdosyası oluşturulur.Yukarıdaki kurulum anlaşılması zor olabilir; adımları tekrar açıklayayım:
[ ! -f /path/to/success_flag ])/path/to/script.py)touch /path/to/success_flag)0 0 * * *) çalışır ve başarı işaretini kaldırır; böylece sürecin ertesi gün tekrar çalışmasına izin verir.Bu teknik, günde bir kez tamamlanması gereken ancak geçici olarak başarısız olabilen görevler için kullanışlıdır. İş, gün boyunca başarıya ulaşana kadar denemeye devam eder.
İzleme entegrasyonu cron işlerinizi Prometheus gibi izleme sistemlerine bağlamanıza imkan tanır. Bu başlı başına bir konudur, bu yüzden burada yalnızca üst düzey bir genel bakış sunacağım.
Aşağıda göreceğiniz betik, gerçek işinizin etrafına sarılan ve Prometheus’a metrik toplayıp raporlayan bir sarmalayıcıdır. Betiğin yaptığı adımlar şunlardır:
Bu metrikler şunları yapmanızı sağlar:
Pushgateway bir ara katman olarak görev yapar; kısa ömürlü cron işinin metriklerini Prometheus’a iletmesine olanak tanır; Prometheus da bunları uyarı ve görselleştirme için saklar.
Saat dilimi hususları
Saat dilimi sorunları, özellikle küresel veri kaynakları veya dağıtık sistemlerle çalışırken, veri mühendisliğinde sık karşılaşılan zorluklardır.
Bekleneceği üzere, cron işleri saat dilimi ayarlarına duyarlıdır.
Varsayılan olarak, cron sistemin yerel saat dilimini kullanır. Sisteminizin saat dilimini şu Linux komutuyla kontrol edebilirsiniz:
Yukarıdaki komut, sisteminizin mevcut saat ve saat dilimi yapılandırmasını gösterir. Sunucunuz
America/New_Yorkgibi yerel bir saat dilimini kullanacak şekilde yapılandırılmışsa tüm cron zamanlamaları o saat diliminde yorumlanır.Sunucu konumundan veya yaz saati uygulaması değişikliklerinden bağımsız olarak tutarlı zamanlama sağlamak için cron işlerinizde UTC kullanın:
Crontab dosyanızın en üstüne
CRON_TZ=UTCsatırını ekleyerek, cron’a tüm zaman belirtimlerini yerel saat yerine UTC olarak yorumlamasını söylersiniz.Bu, işin sunucunun yerel saat diliminden veya yaz saati uygulamasından bağımsız olarak her gün UTC’ye göre gece yarısında çalışacağı anlamına gelir. UTC (Eşgüdümlü Evrensel Zaman) yaz saati uygulaması için değişmez ve tüm konumlar arasında tutarlı bir referans noktası sağlar.
Veri Mühendisleri için Cron İşi Rehberinin Özeti
Bir veri mühendisiyseniz, cron işleri paha biçilmez bir araçtır.
Tekrarlayan görevleri otomatikleştirmenize ve güvenilir veri hatları oluşturmanıza yardımcı olabilirler. Betikleri zamanlamak ve çok adımlı ETL süreçlerinin karmaşık orkestrasyonunu gerçekleştirmek için tutarlı ve güçlü bir yol sunarlar. Sözdizimine alışmak biraz zaman alır ama birkaç gün içinde ikinci doğanız haline gelecektir.
Cron işlerini veri mühendisliği çalışmalarınıza uygularken, günlükleme, hata yönetimi ve saat dilimi yönetimine ilişkin en iyi uygulamaları takip etmeyi unutmayın. Doğru günlükleme, iş yürütmesine görünürlük sağlar ve sorun gidermeyi kolaylaştırır. Yeniden deneme mekanizmaları içeren iyi hata yönetimi teknikleri, hatlarınızın geçici hatalardan kurtulmasını sağlar. Dikkatli saat dilimi yönetimi, özellikle küresel veri kaynakları veya dağıtık ekiplerle çalışırken zamanlamalarınızı tutarlı kılar.
>2025’te Veri Mühendisi olarak işe girmeyi mi düşünüyorsunuz? Mutlaka sahip olmanız gereken 5 temel beceri burada.
Elbette, özelleşmiş iş akışı orkestrasyon araçları olan Apache Airflow veya Prefect, karmaşık veri hatları için daha gelişmiş özellikler sunar; ancak cron, birçok veri mühendisliği görevi için hâlâ geçerliliğini korur. Kullanımı basit, güvenilir ve düşük ek yük gerektirir—tüm bunlar onu otomasyon ihtiyaçları için ideal kılar.
Veri mühendisliği hakkında daha fazlasını öğrenmek için DataCamp’in şu kurslarına kaydolun: