Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

Hej, Habr! I den hÀr artikeln vill jag berÀtta om ett fantastiskt verktyg för utveckling av batchprocesser för databehandling, till exempel i infrastrukturen för företags-DWH eller din DataLake. Det handlar om Apache Airflow (hÀrefter Airflow). Det Àr orÀttvist förbisett pÄ Habr, och i huvuddelen av artikeln ska jag försöka övertyga dig om att Airflow Ätminstone Àr vÀrt att övervÀga nÀr du vÀljer en schemalÀggare för dina ETL/ELT-processer.

Tidigare har jag skrivit en serie artiklar om DWH nÀr jag arbetade pÄ Tinkoff Bank. Nu Àr jag en del av Mail.Ru Groups team och arbetar med utvecklingen av plattformen för dataanalys inom spelomrÄdet. NÀr nyheter och intressanta lösningar dyker upp kommer vi i teamet att berÀtta hÀr om vÄr plattform för dataanalys.

Prolog

SÄ, lÄt oss börja. Vad Àr Airflow? Det Àr ett bibliotek (eller en uppsÀttning bibliotek) för att utveckla, schemalÀgga och övervaka arbetsflöden. Huvudfunktionen i Airflow Àr att anvÀnda kod i Python för att beskriva (utveckla) processer. DÀrav följer massor av fördelar för att organisera ditt projekt och utveckling: i grund och botten Àr ditt (till exempel) ETL-projekt bara ett Python-projekt, och du kan organisera det som du vill, med hÀnsyn till infrastrukturens sÀrdrag, teamets storlek och andra krav. VerkygsmÀssigt Àr allt enkelt. AnvÀnd till exempel PyCharm + Git. Det Àr underbart och vÀldigt bekvÀmt!

Nu ska vi titta pÄ de grundlÀggande entiteterna i Airflow. Genom att förstÄ deras innebörd och syfte kommer du att optimalt organisera arkitekturen för processerna. Den kanske viktigaste entiteten Àr Directed Acyclic Graph (hÀrefter DAG).

DAG

DAG Àr en viss meningsfull sammanslutning av dina uppgifter, som du vill utföra i strikt bestÀmd följd enligt ett visst schema. Airflow erbjuder ett bekvÀmt webbgrÀnssnitt för att arbeta med DAG:ar och andra entiteter:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

DAG kan se ut sÄ hÀr:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

NÀr utvecklaren designar DAG:en lÀgger hen in en uppsÀttning operatörer, som uppgifterna inuti DAG:en kommer att byggas pÄ. HÀr kommer vi till en annan viktig entitet: Airflow Operator.

Operatörer

En operator Àr en entitet pÄ grundval av vilken instanser av uppgifter skapas, dÀr det beskrivs vad som kommer att hÀnda under utförandet av uppgiftsinstansen. Airflow-versioner frÄn GitHub innehÄller redan en uppsÀttning operatörer redo för anvÀndning. Exempel:

  • BashOperator — en operator för att köra bash-kommandon.
  • PythonOperator — en operator för att anropa Python-kod.
  • EmailOperator — en operator för att skicka e-post.
  • HTTPOperator — en operator för att hantera http-förfrĂ„gningar.
  • SqlOperator — en operator för att köra SQL-kod.
  • Sensor — en operator som vĂ€ntar pĂ„ ett hĂ€ndelse (som att en viss tid infaller, en fil dyker upp, en rad i en databas, svar frĂ„n ett API — osv.).

Det finns mer specifika operators: DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator.

Du kan ocksÄ utveckla operators med sÀrskilda fokusomrÄden och anvÀnda dem i ditt projekt. Till exempel har vi skapat MongoDBToHiveViaHdfsTransfer, en operator för att exportera dokument frÄn MongoDB till Hive, och nÄgra operators för att arbeta med ClickHouse: CHLoadFromHiveOperator och CHTableLoaderOperator. I grunden, sÄ snart en projekt har kod som anvÀnds ofta, baserad pÄ grundlÀggande operators, kan du övervÀga att samla den i en ny operator. Detta kommer att förenkla framtida utveckling och du kommer att utöka ditt bibliotek av operators i projektet.

DÀrefter behöver alla dessa uppgiftsexemplen köras, och nu handlar det om schemalÀggaren.

SchemalÀggare

UppgiftsschemalÀggaren i Airflow Àr baserad pÄ Celery. Celery Àr ett Python-bibliotek som möjliggör skapandet av köer samt asynkron och distribuerad exekvering av uppgifter. I Airflow delas alla uppgifter upp i pooler. Pooler skapas manuellt. Vanligtvis Àr deras syfte att begrÀnsa belastningen pÄ arbete med kÀllan eller typisera uppgifter inom DWH. Pooler kan hanteras via webbgrÀnssnittet:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

Varje pool har en begrÀnsning för antalet platser. NÀr en DAG skapas tilldelas den en pool:

ALERT_MAILS = Variable.get("gv_mail_admin_dwh")
DAG_NAME = 'dma_load'
OWNER = 'Vasya Pupkin'
DEPENDS_ON_PAST = True
EMAIL_ON_FAILURE = True
EMAIL_ON_RETRY = True
RETRIES = int(Variable.get('gv_dag_retries'))
POOL = 'dma_pool'
PRIORITY_WEIGHT = 10

start_dt = datetime.today() - timedelta(1)
start_dt = datetime(start_dt.year, start_dt.month, start_dt.day)

default_args = {
    'owner': OWNER,
    'depends_on_past': DEPENDS_ON_PAST,
    'start_date': start_dt,
    'email': ALERT_MAILS,
    'email_on_failure': EMAIL_ON_FAILURE,
    'email_on_retry': EMAIL_ON_RETRY,
    'retries': RETRIES,
    'pool': POOL,
    'priority_weight': PRIORITY_WEIGHT
}
dag = DAG(DAG_NAME, default_args=default_args)
dag.doc_md = __doc__

Poolen som anges pÄ DAG-nivÄ kan ÄsidosÀttas pÄ uppgiftsnivÄ.
En separat process — Scheduler — ansvarar för schemalĂ€ggningen av alla uppgifter i Airflow. Faktiskt handlar Scheduler om all mekanik kring att stĂ€lla uppgifter för exekvering. En uppgift gĂ„r igenom flera steg innan den kan exekveras:

  1. I DAG:en har tidigare uppgifter slutförts, en ny kan sÀttas i kö.
  2. Kön sorteras baserat pÄ uppgifternas prioritet (prioriteter kan ocksÄ hanteras) och om det finns en ledig plats i poolen kan uppgiften tas i arbete.
  3. Om det finns en ledig worker celery, skickas uppgiften dit; arbetet som du programmerat i uppgiften börjar, med hjÀlp av den operatör du angav.

Det Àr ganska enkelt.

SchemalÀggaren fungerar pÄ flera av alla DAG:ar och alla uppgifter inom DAG:arna.

För att schemalÀggaren ska börja arbeta med DAG:en mÄste en schema anges för DAG:en:

dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='@hourly')

Det finns en uppsÀttning fÀrdiga förinstÀllningar: @once, @hourly, @daily, @weekly, @monthly, @yearly.

Det Àr ocksÄ möjligt att anvÀnda cron-uttryck:

dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='*\/10 * * * *')

Körning Datum

För att förstĂ„ hur Airflow fungerar Ă€r det viktigt att veta vad körning datum Ă€r för en DAG. I Airflow har en DAG en dimension för körning datum, det vill sĂ€ga, baserat pĂ„ schemat för DAG:ens arbete skapas instanser av uppgifter för varje körning datum. Och för varje körning datum kan uppgifterna utföras igen — eller till exempel kan en DAG utföra samtidigt pĂ„ flera körning datum. Detta visas tydligt hĂ€r:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

TyvÀrr (eller kanske lyckligtvis: beroende pÄ situationen), om implementeringen av uppgiften i DAG:en Àndras, kommer utförandet i tidigare körning datum att följa de nya justeringarna. Detta Àr bra om du behöver berÀkna data frÄn tidigare perioder med en ny algoritm, men dÄligt eftersom reproducerbarheten av resultatet gÄr förlorad (naturligtvis hindrar ingen dig frÄn att ÄtervÀnda till rÀtt version av koden frÄn Git och en gÄng berÀkna det som behövs, pÄ det sÀtt som behövs).

Generering av uppgifter

Implementeringen av DAG:en Àr kod pÄ Python, sÄ vi har ett mycket bekvÀmt sÀtt att minska kodens storlek nÀr vi arbetar, till exempel med sharder kÀllor. Anta att du har tre MySQL-sharder som kÀllor, du mÄste gÄ in i varje och hÀmta viss data. OcksÄ oberoende och parallellt. Koden pÄ Python i DAG:en kan se ut sÄ hÀr:

connection_list = lv.get('connection_list')

export_profiles_sql = '''
SELECT
  id,
  user_id,
  nickname,
  gender,
  {{params.shard_id}} as shard_id
FROM profiles
'''

for conn_id in connection_list:
    export_profiles = SqlToHiveViaHdfsTransfer(
        task_id='export_profiles_from_' + conn_id,
        sql=export_profiles_sql,
        hive_table='stg.profiles',
        overwrite=False,
        tmpdir='\/data\/tmp',
        conn_id=conn_id,
        params={'shard_id': conn_id[-1:], },
        compress=None,
        dag=dag
    )
    export_profiles.set_upstream(exec_truncate_stg)
    export_profiles.set_downstream(load_profiles)

DAG ser ut sÄ hÀr:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

Du kan ocksÄ lÀgga till eller ta bort en shard genom att justera instÀllningarna och uppdatera DAG. Praktiskt!

Du kan anvÀnda en mer komplex kodgenerering, till exempel arbeta med datakÀllor i form av databaser eller beskriva tabellstrukturen, arbetsalgoritmen med hÀnsyn till DWH-infrastrukturens sÀrdrag och generera laddningsprocesser för N-tabeller till ditt datalager. Eller, till exempel, om du arbetar med ett API som inte stöder parametrar i listaform, kan du generera N-uppgifter i DAG:en baserat pÄ den listan, begrÀnsa parallelliteten av API-anrop till en pool och hÀmta de nödvÀndiga uppgifterna frÄn API:t. Flexibelt!

FörrÄd

I Airflow finns det ett eget backend-repository, en databas (kan vara MySQL eller Postgres, vi anvÀnder Postgres) dÀr tillstÄnd av uppgifter, DAG:ar, anslutningsinstÀllningar, globala variabler osv. lagras. HÀr vill jag nÀmna att repositoryt i Airflow Àr mycket enkelt (ungefÀr 20 tabeller) och anvÀndarvÀnligt, ifall du vill bygga en egen process ovanpÄ den. Jag minns 100500 tabeller i Informatica-repositoryt som man var tvungen att sÀtta sig in i lÀnge innan man förstod hur man bygger en förfrÄgan.

Övervakning

Med tanke pÄ enkelheten i repositoryt kan du sjÀlv bygga en process för övervakning av uppgifter som passar dig. Vi anvÀnder en anteckningsbok i Zeppelin dÀr vi övervakar uppgifternas tillstÄnd:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

Det kan ocksÄ vara webgrÀnssnittet för Airflow:

Airflow Àr ett verktyg för att bekvÀmt och snabbt utveckla och underhÄlla batchprocesser för databehandling

Airflow-koden Àr öppen, sÄ vi har lagt till larm via Telegram. Varje fungerande instans av en uppgift, om ett fel intrÀffar, spam-ar i en Telegram-grupp dÀr hela utvecklings- och supportteamet Àr med.

Vi fÄr snabb reaktion via Telegram (om det behövs) och genom Zeppelin en allmÀn översikt över uppgifterna i Airflow.

Sammanfattningsvis

Airflow Ă€r först och frĂ€mst open source och du behöver inte vĂ€nta pĂ„ mirakel frĂ„n det. Var beredd att investera tid och engagemang för att bygga en fungerande lösning. MĂ„let Ă€r inom rĂ€ckhĂ„ll, tro mig, det Ă€r vĂ€rt det. Utvecklingshastighet, flexibilitet, enkelhet i att lĂ€gga till nya processer — du kommer att gilla det. SjĂ€lvklart behöver man lĂ€gga stor vikt vid projektorganisationen, stabiliteten i Airflows arbete: mirakel finns inte.

Nu kör Airflow dagligen ungefĂ€r 6,5 tusen uppgifter. De Ă€r ganska olika till sin karaktĂ€r. Det finns uppgifter för datalastning till det primĂ€ra DWH frĂ„n mĂ„nga olika och mycket specifika kĂ€llor, det finns uppgifter för berĂ€kning av datavitriner inom det primĂ€ra DWH, det finns uppgifter för publicering av data i ett snabbt DWH, det finns mĂ„nga olika uppgifter — och Airflow hanterar allt detta dag efter dag. Om vi pratar siffror sĂ„ handlar det om 2,3 tusen ELT-uppgifter av olika komplexitet inom DWH (Hadoop), cirka 2,5 hundra databaser kĂ€llor, detta Ă€r ett team av fyra ETL-utvecklare, som delar upp sig mellan ETL-bearbetning av data i DWH och ELT-bearbetning av data inom DWH, och förstĂ„s Ă€ven en administratör, som ansvarar för tjĂ€nstens infrastruktur.

Framtidsplaner

Antalet processer vĂ€xer ofrĂ„nkomligen, och det huvudsakliga vi kommer att fokusera pĂ„ nĂ€r det gĂ€ller infrastrukturen för Airflow — Ă€r skalning. Vi vill bygga en Airflow-kluster, avsĂ€tta ett par noder för Celery-arbetare och skapa en duplicerad huvudnod med schemalĂ€ggningsprocesser och ett repository.

Epilog

Detta Ă€r förstĂ„s lĂ„ngt ifrĂ„n allt jag skulle vilja berĂ€tta om Airflow, men jag har försökt att belysa de viktigaste punkterna. Aptiten kommer under matlagning, prova — och ni kommer att gilla det 🙂

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster