Hvordan lage en DAG-trigger i Airflow ved hjelp av Experimental API

NÄr vi forbereder vÄre utdanningsprogrammer, stÞter vi periodisk pÄ utfordringer med enkelte verktÞy. Og i Þyeblikkene vi mÞter dem, er det ikke alltid tilstrekkelig dokumentasjon og artikler som kan hjelpe oss med Ä lÞse dette problemet.

Det var for eksempel i 2015, da vi i programmet "Spesialist pÄ store data" brukte et Hadoop-kluster med Spark for 35 samtidige brukere. Hvordan man skulle forberede det for en slik brukstilfelle ved hjelp av YARN, var uklart. Til slutt, etter Ä ha jobbet oss gjennom det pÄ egenhÄnd, fikk vi gjort et innlegg pÄ Habré og vi holdt ogsÄ et innlegg pÄ Moscow Spark Meetup.

Bakgrunn

Denne gangen skal vi snakke om et annet program – Data Engineer. Deltakerne vĂ„re bygger to typer arkitektur: lambda og kappa. Og i lambda-arkitekturen brukes Airflow til Ă„ overfĂžre logger fra HDFS til ClickHouse i batchbehandling.

Alt er egentlig bra. La dem bygge sine pipelines. Men det er en hake: alle programmene vÄre er teknologisk krevende med tanke pÄ selve lÊringsprosessen. For Ä sjekke labene bruker vi automatiserte sjekker: deltakerne mÄ logge inn pÄ kontoen sin, klikke pÄ "Sjekk", og etter en stund ser de en omfattende tilbakemelding pÄ det de har gjort. Og nettopp i dette Þyeblikket begynner vi Ä nÊrme oss vÄrt problem.

Sjekken av denne laben er satt opp slik: vi sender en kontrollpakke med data til deltakerens Kafka, deretter flytter Gobblin denne datapakken til HDFS, videre tar Airflow pakka og plasserer den i ClickHouse. Tingen er at Airflow ikke skal gjĂžre dette i sanntid; han gjĂžr det etter en tidsplan: hver 15. minutt tar han en pakke filer og laster dem opp.

SÄ vi mÄ pÄ en eller annen mÄte trigge deres DAG selv etter vÄre krav, her og nÄ under sjekkerens arbeid. Etter Ä ha googlet det, fant vi ut at for nyere versjoner av Airflow finnes det et sÄkalt Experimental API. Ordet eksperimentell, hÞres selvfÞlgelig skremmende ut, men hva skal man gjÞre
 Kanskje det vil fungere.

Videre beskriver vi hele veien: fra installasjon av Airflow til forming av POST-forespĂžrselen som trigget DAG ved Ă„ bruke Experimental API. Vi kommer til Ă„ jobbe med Ubuntu 16.04.

1. Installering av Airflow

La oss sjekke at vi har Python 3 og virtualenv installert.

$ python3 --version
Python 3.6.6
$ virtualenv --version
15.2.0

Hvis noe av dette mangler, vennligst installer det.

NĂ„ lager vi en katalog der vi skal jobbe videre med Airflow.

$ mkdir 
$ cd /path/to/your/new/directory
$ virtualenv -p which python3 venv
$ source venv/bin/activate
(venv) $

La oss installere Airflow:

(venv) $ pip install airflow

Versjonen vi jobbet med: 1.10.

NÄ mÄ vi opprette en katalog airflow_home, hvor DAG-filer og Airflow-plugins skal ligge. Etter Ä ha opprettet katalogen, setter vi miljÞvariabelen AIRFLOW_HOME.

(venv) $ cd /path/to/my/airflow/workspace
(venv) $ mkdir airflow_home
(venv) $ export AIRFLOW_HOME=

Neste steg er Ă„ kjĂžre kommandoen som vil opprette og initialisere databasen for datastrĂžmmen i SQLite:

(venv) $ airflow initdb

Databasen vil bli opprettet i airflow.db som standard.

La oss sjekke om Airflow er installert:

$ airflow version
[2018-11-26 19:38:19,607] {__init__.py:57} INFO - Using executor SequentialExecutor
[2018-11-26 19:38:19,745] {driver.py:123} INFO - Generating grammar tables from /usr/lib/python3.6/lib2to3/Grammar.txt
[2018-11-26 19:38:19,771] {driver.py:123} INFO - Generating grammar tables from /usr/lib/python3.6/lib2to3/PatternGrammar.txt
  ____________       _____________
 ____    |__( )_________  __/__  /________      __
____  /| |_  /__  ___/_  /_ __  /_  __ _ | /| / /
___  ___ |  / _  /   _  __/ _  / / /_/_ |/ |/ /
 _/_/_  |_/_/_/  /_/_/    /_/    /_/  ____/____/|__/
   v1.10.0

Hvis kommandoen fungerte, har Airflow opprettet sin konfigurasjonsfil airflow.cfg i AIRFLOW_HOME:

$ tree
.
├── airflow.cfg
└── unittests.cfg

Airflow har et webgrensesnitt. Dette kan startes ved Ă„ kjĂžre kommandoen:

(venv) $ airflow webserver --port 8081

NÄ kan du fÄ tilgang til webgrensesnittet i en nettleser pÄ port 8081 pÄ vertsmaskinen der Airflow ble startet, for eksempel: <hostname:8081>.

2. Arbeide med Experimental API

NÄ er Airflow konfigurert og klart til bruk. Likevel, vi mÄ ogsÄ starte det eksperimentelle API-et. VÄre sjekker er skrevet i Python, sÄ videre vil alle forespÞrslene vÊre pÄ det med bruk av biblioteket requests.

Faktisk er API-et allerede aktivt for enkle forespĂžrslene. For eksempel, denne forespĂžrselen kan teste det:

>>> import requests
>>> host = 
>>> airflow_port = 8081 #i vÄrt tilfelle er det slik, men som standard er det 8080
>>> requests.get('http://{}:{} /{}'.format(host, airflow_port, 'api/experimental/test').text
'OK'

Hvis vi fikk en slik melding som svar, betyr det at alt fungerer.

Imidlertid, nÄr vi Þnsker Ä trigge DAG, vil vi oppleve at denne typen forespÞrsel ikke kan utfÞres uten autentisering.

For dette mÄ vi gjÞre en rekke ytterligere trinn.

For det fÞrste, mÄ vi legge til dette i konfigurasjonen:

[api]
auth_backend = airflow.contrib.auth.backends.password_auth

Deretter mÄ vi opprette en bruker med administratorrettigheter:

>>> import airflow
>>> from airflow import models, settings
>>> from airflow.contrib.auth.backends.password_auth import PasswordUser
>>> user = PasswordUser(models.Admin())
>>> user.username = 'new_user_name'
>>> user.password = 'set_the_password'
>>> session = settings.Session()
>>> session.add(user)
>>> session.commit()
>>> session.close()
>>> exit()

Deretter mÄ vi opprette en bruker med vanlige rettigheter som vil fÄ lov til Ä trigge DAG-en.

>>> import airflow
>>> from airflow import models, settings
>>> from airflow.contrib.auth.backends.password_auth import PasswordUser
>>> user = PasswordUser(models.User())
>>> user.username = 'newprolab'
>>> user.password = 'Newprolab2019!'
>>> session = settings.Session()
>>> session.add(user)
>>> session.commit()
>>> session.close()
>>> exit()

NĂ„ er alt klart.

3. KjĂžre POST-forespĂžrselen

POST-forespĂžrselen vil se slik ut:

>>> dag_id = newprolab
>>> url = 'http://{}:{} / {}/ {} / {}'.format(host, airflow_port, 'api/experimental/dags', dag_id, 'dag_runs')
>>> data = {"conf":"{"key":"value"}"}
>>> headers = {'Content-type': 'application/json'}
>>> auth = ('newprolab', 'Newprolab2019!')
>>> uri = requests.post(url, data=json.dumps(data), headers=headers, auth=auth)
>>> uri.text
'{n  "message": "Created "n}n'

ForespĂžrselen ble behandlet vellykket.

Deretter gir vi DAG-en litt tid til Ä behandle og gjÞr et forespÞrsel i ClickHouse-tabellen, i et forsÞk pÄ Ä fange kontrollpakken med data.

Kontrolleringen er fullfĂžrt.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster