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.

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.

Şekil-1: Airflow Web UI DAGs

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

Yazar Hakkında
Toplam 180 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara