Introduction à Netflix Genie

1. Vue d'ensemble

Dans ce tutoriel, nous allons explorer le moteur Genie, que Netflix a développé pour soumettre des travaux à des clusters de manière abstraite .

Des connaissances de base sur le traitement du Big Data, par exemple avec Hadoop et Spark, sont recommandées pour ce didacticiel.

2. Pourquoi Genie?

Imaginons que nous ayons de nombreux utilisateurs qui doivent soumettre diverses tâches à un cloud contenant un grand nombre de clusters Hadoop de différentes tailles . Alors que certains clusters sont créés pour traiter des données à des moments spécifiques, d'autres sont centrés sur l'arrêt des services pour libérer des ressources. Les utilisateurs se heurteraient donc au problème de trouver le bon cluster pour leur travail.

En supposant que de nombreux utilisateurs ne souhaitent même pas créer de clusters ou connaître la configuration, cela pourrait être un réel problème. Que diriez-vous de fournir aux utilisateurs un moyen de simplement soumettre leurs travaux et de récupérer les résultats sans avoir à gérer la configuration de l'infrastructure?

3. Qu'est-ce que Genie?

Netflix a construit Genie en tant que moteur distribué pour résoudre exactement les problèmes susmentionnés. Un moteur qui fournit des API RESTful unifiées pour soumettre des travaux de manière autonome . Genie sépare les tâches de lancement de la configuration, ce qui permet la mise à l'échelle des clusters de manière flexible.

Cependant, Genie ne met pas à l'échelle les clusters lui-même - il accomplit simplement les tâches des utilisateurs en démarrant leurs travaux sur un cluster qui correspond à leurs besoins.

La planification n'est pas quelque chose pour lequel Genie a été conçu non plus. L'objectif principal est la gestion des tâches à un seul niveau de travail.

Pour la planification du flux de travail, d'autres outils comme Apache Oozie doivent être utilisés. En fait, Netflix déclare clairement que:

Genie n'est pas un planificateur de workflow, comme Oozie. L'unité d'exécution de Genie est un seul travail Hadoop, Hive ou Pig. Genie ne programme ni n'exécute de flux de travail - en fait, nous utilisons un planificateur d'entreprise (UC4) chez Netflix pour exécuter notre ETL.

Néanmoins, Genie propose des API pour gérer des ressources telles que des clusters, des applications et des commandes. Après avoir enregistré les ressources, les utilisateurs peuvent les découvrir et commencer à soumettre leurs travaux.

Enfin, il convient de noter que Genie est un projet open-source adapté plus ou moins aux besoins spécifiques de Netflix. Il joue un rôle important dans l'environnement cloud en évolution rapide de Netflix et s'intègre à la pile technologique de Netflix.

4. Génie en action

Voyons maintenant Genie en action pour mieux comprendre comment nous pouvons l'utiliser pour soumettre des travaux. En guise d'introduction, nous allons travailler notre chemin à travers la démo Genie disponible sur GitHub.

4.1. Conditions préalables

Cet exemple nécessite:

  • les dernières versions de Docker et Docker Compose (ou Docker Desktop, qui comprend les deux)
  • les ports francs suivants: 8080, 8088, 19888, 19070, 19075, 8089, 19889, 19071 et 19076
  • une machine relativement puissante avec au moins 8 Go de RAM dont 4 Go doivent être affectés au docker
  • au moins 4 Go d'espace disque

4.2. Configuration du cluster

Tout d'abord, nous devons nous occuper de la configuration de nos clusters à l'aide de Docker Compose en téléchargeant docker-compose.yml dans un dossier de notre choix. Pour cela, créons un nouveau répertoire nommé demoDir . Le fichier compose définit cinq services que nous allons explorer un par un.

Tout d'abord, jetons un coup d'œil au serveur Genie qui fonctionnera dans un conteneur nommé genie_demo_app_3.3.9 qui mappe le port 8080 à l'interface utilisateur Genie:

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

Le deuxième service est genie_demo_apache_3.3.9 qui est utilisé pour télécharger les fichiers requis par la démo:

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

Le client Genie vient ensuite, qui contient des exemples de scripts pour soumettre des travaux à l'aide de Genie. Son nom de conteneur est 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

Notre cluster Hadoop de production (SLA) est le suivant. Ce service recevra nos offres d'emploi soumises. Le gestionnaire de ressources de cluster est mappé au port 8088 tandis que le serveur d'historique obtient 19888.

Nous allons faire un petit ajustement ici et mapper les nœuds nommés et de données aux ports 19070 et 19075 respectivement:

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

Enfin, explorons le conteneur Hadoop de test représentant le cluster de test. De la même manière que le cluster de production, il est attribué les ports 8089 (gestionnaire de ressources), 19889 (serveur d'historique), 19071 (nœud nommé) et 19076 (nœud de données):

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

Commençons les conteneurs mentionnés ci-dessus en exécutant docker-compose à partir de demoDir. Cela prendra plus de temps à s'exécuter lors de la première exécution car il doit télécharger les images de démonstration:

cd demoDir docker-compose up -d

Nous pouvons vérifier que le cluster est opérationnel et prêt en vérifiant:

  • Genie UI: // localhost: 8080
  • Interface utilisateur du gestionnaire de ressources de cluster SLA: // localhost: 8088
  • Interface utilisateur du gestionnaire de ressources de cluster TEST: // localhost: 8089

4.3. Démo Init

Maintenant, après l'exécution des conteneurs de démonstration, nous pouvons nous connecter au conteneur client à l'aide d'une commande docker exec :

docker exec -it genie_demo_client_3.3.9 /bin/bash

Maintenant, à l'intérieur du conteneur client, nous exécutons un script d'initialisation pour préparer les clusters à accepter nos travaux :

./init_demo.py

Si la démonstration s'exécute avec succès, l'interface utilisateur Genie affichera les données dans les clusters, les commandes et les onglets d'application.

4.4. Soumission du travail

Comme autre exemple, soumettons un travail Spark pour calculer les 10 premiers chiffres décimaux de π. Nous pouvons soumettre le travail à un test ou à un SLA en passant le littéral correspondant en tant qu'argument au script:

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

À partir de l'onglet Jobs de Genie UI, nous pouvons cliquer sur l'icône de dossier dans chaque description de poste pour accéder à son dossier de sortie . De là, sur une finition réussie, nous pouvons trouver la valeur calculée sous stdout.

L'interface utilisateur du gestionnaire de ressources Hadoop affiche également les travaux de cluster.

Enfin, nous quittons le conteneur client, arrêtons et supprimons tous les conteneurs de démonstration en exécutant:

docker-compose down

Les images seront toujours disponibles sur le disque, et nous pouvons redémarrer les conteneurs de démonstration à tout moment.

5. Conclusion

Dans ce didacticiel, nous avons présenté Genie, un outil de gestion des tâches développé par Netflix.

Nous avons ensuite parcouru une démo, qui nous a donné un exemple pratique de la façon dont nous pouvons utiliser Genie dans des scénarios réels.

Comme toujours, l'exemple de code est sur GitHub.