Introduktion til Netflix Genie

1. Oversigt

I denne vejledning skal vi udforske Genie-motoren, som Netflix udviklede til aflevere job til klynger på en abstrakt måde.

Grundlæggende viden om big databehandling, for eksempel med Hadoop og Spark, anbefales til denne tutorial.

2. Hvorfor Genie?

Lad os forestille os, at vi har mange brugere, der har brug for det indsend forskellige opgaver til en sky, der indeholder et stort antal Hadoop-klynger i forskellige størrelser. Mens nogle klynger oprettes til at behandle data på bestemte tidspunkter, er andre centreret omkring nedlukning af tjenester for at frigøre ressourcer. Brugere vil således løbe ind i problemet med at finde den rigtige klynge til deres job.

Forudsat at mange brugere ikke engang vil oprette klynger eller vide om konfigurationen, kan dette være et reelt problem. Hvad med at give brugerne en måde at blot indsende deres job og få resultaterne tilbage uden at skulle beskæftige sig med infrastrukturopsætning?

3. Hvad er Genie?

Netflix byggede Genie som en distribueret motor til nøjagtigt at løse de ovennævnte problemer. En motor, der giver samlet RESTfulde API'er til indsendelse af jobautonomt. Genie adskiller lanceringsjob fra konfigurationen, som muliggør skalering af klynger fleksibelt.

Genie skalerer dog ikke klynger selv - det udfører simpelthen brugeropgaver ved at starte deres job på en klynge, der matcher deres jobbehov.

Planlægning er heller ikke noget, Genie blev bygget til. Hovedformålet er jobledelse på et enkelt jobniveau.

Til planlægning af workflow skal andre værktøjer som Apache Oozie bruges. Faktisk siger Netflix klart, at:

Genie er ikke en arbejdsgangsplanlægning, såsom Oozie. Genies eksekveringsenhed er et enkelt Hadoop-, Hive- eller Pig-job. Genie planlægger eller kører ikke arbejdsgange - faktisk bruger vi en enterprise scheduler (UC4) hos Netflix til at køre vores ETL.

Ikke desto mindre tilbyder Genie API'er til styring af ressourcer som klynger, applikationer og kommandoer. Efter registrering af ressourcerne kan brugerne opdage disse og begynde at indsende deres job.

Endelig er det værd at bemærke, at Genie er et open source-projekt, der er skræddersyet mere eller mindre til de specifikke behov hos Netflix. Det spiller en vigtig rolle i Netflix hurtigt skiftende skymiljø og integreres med Netflix's teknologiestak.

4. Genie i aktion

Lad os nu se Genie i aktion for at få en bedre forståelse af, hvordan vi kan bruge den til at indsende job. Som en introduktion arbejder vi os gennem Genie-demoen, der er tilgængelig på GitHub.

4.1. Forudsætninger

Dette eksempel kræver:

  • de nyeste Docker- og Docker Compose-versioner (eller Docker Desktop, som inkluderer begge dele)
  • følgende frihavne: 8080, 8088, 19888, 19070, 19075, 8089, 19889, 19071 og 19076
  • en relativt kraftig maskine med mindst 8 GB RAM, hvoraf 4 GB skal tildeles docker
  • mindst 4 GB diskplads

4.2. Klyngeopsætning

Først og fremmest skal vi passe på opsætning af vores klynger ved hjælp af Docker Compose ved at downloade docker-compose.yml til en mappe efter eget valg. Lad os oprette en ny mappe, der hedder dette demoDir. Komponeringsfilen definerer fem tjenester, som vi skal udforske en efter en.

Lad os først se på Genie-serveren, der kører i en container med navnet genie_demo_app_3.3.9 der kortlægger port 8080 til Genie UI:

genie: image: netflixoss / genie-app: 3.3.9 porte: - "8080: 8080" afhænger af: - genie-hadoop-prod - genie-hadoop-test - genie-apache tty: ægte containernavn: genie_demo_app_3.3.9

Den anden service er genie_demo_apache_3.3.9 som bruges til at downloade filer, der kræves af demoen:

genie-apache: billede: netflixoss / genie-demo-apache: 3.3.9 tty: true container_name: genie_demo_apache_3.3.9

Genie-klienten kommer derefter, som indeholder eksempler på scripts til at indsende job ved hjælp af Genie. Dens containernavn er genie_demo_client_3.3.9:

genie-klient: billede: netflixoss / genie-demo-klient: 3.3.9 afhænger_på: - genie tty: ægte containernavn: genie_demo_client_3.3.9

Vores produktion (SLA) Hadoop-klynge er den næste. Denne service modtager vores indsendte job. Klyngeressourcemanageren kortlægges til port 8088, mens historikserveren får 19888.

Vi foretager en lille justering her og kortlæg de navngivne og datanoder til henholdsvis port 19070 og 19075:

genie-hadoop-prod: image: sequenceiq / hadoop-docker: 2.7.1 kommando: / bin / bash -c "/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver && / etc / bootstrap. sh -bash "porte: -" 19888: 19888 "-" 19070: 50070 "-" 19075: 50075 "-" 8088: 8088 "tty: true container_name: genie_demo_hadoop_prod_3.3.9

Lad os endelig undersøge test Hadoop-beholderen, der repræsenterer testklyngen. På samme måde som produktionsklyngen tildeles portene 8089 (ressourcemanager), 19889 (historikserver), 19071 (navngivet node) og 19076 (datanode):

genie-hadoop-test: image: sequenceiq / hadoop-docker: 2.7.1 kommando: / bin / bash -c "/usr/local/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver && / etc / bootstrap. sh -bash "porte: -" 19889: 19888 "-" 19071: 50070 "-" 19076: 50075 "-" 8089: 8088 "tty: true container_name: genie_demo_hadoop_test_3.3.9

Lad os start de ovennævnte containere ved at køre docker-komponere fra demoDir. Dette vil tage længere tid at udføre, når det kører for første gang, da det skal downloade demobillederne:

cd demoDir docker-komponere op -d

Vi kan kontrollere, at klyngen er klar og klar ved at kontrollere:

  • Genie UI: // localhost: 8080
  • SLA cluster resource manager UI: // localhost: 8088
  • TEST cluster resource manager UI: // localhost: 8089

4.3. Indledende demo

Nu, efter at demo-containerne kører, kan vi logge ind på klientcontaineren ved hjælp af en docker exec kommando:

docker exec -it genie_demo_client_3.3.9 / bin / bash

Nu inde i klientcontaineren udfører vi et init-script til forbered klyngerne til at acceptere vores job:

./init_demo.py

Hvis demoen kører med succes, viser Genie UI data i klynger, kommandoer og applikationsfaner.

4.4. Jobindsendelse

Lad os som et andet eksempel indsende et Spark-job for at beregne de første 10 decimalcifre på π. Vi kan sende jobbet til enten test eller SLA ved at videregive den tilsvarende bogstavelige som et argument til scriptet:

./run_spark_submit_job.py sla 2.0.1. / run_spark_submit_job.py test 2.0.1

Fra fanen Job i Genie UI kan vi klikke på mappeikonet i hver jobbeskrivelse for at navigere til dets produktion folder. Derfra, på en vellykket finish, kan vi finde den beregnede værdi under stdout.

Hadoop-ressourcehåndteringsgrænsefladen viser også klyngejob.

Endelig forlader vi klientcontaineren, stopper og fjerner alle demo-containere ved at køre:

docker-komponere ned

Billederne vil stadig være tilgængelige på disken, og vi kan når som helst starte demo-containerne igen.

5. Konklusion

I denne vejledning har vi introduceret Genie, et jobstyringsværktøj udviklet af Netflix.

Derefter løb vi gennem en demo, som gav os et praktisk eksempel på, hvordan vi kan bruge Genie i virkelige scenarier.

Som altid er kodeeksemplet på GitHub.