Meilleure réponse
Dans tous les tests de performance possibles, Spark Sql est «beaucoup» plus rapide que Hive. Bien que Facebook ait proposé Presto – une copie bon marché du design de Spark sous le capot de la ruche et il existe également une version plus récente de la ruche sur Tez – dont la mésaventure avec les DAG est bien documentée ici Le Tragédie de Tez , mais dans toutes les tâches liées à SQL (par exemple, côté carte sqls => filtre, mutation des données ou réduction côté Sqls => fonctions de tri / agrégation / fenêtre), Spark brille toujours.
Comme la question ne demande pas «Pourquoi», je nentrerai pas beaucoup dans ces détails techniques. Mais juste pour vous donner une idée, pensez à un modèle de traitement de données distribué où chaque tâche doit écrire lensemble de données (avec réplication) quelle détient avant de se terminer, où lapplication est incapable de mesurer lutilisation des ressources par elle-même et où se trouve lapplication. la miséricorde du gestionnaire de cluster lors du lancement de la tâche / étape dexécution et comparez cela avec un autre modèle de traitement de données distribué où les tâches peuvent vivre en mémoire la plupart du temps, où les ressources peuvent être allouées intelligemment par le moteur et où le cadre peut sasseoir en haut dun gestionnaire de cluster et dépend du gestionnaire de cluster pour rien – autre que lallocation de conteneur (et un petit peu de dé / sérialisation qui peut même être contourné)
(et pour rester bref, na pas mentionnez même Spark 1.6 / 2.x intensifiant le jeu avec Tungsten ou limplémentation simd pour loptimisation des requêtes)
Quel modèle pensez-vous gagnerait la bataille de la latence?
Réponse
Commençons par votre requête : Hive implémente un sous-ensemble de SQL – le langage Hive ( LanguageManual – Apache Hive – Apache Software Foundation ) qui est spécifique aux fonctionnalités de Hive et Hadoop. Votre requête soumise est décomposée en éléments, prédicats, qui sont implémentables dans des opérations ou des étapes. Le SELECT col1 , col2 ,… coln spécifie quelles colonnes de chaque ligne renvoyée seront conservées et renvoyées dans lensemble de solutions. De même, une jointure GAUCHE ou DROITE serait implémentée dans un état spécifique, probablement une étape de réduction de mappage (M\_R). Une fois que votre requête a été séparée en éléments correspondant à des opérations spécifiques, lOptimiseur basé sur les coûts (CBO) utilise des statistiques collectées et stockées pour prendre des décisions intelligentes sur la manière dont chacune de ces étapes sera exécutée. Par exemple, une clause WHERE peut être implémentée en tant que balayage de table, si elle nest pas très spécifique (faible cardinalité) ou si une table nest pas partitionnée, ou elle peut entraîner lélimination de partition si la table est partitionnée et la clause WHERE spécifie les colonnes de partition avec une spécificité élevée. Si une requête spécifie plusieurs jointures, chaque jointure sera implémentée en tant quétape Map-Reduce. Si lune des tables de jointure est très petite, un Map-Join peut être sélectionné pour exécution par le CBO pour de meilleures performances.
Une fois que le CBO a établi un plan dexécution, les étapes sont planifiées et exécutées, généralement en plusieurs étapes MR. Vous pouvez examiner le plan dexécution que le CBO utiliserait pour exécuter une requête donnée en exécutant un EXPLAIN sur la requête.
Javais un client de lindustrie vidéo qui recueillait des statistiques sur les habitudes de visionnage de ses utilisateurs. Ces statistiques ont été rassemblées dans un très grand tableau (100 de TiB) que le client souhaitait joindre à environ 20 tableaux relativement petits contenant des données sur chaque vidéo, les acteurs de la vidéo, lintrigue de chaque vidéo, les données de production, etc. Jai créé des vues qui ont successivement joint les tables plus petites qui ont finalement été jointes avec la table de visualisation à une vue de résultat, qui a ensuite été écrite dans une table de sortie. Lorsque jai soumis une requête simple pour sélectionner la vue des résultats dans la table de sortie (CREATE TABLE output (…) AS SELECT * FROM results\_view) Hive a créé une requête en 25 étapes qui a matérialisé toutes les vues intermédiaires dans la vue finale qui a ensuite été écrite à la table de sortie. Étant donné que chaque étape était un travail M-R (pour YARN) et que le temps de configuration pour un travail M-R était denviron 30 secondes pour ce cluster, environ 12 à 14 minutes ont été consacrées au temps de configuration M-R. La plupart des étapes M-R exécutées en moins de 45 secondes, dont 2/3 étaient le temps de configuration M-R et 1/3 lexécution réelle. La jointure finale de la carte des plus petites tables à la table des statistiques du spectateur a pris encore 20 minutes. La création dun tas de vues qui ont été successivement jointes dans une table de résultats ma permis de créer un pipeline qui a été assemblé avec un tas de requêtes relativement simples, plutôt que dessayer de créer une requête massive qui essaierait de joindre plus de 20 tables en une seule requête.