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 og vi holdt ogsÄ et innlegg pÄ .
Bakgrunn
Denne gangen skal vi snakke om et annet program â . 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 . 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.0Hvis 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 airflowVersjonen 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 initdbDatabasen 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.0Hvis kommandoen fungerte, har Airflow opprettet sin konfigurasjonsfil airflow.cfg i AIRFLOW_HOME:
$ tree
.
âââ airflow.cfg
âââ unittests.cfgAirflow har et webgrensesnitt. Dette kan startes ved Ă„ kjĂžre kommandoen:
(venv) $ airflow webserver --port 8081NÄ 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_authDeretter 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
