web-dev-qa-db-fra.com

Comment spark lire un gros fichier (pétaoctet) lorsque le fichier ne peut pas être placé dans la mémoire principale de spark

Que se passera-t-il pour les fichiers volumineux dans ces cas?

1) Spark obtient un emplacement de NameNode pour les données. Est-ce que Spark s'arrêtera en même temps parce que la taille des données est trop longue selon les informations de NameNode?

2) Spark partitionne les données selon la taille du bloc de datanode mais toutes les données ne peuvent pas être stockées dans la mémoire principale. Ici, nous n'utilisons pas StorageLevel. Que se passera-t-il ici?

3) Spark partitionne les données, certaines données seront stockées dans la mémoire principale une fois que les données de ce magasin de mémoire principale seront à nouveau traitées spark chargera d'autres données du disque).

9
Arpit Rai

Tout d'abord, Spark ne démarre la lecture des données que lorsqu'une action (comme count, collect ou write) est appelée. Une fois une action est appelée, Spark charge les données dans partitions - le nombre de partitions chargées simultanément dépend du nombre de cœurs dont vous disposez. Donc dans Spark vous pouvez penser à 1 partition = 1 core = 1 tâche. Notez que toutes les partitions chargées simultanément doivent tenir en mémoire, sinon vous obtiendrez un MOO.

En supposant que vous ayez plusieurs étapes, Spark exécute ensuite les transformations de la première étape sur les partitions chargées uniquement. Une fois qu'il a appliqué les transformations sur les données des partitions chargées, il stocke la sortie sous la forme shuffle-data puis lit dans plus de partitions. Il applique ensuite les transformations sur ces partitions, stocke la sortie sous forme de shuffle-data, lit dans plus de partitions et ainsi de suite jusqu'à ce que toutes les données aient été lues.

Si vous n'appliquez aucune transformation mais que vous ne faites par exemple qu'un count, Spark lira toujours les données dans les partitions, mais il ne stockera aucune donnée dans votre cluster et si vous refaire le count, il lira à nouveau toutes les données. Pour éviter de lire les données plusieurs fois, vous pouvez appeler cache ou persist auquel cas Spark will essayez de stocker les données dans votre cluster. Sur cache (qui est identique à persist(StorageLevel.MEMORY_ONLY) il stockera toutes les partitions en mémoire - s'il ne tient pas en mémoire, vous obtiendrez un MOO. Si vous appelez persist(StorageLevel.MEMORY_AND_DISK) il stockera autant qu'il peut en mémoire et le reste sera mis sur le disque. Si les données ne tiennent pas sur disque, le système d'exploitation tuera généralement vos employés.

Notez que Spark possède son propre petit système de gestion de la mémoire. Une partie de la mémoire que vous affectez à votre Spark tâche est utilisée pour contenir les données une partie de la mémoire est utilisée pour le stockage si vous appelez cache ou persist.

J'espère que cette explication aide :)

40