Dans Spark 2.2, l'option Optimiseur basé sur les coûts a été activée. La documentation semble dire que nous devons analyser les tables dans Spark avant d'activer cette option. J'aimerais savoir si cette option est utile lorsque toutes les données des tables proviennent de Hive comme couche de stockage des données. Puisque Spark lira Hive en utilisant Hivetablescan (en évitant Map/Reduce), cela a-t-il un sens d'utiliser la configuration CBO lorsque les données sont lues depuis Hive.
Réponses
Trop de publicités?1 Liner :
Oui CBO (spark.sql.cbo.enabled=true) est utile avec les tables Hive également.
Explication :
Une HiveTable dans Spark est représentée par HiveTableRelation classe. Une table Spark (ou une table DataSource) est représentée par LogicalRelation classe. Ces deux classes étendent LeadNode. Spark fait abstraction des statistiques de toutes sortes de LogicalPlan en utilisant la méthode "computeStats". Chaque classe peut donner son implémentation pour computeStats.
Dans le code, nous pouvons voir que la classe HiveTableRelation a surchargé cette méthode pour retourner les statistiques au niveau des tables et des colonnes si elles sont disponibles. La même chose est faite par LogicalRelation classe.
Dans HiveTableRelation :
override def computeStats(conf: SQLConf): Statistics = {
tableMeta.stats.map(_.toPlanStats(output)).getOrElse {
throw new IllegalStateException("table stats must be specified.")
}
}
Ceci appelle à son tour tableMeta.stats.map(_.toPlanStats(output)).
Code dans CatalogStatistics :
def toPlanStats(planOutput: Seq[Attribute]): Statistics = {
val matched = planOutput.flatMap(a => colStats.get(a.name).map(a -> _))
Statistics(sizeInBytes = sizeInBytes, rowCount = rowCount,
attributeStats = AttributeMap(matched))
}
Cela montre que Spark HiveTableRelation a également surchargé computeStats et cette méthode renvoie toutes les statistiques au niveau de la table ainsi qu'au niveau des colonnes. Donc si une table a des statistiques générées, elles seront utilisées par CBO pour optimiser le plan.
spark.sql.cbo.enabled=true
es PAS utile pour les tables Hive, sauf siANALYZE TABLE <tblname> COMPUTE STATISTICS NOSCAN
(Statistiques de base pour le tableau, utiliser FOR COLUMN
pour les statistiques au niveau des colonnes) est déclenché par Spark.
Spark ne peut pas se servir des statistiques collectées lors de l'exécution de la fonction ANALYZE
à partir de Hive.
Il ne peut utiliser les statistiques que si elles sont calculées à partir du moteur Spark.
Comment les statistiques sont-elles stockées dans la table Hive
Les statistiques sont stockées dans une table Hive dans la section TBLPROPERTIES
.
Toutes les statistiques Spark ont des clés avec le préfixe spark.sql.statistics
.
Référence du code .