131 votes

Quels sont les avantages et les inconvénients du parquet format par rapport aux autres formats ?

Caractéristiques de Apache Parquet sont :

  • L'auto-description de
  • Format de colonne
  • Indépendant de la langue

En comparaison à d'Avro, Séquence de Fichiers, Fichier RC etc. Je veux une vue d'ensemble des formats. J'ai déjà lu : Comment Impala Fonctionne avec Hadoop Formats de Fichier , il donne quelques indications sur les formats, mais je voudrais savoir comment l'accès aux données et le stockage des données se fait dans chacun de ces formats. Comment le parquet a un avantage sur les autres?

274voto

Tom Harrison Jr Points 5855

Je pense que la principale différence que je peux décrire se rapporte à l'enregistrement orienté vs orienté colonne formats. Enregistrer des formats adaptés à ce que nous nous sommes tous habitués à -- fichiers texte délimité par des formats tels que CSV, TSV. AVRO est un peu plus frais que ceux car il peut changer de schéma au fil du temps, par exemple en ajoutant ou en supprimant des colonnes à partir d'un enregistrement. D'autres astuces de différents formats (y compris la compression) impliquent de savoir si un format peut être fractionné -- c'est, pouvez-vous lire un bloc de documents à partir de n'importe où dans le jeu de données et toujours savoir ce schéma? Mais voici plus de détails sur les colonnes des formats comme le Parquet.

Parquet, et d'autres colonnes formats de gérer une commune Hadoop situation de manière très efficace. Il est courant d'avoir des tables (ensembles de données) d'avoir beaucoup plus de colonnes que vous attendez dans un système bien conçu de base de données relationnelle-un cent ou deux cents colonnes n'est pas inhabituel. C'est donc parce que nous utilisons souvent Hadoop comme un lieu de dénormaliser les données de formats relationnels -- oui, vous avez beaucoup de valeurs répétées et de nombreuses tables de tous aplati en un seul. Mais il devient beaucoup plus facile d'interroger depuis toutes les jointures. Il y a d'autres avantages comme le maintien de l'état des données en temps. De toute façon il est courant d'avoir une cargaison de colonnes dans une table.

Disons qu'il y a 132 colonnes, et certains d'entre eux sont vraiment long des champs de texte, chaque colonne l'un après l'autre et l'utilisation de la peut-être de 10K par enregistrement.

Alors que l'interrogation de ces tables est facile avec SQL point de vue, il est fréquent que vous aurez envie d'obtenir un ensemble de documents basé uniquement sur quelques-uns de ces cent-plus de colonnes. Par exemple, vous pourriez voulez que tous les records en février et en Mars pour les clients avec un chiffre d'affaires > $500.

Pour ce faire, dans un format de ligne de la requête aurait besoin d'analyser chaque enregistrement de la base de données. Lire la première ligne, l'analyse de l'enregistrement dans les champs (colonnes) et obtenir la date et la vente de colonnes, de l'inclure dans votre résultat si elle satisfait la condition. Répétez. Si vous avez 10 ans (120 mois) de l'histoire, vous êtes en train de lire chaque enregistrement unique juste pour trouver 2 de ces mois. Bien sûr, c'est une excellente occasion d'utiliser une partition sur l'année et le mois, mais même alors, vous êtes à la lecture et analyse de 10K de chaque enregistrement/ligne pour ces deux mois juste pour savoir si le client les ventes sont > $500.

Dans un format de colonne, chaque colonne (champ) d'un enregistrement est stocké avec les autres de son genre, se répandre sur de nombreux différents blocs sur le disque -- colonnes pour l'année ensemble, les colonnes pour les mois, les colonnes pour le client manuel de l'employé (ou d'un autre texte long), et tous les autres qui font de ces enregistrements tellement énorme dans leur propre endroit sur le disque, et bien sûr des colonnes pour les ventes ensemble. Bien heck, la date et le mois sont des nombres, et ainsi sont les ventes, ils sont juste un peu d'octets. Ne serait-il pas génial si on n'avait qu'à lire quelques octets pour chaque enregistrement de déterminer les enregistrements qui correspondait à notre requête? Le stockage en colonnes à la rescousse!

Même sans partitions, la numérisation des petits champs nécessaires pour répondre à notre requête est super-rapide -- ils sont tous dans l'ordre d'enregistrement, et toutes de la même taille, de sorte que le disque cherche plus de beaucoup moins de données vérification de l'inclusion de documents. Pas besoin de lire que le manuel de l'employé et d'autres champs de texte -- il suffit de les ignorer. Ainsi, en regroupant les colonnes les unes avec les autres, au lieu de lignes, vous pouvez presque toujours analyser les moins de données. De gagner!

Mais attendez, ça va mieux. Si votre requête a seulement besoin de connaître ces valeurs, et un peu plus (disons 10 de la 132 colonnes) et ne se soucient pas que le manuel de l'employé de la colonne, une fois qu'il avait choisi la bonne enregistrements à revenir, il n'ont plus qu'à retourner pour le 10 colonnes nécessaires pour rendre les résultats, en ignorant les autres 122 de la 132 dans notre base de données. Encore une fois, nous passer un beaucoup de lecture.

(Note: pour cette raison, en forme de colonne formats sont un mauvais choix quand on fait tout droit des transformations, par exemple, si vous êtes joindre deux tables dans une grande(ger) jeu de résultats que vous êtes en train d'enregistrer une nouvelle table, les sources vont obtenir scannées de toute façon, donc il n'y a pas beaucoup de bénéfices dans les performances en lecture, et parce que les colonnes formats devez vous rappeler plus sur l'anatomie, ils utilisent plus de mémoire qu'un semblable format de ligne).

Un autre avantage de colonnes: les données sont réparties autour de. Pour obtenir un enregistrement unique, vous pouvez avoir 132 travailleurs chaque lire (et écrire) les données de/à 132 différents endroits sur la 132 blocs de données. Yay pour la parallélisation!

Et maintenant, pour le pneu: algorithmes de compression fonctionne beaucoup mieux si on peut trouver des schémas répétitifs. Vous pourriez comprimer AABBBBBBCCCCCCCCCCCCCCCC comme 2A6B16C mais ABCABCBCBCBCCCCCCCCCCCCCC ne le ferais pas comme les petits (et, en fait, dans ce cas, il serait, mais croyez-moi :-) ). Donc, encore une fois, moins de la lecture. Et l'écriture aussi.

Nous lisons beaucoup moins de données pour répondre à des questions courantes, c'est potentiellement plus rapide à lire et à écrire en parallèle, et que la compression a tendance à travailler beaucoup mieux.

Colonnaire est idéal lors de votre côté d'entrée est grand, et que votre sortie est un sous-ensemble filtré: du plus grand au plus petit est grand. N'est pas aussi bénéfique lors de l'entrée et les sorties sont sur le même.

Mais dans notre cas, l'Impala a pris nos vieux requêtes Hive qui a couru dans les 5, 10, 20 ou 30 minutes, et a terminé plus dans quelques secondes ou une minute.

Espérons que cela permet de répondre à au moins une partie de votre question!

51voto

afuc func Points 412

L'Avro est une ligne basée sur le format de stockage pour Hadoop.

Le Parquet est une colonne basée sur le format de stockage pour Hadoop.

Si votre cas d'utilisation, généralement des analyses ou récupère tous les champs dans une ligne dans chaque requête, l'Avro est généralement le meilleur choix.

Si votre jeu de données a beaucoup de colonnes, et votre cas d'utilisation implique généralement de travailler avec un sous-ensemble de ces colonnes plutôt que de l'ensemble des dossiers, du Parquet qui est optimisée pour ce genre de travail.

Source

24voto

Justin Kestelyn Points 666

Tom réponse est assez détaillée et exhaustive, mais vous pourriez également être intéressé par cette simple étude sur Parquet vs Avro fait à Allstate Insurance, en voici un résumé:

"Dans l'ensemble, le Parquet a montré similaires ou meilleurs résultats pour chaque test, [que Avro]. La requête des écarts de rendement sur les plus grands ensembles de données en Parquet faveur sont en partie dus à la compression des résultats; lors de l'interrogation du large jeu de données, Étincelle eu à lire 3,5 x moins de données pour les Parquets que Avro. Avro n'a pas bien lors du traitement de l'ensemble du jeu de données, comme suspect."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X