Einführung in Netflix Genie

1. Übersicht

In diesem Tutorial werden wir die Genie-Engine untersuchen, die Netflix entwickelt hat, um Jobs auf abstrakte Weise an Cluster zu senden .

Grundkenntnisse über die Verarbeitung großer Datenmengen, beispielsweise mit Hadoop und Spark, werden für dieses Lernprogramm empfohlen.

2. Warum Genie?

Stellen wir uns vor, wir haben viele Benutzer, die verschiedene Aufgaben an eine Cloud senden müssen, die eine große Anzahl von Hadoop-Clustern unterschiedlicher Größe enthält . Während einige Cluster erstellt werden, um Daten zu bestimmten Zeiten zu verarbeiten, konzentrieren sich andere auf das Herunterfahren von Diensten, um Ressourcen freizugeben. Benutzer würden daher auf das Problem stoßen, den richtigen Cluster für ihren Job zu finden.

Angenommen, viele Benutzer möchten nicht einmal Cluster erstellen oder wissen nichts über die Konfiguration, könnte dies ein echtes Problem sein. Wie wäre es mit einer Möglichkeit für Benutzer, einfach ihre Jobs einzureichen und die Ergebnisse zurückzugewinnen, ohne sich um die Einrichtung der Infrastruktur kümmern zu müssen?

3. Was ist Genie?

Netflix hat Genie als verteilte Engine entwickelt, um die oben genannten Probleme genau zu lösen. Eine Engine, die einheitliche RESTful-APIs für die autonome Übermittlung von Jobs bereitstellt . Genie trennt das Starten von Jobs von der Konfiguration, wodurch Cluster flexibel skaliert werden können.

Genie skaliert Cluster jedoch nicht selbst - es erfüllt lediglich Benutzeraufgaben, indem es seine Jobs in einem Cluster startet, das seinen Jobanforderungen entspricht.

Für die Planung wurde Genie auch nicht entwickelt. Der Hauptzweck ist das Jobmanagement auf einer einzelnen Jobebene.

Für die Workflow-Planung sollten andere Tools wie Apache Oozie verwendet werden. In der Tat stellt Netflix klar fest, dass:

Genie ist kein Workflow-Scheduler wie Oozie. Genies Ausführungseinheit ist ein einzelner Hadoop-, Hive- oder Pig-Job. Genie plant oder führt keine Workflows aus. Tatsächlich verwenden wir bei Netflix einen Enterprise Scheduler (UC4), um unsere ETL auszuführen.

Trotzdem bietet Genie APIs zum Verwalten von Ressourcen wie Clustern, Anwendungen und Befehlen. Nach der Registrierung der Ressourcen können Benutzer diese erkennen und ihre Aufträge senden.

Schließlich ist anzumerken, dass Genie ein Open-Source-Projekt ist, das mehr oder weniger auf die spezifischen Anforderungen von Netflix zugeschnitten ist. Es spielt eine wichtige Rolle in der sich schnell ändernden Cloud-Umgebung von Netflix und lässt sich in den Technologie-Stack von Netflix integrieren.

4. Genie in Aktion

Lassen Sie uns nun Genie in Aktion sehen, um ein besseres Verständnis dafür zu erlangen, wie wir damit Aufträge einreichen können. Als Einführung arbeiten wir uns durch die Genie-Demo, die auf GitHub verfügbar ist.

4.1. Voraussetzungen

Dieses Beispiel erfordert:

  • die neuesten Docker- und Docker Compose-Versionen (oder Docker Desktop, das beide enthält)
  • die folgenden freien Ports: 8080, 8088, 19888, 19070, 19075, 8089, 19889, 19071 und 19076
  • Ein relativ leistungsfähiger Computer mit mindestens 8 GB RAM, von denen 4 GB Docker zugewiesen werden sollten
  • mindestens 4 GB Speicherplatz

4.2. Cluster-Setup

Zunächst müssen wir uns darum kümmern , unsere Cluster mit Docker Compose einzurichten , indem wir docker-compose.yml in einen Ordner unserer Wahl herunterladen . Dazu erstellen wir ein neues Verzeichnis mit dem Namen demoDir . Die Erstellungsdatei definiert fünf Dienste, die wir nacheinander untersuchen werden.

Schauen wir uns zunächst den Genie-Server an, der in einem Container namens genie_demo_app_3.3.9 ausgeführt wird , der Port 8080 der Genie-Benutzeroberfläche zuordnet :

genie: image: netflixoss/genie-app:3.3.9 ports: - "8080:8080" depends_on: - genie-hadoop-prod - genie-hadoop-test - genie-apache tty: true container_name: genie_demo_app_3.3.9

Der zweite Dienst ist genie_demo_apache_3.3.9, der zum Herunterladen der für die Demo erforderlichen Dateien verwendet wird:

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

Als nächstes folgt der Genie-Client, der Beispielskripte zum Senden von Jobs mit Genie enthält. Der Containername lautet genie_demo_client_3.3.9 :

genie-client: image: netflixoss/genie-demo-client:3.3.9 depends_on: - genie tty: true container_name: genie_demo_client_3.3.9

Als nächstes kommt unser Hadoop-Cluster für die Produktion (SLA). Dieser Service erhält unsere eingereichten Aufträge. Der Cluster-Ressourcenmanager wird Port 8088 zugeordnet, während der Verlaufsserver 19888 erhält.

Wir werden hier eine kleine Anpassung vornehmen und den benannten Knoten und den Datenknoten Port 19070 bzw. 19075 zuordnen:

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

Lassen Sie uns abschließend den Test-Hadoop-Container untersuchen, der den Testcluster darstellt. Ähnlich wie beim Produktionscluster werden ihm die Ports 8089 (Ressourcenmanager), 19889 (Verlaufsserver), 19071 (benannter Knoten) und 19076 (Datenknoten) zugewiesen:

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

Beginnen wir die oben genannten Container, indem wir docker -compose von demoDir aus ausführen. Die Ausführung dauert beim ersten Ausführen länger, da die Demo-Images heruntergeladen werden müssen:

cd demoDir docker-compose up -d

Wir können überprüfen, ob der Cluster aktiv und bereit ist, indem wir Folgendes überprüfen:

  • Genie UI: // localhost: 8080
  • Benutzeroberfläche des SLA-Cluster-Ressourcenmanagers: // localhost: 8088
  • Benutzeroberfläche des TEST-Cluster-Ressourcenmanagers: // localhost: 8089

4.3. Init Demo

Nachdem die Demo-Container ausgeführt wurden, können wir uns jetzt mit einem Docker-Exec- Befehl beim Client-Container anmelden :

docker exec -it genie_demo_client_3.3.9 /bin/bash

Jetzt führen wir im Client-Container ein Init-Skript aus, um die Cluster auf die Annahme unserer Jobs vorzubereiten :

./init_demo.py

Wenn die Demo erfolgreich ausgeführt wird, zeigt die Genie-Benutzeroberfläche Daten in den Clustern, Befehlen und Anwendungsregistern an.

4.4. Jobübermittlung

Als weiteres Beispiel senden wir einen Spark-Job, um die ersten 10 Dezimalstellen von π zu berechnen. Wir können den Job entweder einem Test oder einem SLA übergeben, indem wir das entsprechende Literal als Argument an das Skript übergeben:

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

Auf der Registerkarte "Jobs" in der Genie-Benutzeroberfläche können Sie in jeder Jobbeschreibung auf das Ordnersymbol klicken, um zum Ausgabeordner zu navigieren . Von dort aus können wir nach einem erfolgreichen Abschluss den berechneten Wert unter stdout finden.

Auf der Benutzeroberfläche des Hadoop-Ressourcenmanagers werden auch Clusterjobs angezeigt.

Schließlich verlassen wir den Client-Container, stoppen und entfernen alle Demo-Container, indem wir Folgendes ausführen:

docker-compose down

Die Bilder sind weiterhin auf der Festplatte verfügbar, und wir können die Demo-Container jederzeit erneut starten.

5. Schlussfolgerung

In diesem Tutorial haben wir Genie vorgestellt, ein von Netflix entwickeltes Jobmanagement-Tool.

Wir haben dann eine Demo durchlaufen, die uns ein praktisches Beispiel dafür gab, wie wir Genie in realen Szenarien einsetzen können.

Das Codebeispiel befindet sich wie immer auf GitHub.