web-dev-qa-db-fra.com

Table de rafraîchissement de la table de ruche externe vs réparation MSCK

J'ai une table Hive externe stockée en Parquet, partitionnée sur une colonne disons as_of_dt et les données sont insérées via spark streaming. Maintenant, chaque jour une nouvelle partition est ajoutée. Je fais msck repair table pour que le métastore Hive obtienne les informations de partition nouvellement ajoutées. Est-ce le seul moyen ou existe-t-il un meilleur moyen? Je m'inquiète si les utilisateurs en aval interrogeant la table, msck repair cause un problème de non disponibilité des données ou des données périmées? Je passais par l'API HiveContext et je voyais l'option refreshTable. Une idée si cela a du sens d'utiliser à la place refreshTable?

6
Ajith Kannan

Pour répondre directement à votre question, la table de réparation msck vérifiera si les partitions d'une table sont actives. Ce qui signifie que si vous avez supprimé une poignée de partitions et que vous ne voulez pas qu'elles apparaissent dans la commande show partitions pour la table, la table de réparation msck doit les supprimer. La réparation de Msck peut prendre plus de temps qu'une instruction d'invalidation ou d'actualisation, mais Invalidate Metadata ne s'exécute que dans Hive et ne met à jour que le Hast Metastore. L'actualisation s'exécute uniquement dans Spark SQL et met à jour le magasin de métadonnées Spark.

La métastore Hive devrait convenir si vous effectuez l'étape d'ajout de partition quelque part dans le traitement, mais si vous souhaitez accéder à la table Hive via Spark SQL, vous devrez mettre à jour les métadonnées via Spark (ou Impala ou un autre processus qui met à jour les métadonnées spark).

Chaque fois que vous mettez à jour ou modifiez le contenu d'une table Hive, la métastore Spark peut ne plus être synchronisée, vous empêchant d'interroger les données via le jeu de commandes spark.sql. Cela signifie que si vous souhaitez interroger les données dont vous avez besoin pour garder la métastore Spark synchronisée.

Si vous disposez d'une version Spark qui le permet, vous devez actualiser et ajouter des partitions aux tables Hive dans Spark, afin que toutes les métastores soient synchronisées. Voici comment je le fais:

//Non-Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation)
spark.sql("refresh table " + tableName)

//Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation + "/" + partition)
val addPartitionsStatement = "alter table" + tableName = " add if not exists partition(partitionKey='" + partition + "') location '" + fileLocation + "/" + partition + "'"
spark.sql(addPartitionsStatement)
spark.sql("refresh table " + tableName)
9
afeldman

Il semble que refreshTable actualise les métadonnées mises en cache, sans affecter les métadonnées Hive.

Doc dit:

Invalidez et actualisez toutes les métadonnées mises en cache de la table donnée. Pour des raisons de performances, Spark SQL ou la bibliothèque de sources de données externes qu'il utilise peut mettre en cache certaines métadonnées sur une table, telles que l'emplacement des blocs. Lorsque ceux-ci changent en dehors de Spark SQL, les utilisateurs doivent appeler cette fonction pour invalider le cache.

La méthode ne met pas à jour les métadonnées Hive, une réparation est donc nécessaire.

1
leftjoin