web-dev-qa-db-fra.com

Différence entre parquet Apache et flèche

Je cherche un moyen d'accélérer mon application frontale intensive en mémoire. J'ai vu certaines personnes recommander Apache Arrow, alors que j'y réfléchis, je suis confus quant à la différence entre Parquet et Arrow.

Ils sont tous deux une structure de données en colonnes. À l'origine, je pensais que le parquet était pour le disque et la flèche pour le format en mémoire. Cependant, je viens d'apprendre que vous pouvez également enregistrer la flèche dans des fichiers au bureau, comme abc.arrow Dans ce cas, quelle est la différence? Ne font-ils pas la même chose?

16
Audrey

Parquet est un format de fichier en colonnes pour la sérialisation des données. La lecture d'un fichier Parquet nécessite la décompression et le décodage de son contenu en une sorte de structure de données en mémoire. Il est conçu pour être efficace en termes d'espace/d'E/S au détriment de l'utilisation du processeur pour le décodage. Il ne fournit aucune structure de données pour le calcul en mémoire. Le parquet est un format de diffusion en continu qui doit être décodé du début à la fin, tandis que certaines fonctionnalités de "page d'index" ont été ajoutées récemment au format de stockage, en général les opérations d'accès aléatoire sont coûteuses.

Flèche, d'autre part, est avant tout une bibliothèque fournissant des structures de données en colonnes pour calcul en mémoire. Lorsque vous lisez un fichier Parquet, vous pouvez décompresser et décoder les données dans Flèche structures de données en colonnes, afin que vous puissiez ensuite effectuer des analyses en mémoire sur les données décodées. Le format en forme de flèche de la colonne a quelques propriétés intéressantes: l'accès aléatoire est O(1) et chaque cellule de valeur est à côté de la précédente et de la suivante en mémoire, il est donc efficace d'itérer dessus.

Qu'en est-il alors des "fichiers fléchés"? Apache Arrow définit un protocole binaire de "sérialisation" pour organiser une collection de tableaux en colonnes Arrow (appelés "batch d'enregistrement") qui peuvent être utilisés pour la messagerie et la communication interprocessus. Vous pouvez mettre le protocole n'importe où, y compris sur le disque, qui peut ensuite être mappé en mémoire ou lu en mémoire et envoyé ailleurs.

Ce protocole Arrow est conçu pour que vous puissiez "mapper" un blob de données Arrow sans effectuer de désérialisation, afin d'effectuer des analyses sur les données du protocole Arrow sur disque peut utiliser le mappage de la mémoire et payer efficacement un coût nul. Le protocole est utilisé pour de nombreuses choses, telles que le streaming de données entre Spark SQL et Python pour exécuter pandas fonctions contre les morceaux) de Spark données SQL, celles-ci sont appelées "pandas udfs").

Dans certaines applications, Parquet et Arrow peuvent être utilisés de manière interchangeable pour la sérialisation des données sur disque. Quelques points à garder à l'esprit:

  • Parquet est destiné à des fins "d'archivage", ce qui signifie que si vous écrivez un fichier aujourd'hui, nous nous attendons à ce que tout système qui dit qu'il peut "lire Parquet" puisse lire le fichier dans 5 ou 7 ans. Nous ne faisons pas encore cette affirmation sur la stabilité à long terme du format Arrow (bien que nous pourrions le faire à l'avenir)
  • Le parquet est généralement beaucoup plus cher à lire car il doit être décodé en une autre structure de données. Les données du protocole Arrow peuvent simplement être mappées en mémoire.
  • Les fichiers Parquet sont souvent beaucoup plus petits que le protocole Arrow sur disque en raison des schémas d'encodage de données utilisés par Parquet. Si votre stockage sur disque ou votre réseau est lent, Parquet sera un meilleur choix

Donc, en résumé, les fichiers Parquet sont conçus pour le stockage sur disque, Arrow est conçu pour en mémoire (mais vous pouvez le mettre sur le disque, puis sur la carte mémoire plus tard). Ils sont destinés à être compatibles entre eux et utilisés ensemble dans les applications.

Pour une application frontale gourmande en mémoire, je pourrais suggérer de regarder la bibliothèque Arrow JavaScript (TypeScript).

39
Wes McKinney