Docker ile Kolay ve Hızlı Apache Airflow Kurulumu
Veri mühendisliği, analitik ve makine öğrenmesi projelerinde, iş akışlarını yönetmek ve otomatikleştirmek için güçlü bir araç arıyorsanız, Apache Airflow ilk seçeneklerden birisi olacaktır. Airflow, karmaşık veri işleme görevlerini planlamanıza, yürütmenize ve izlemenize olanak tanıyan popüler bir açık kaynaklı platformdur.
Ancak, Airflow’u öğrenmek isteyenlerin Airflow kurmaları gerekiyor. Klasik yöntemlerle (işletim sistemi üzerinde bir servis olarak) kurmak ve çalıştırmak, Airflow’a yabancı birisi için karmaşık ve zor olabilir. Neyse ki, Docker’ın yardımıyla Airflow’u öğrenmek ve denemek amacıyla kurmak çok kolay. Docker ile dakikalar içinde çalışan bir Airflow’a sahip olabilirsiniz. Ancak burada gösterilecek kurulumun canlı ortam iş yükleri için uygun olmadığını lütfen unutmayın. Çünkü ölçekleniyormuş gibi yapsa da aslında tüm yapı zavallı bir makine üzerinde ve onun kaynaklarıyla sınırlı.
Bu blog yazısında, Docker kullanarak Airflow’u nasıl hızlı ve kolay bir şekilde kuracağımızı adım adım göreceğiz. En sonunda da kurulumu test etmek amacıyla basit bir DAG yaratacağız.
Ortam Bilgisi
Bu kurulum için kullanılan ortam bilgileri. Versiyonlar birebir aynı olmak zorunda değil. Kıyaslama yapabilmeniz açısından paylaşıyorum.
- CentOS7 İşletim Sistemi (Şart değil, linux olsun yeter)
- Docker community 26.1.0
- Docker Compose v2.17.3
- $USER (train) sudo olmadan docker komutlarını çalıştırabiliyor
- Kurulacak airflow sürümü: 2.7.3
- Executor türü: CeleryExecutor
Airflow Executor Türleri
Kurulumda CeleryExecutor kullanacağız ancak başka hangi executor’lar var görelim.
Local Executors
- Görevleri, programın çalıştığı aynı işlemci çekirdeğinde (process) çalıştırır.
- Basit ve hafiftirler.
- Küçük ölçekli veya geliştirme ortamları için uygundur.
- Birden fazla görevin paralel olarak çalışmasını desteklemezler (sadece Sequential).
- Ölçekleme gerektiren yoğun canlı ortamlar için önerilmezler.
Remote Executors
- Görevleri, programın çalıştığı işlemci çekirdeğinden ayrı bir yerde çalıştırır.
- Daha fazla ölçeklenebilirlik ve paralellik sağlar.
- Canlı ortamlar için daha uygundur.
- Ek kurulum ve konfigürasyon gerektirir.
- CeleryExecutor Airflow CeleryExecutor, Airflow’un görevleri (task) yürütmek için Celery asenkron iş işleyicisini kullanan bir executor türüdür. Bu executor, görevleri paralel olarak çalıştırmak ve iş yükünü birden fazla işçiye (worker) dağıtmak için idealdir.
- CeleryKubernetesExecutor:
- KubernetesExecutor
- KubernetesLocalExecutor
Kurulum
Kullanıcı home dizininde bir airflow dizini yaratalım
mkdir /home/$USER/airflow
Kontrol edelim
ls -l /home/$USER/ | grep airflow
Beklenen çıktı
drwxrwxr-x. 2 train train 6 May 21 06:11 airflow
airflow dizini oluşmuş ve demek ki kullanıcımız train imiş. Sizin durumunuzda farklı olabilir.
Dizin değiştirerek airflow içine girelim.
cd /home/$USER/airflow
Dockerfile oluşturalım. Bunu yapmak zorunda değilsiniz ancak mevcut airflow imajının içermediği özgün pip veya işletim sistemi paketleri eklemek isterseniz imajı kendinize göre özelleştirmeniz gerekir.
cat<<EOF | tee Dockerfile FROM apache/airflow:2.7.3 RUN pip install --upgrade pip COPY requirements.txt . RUN pip install -r requirements.txt USER root RUN apt-get update RUN apt-get install wget EOF
requirements.txt oluşturalım. Sadece örnek olsun diye findspark ekledik. Python versiyonunu göz önüne alarak paketlere uyumlu versiyon vermenizi tavsiye ederim.
echo "findspark" > requirements.txt
Volume olarak kullanılacak dizinleri oluşturma
mkdir -p ./dags ./logs ./plugins
AIRFLOW_UID ekleme
echo -e "AIRFLOW_UID=$(id -u)" > .env cat .env AIRFLOW_UID=1000
docker-compose.yaml dosyasını indirme ve özelleştirme
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.7.3/docker-compose.yaml'
Aşağıdaki değişiklikleri yapın:
- Bu satırı yorum yapın:
#image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.7.3}
- Bu satırın yorumdan çıkarın:
build: .
- Aşağıdaki gibi olmalıdır.
#image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.7.3} build: .
- Örnek dag dosyalarını yüklememek için:
AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
- Geliştirme amaçlı olarak değişikliklerin çabuk algılanması için:
AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL: 5
Ortamı ayağa kaldırma
worker ölçeklenebilecek bir bileşen. Ondan 3 tane olsun. Bunu --scale airflow-worker=3
ile sağlayacağız.
docker-compose up --build --scale airflow-worker=3 -d
Belli bir süre imajları indirecek ve sonra ortamı ayağa kaldıracaktır.
Durum kontrolü
docker-compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS airflow-airflow-scheduler-1 airflow-airflow-scheduler "/usr/bin/dumb-init …" airflow-scheduler 22 minutes ago Up 21 minutes (healthy) 8080/tcp airflow-airflow-triggerer-1 airflow-airflow-triggerer "/usr/bin/dumb-init …" airflow-triggerer 22 minutes ago Up 21 minutes (healthy) 8080/tcp airflow-airflow-webserver-1 airflow-airflow-webserver "/usr/bin/dumb-init …" airflow-webserver 22 minutes ago Up 21 minutes (healthy) 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp airflow-airflow-worker-1 airflow-airflow-worker "/usr/bin/dumb-init …" airflow-worker 22 minutes ago Up 21 minutes (healthy) 8080/tcp airflow-airflow-worker-2 airflow-airflow-worker "/usr/bin/dumb-init …" airflow-worker 22 minutes ago Up 21 minutes (healthy) 8080/tcp airflow-airflow-worker-3 airflow-airflow-worker "/usr/bin/dumb-init …" airflow-worker 22 minutes ago Up 21 minutes (healthy) 8080/tcp airflow-postgres-1 postgres:13 "docker-entrypoint.s…" postgres 22 minutes ago Up 22 minutes (healthy) 5432/tcp airflow-redis-1 redis:latest "docker-entrypoint.s…" redis 22 minutes ago Up 22 minutes (healthy) 6379/tcp
Tüm konteynerler ayakta ve çalışıyor. Şimdi Örnek dag oluşturalım.
Örnek DAG
cat<<EOF | tee dags/my_dag.py from airflow import DAG from datetime import datetime, timedelta from airflow.operators.bash import BashOperator start_date = datetime(2024, 5, 19) default_args = { 'owner': 'airflow', 'start_date': start_date, 'retries': 1, 'retry_delay': timedelta(seconds=5) } with DAG('my_dag', default_args=default_args, schedule_interval='@daily', catchup=False) as dag: t0 = BashOperator(task_id='ls_data', bash_command='echo "Listing data..."', retries=2, retry_delay=timedelta(seconds=15)) t1 = BashOperator(task_id='download_data', bash_command='echo "Downloading data..."', retries=2, retry_delay=timedelta(seconds=15)) t2 = BashOperator(task_id='check_file_exists', bash_command='echo "Checking data..."', retries=2, retry_delay=timedelta(seconds=15)) t0 >> t1 >> t2 EOF
start_date’i bir kaç gün öncesine ayarlayınız.
Web arayüzü
http://<ip>:8080 adresini browser ile açarsanız karşınıza airflow web ara yüzü çıkacaktır.
my_dag aktif hale getirelim. start_date bugünden daha eski bir tarih olduğu için kendisini tetikleyecek ve başarıyla tamamlanacaktır.
Airflow data engineering alanında çok sık kullanılan ve sektörde çok aranan bir yetenek. Kendinizi bu alana hazırlamak ve Airflow yeteneklerinizi daha fazla geliştirmek için VBO Data Engineering Bootcamp‘i şiddetle tavsiye ederim.
Bir yazımızın daha sonuna geldik. Bir sonrakinde görüşünceye dek hoşçakalın…
Kaynaklar
- Kapak: Photo by Riccardo Trimeloni on Unsplash
- https://airflow.apache.org/docs/apache-airflow/2.7.3/howto/docker-compose/index.html