Que va faire des étincelles si je n'ai pas assez de mémoire?

voix
11

Je suis nouveau à Spark, et j'ai trouvé la documentation dit Spark se chargera des données en mémoire pour accélérer les algorithmes d'itération.

Mais si j'ai un fichier journal de la mémoire de 10 Go et 2 Go ont seulement? Éveilleront charger le fichier journal en mémoire comme toujours?

Créé 30/11/2013 à 15:56
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Il ne se charge pas 10G complète, que vous n'avez pas assez de mémoire disponible. D'après mon expérience, l'un des trois se passera-t selon la façon dont vous utilisez vos données:

Si vous essayez de mettre en cache les 10GBs:

  1. Vous allez obtenir un oome
  2. Les données vont être chargées

Si vous êtes en train de traiter les données:

  1. Les données vont être permutés dans / de mémoire

Bien sûr, cela est très lié à votre code et les transformations que vous postulez.

Créé 03/12/2013 à 19:20
source utilisateur

voix
10

Je pense que cette question a été bien répondu dans le panneau FAQ du site Spark ( https://spark.apache.org/faq.html ):

  • Qu'advient - il si mon jeu de données ne correspond pas à la mémoire? Souvent , chaque partition de données est faible et ne forme en mémoire, et ces partitions sont traitées un peu à la fois. Pour des partitions très larges qui ne correspondent pas à la mémoire, les opérateurs intégrés Spark effectuent des opérations extérieures sur des ensembles de données.
  • Qu'est - ce qui se passe quand un jeu de données en cache ne correspond pas à la mémoire? Spark peut soit renverser sur le disque ou les partitions recalcule qui ne correspondent pas dans la RAM à chaque fois qu'ils sont demandés. Par défaut, il utilise recalcul, mais vous pouvez définir le niveau de stockage d'un ensemble de données MEMORY_AND_DISK pour éviter cela.
Créé 08/04/2015 à 15:20
source utilisateur

voix
3

La clé ici est de noter que RDD sont divisées en partitions (voir comment à la fin de cette réponse), et chaque partition est un ensemble d'éléments (peut être des lignes de texte ou des nombres entiers , par exemple). Les partitions sont utilisées pour paralléliser les calculs dans les différentes unités de calcul.

Donc , la clé n'est pas si un fichier est trop grand , mais si une partition est . Dans ce cas, dans la FAQ : « Les opérateurs de Spark données de déversement sur le disque si elle ne rentre pas dans la mémoire, ce qui lui permet de bien fonctionner sur toutes les données de taille ». Le problème avec de grandes partitions de production OOM est résolu ici .

Maintenant, même si la partition peut tenir dans la mémoire, cette mémoire peut être pleine. Dans ce cas, il expulse une autre partition de la mémoire pour s'adapter à la nouvelle partition. Expulser peut signifier soit:

  1. Suppression de la partition complètement: dans ce cas , si la partition est à nouveau nécessaire , alors il est recalculée .
  2. Partition est conservée dans le niveau de stockage spécifié . Chaque RDD peut être « marqué » à être mis en cache / a persisté en utilisant ces niveaux de stockage, voir ce comment.

Gestion de la mémoire est bien expliqué ici : « . Partitions stocke Spark dans le cache LRU en mémoire lorsque le cache atteint sa limite dans la taille, il expulse l'entrée (c. -à- partition) à partir de quand la partition a. « Attribut disque »(votre niveau de persistance permet stockage partition sur le disque), il serait écrit sur le disque dur et la mémoire consommée par elle serait libéré, à moins que vous la demande. Lorsque vous demandez, il serait lu dans la mémoire, et s'il n'y aura pas assez de mémoire d'autres, plus anciennes entrées du cache seraient évincés. Si votre partition n'a pas l' attribut « disque », l' expulsion signifierait simplement détruire l'entrée du cache sans l' écrire sur le disque dur » .

Comment le fichier initial / données est partitionné dépend du format et le type de données, ainsi que la fonction utilisée pour créer le RDD, voir ce . Par exemple:

  • Si vous avez une collection déjà (une liste en java par exemple), vous pouvez utiliser paralléliser () et spécifiez le nombre de partitions. Les éléments de la collection seront regroupées dans des partitions.
  • Si vous utilisez un fichier externe dans HDFS: « Spark crée une partition pour chaque bloc du fichier (blocs étant 128Mo par défaut dans HDFS) » .
  • Si la lecture d'un fichier texte local, chaque ligne (terminée par une nouvelle ligne « \ n », le caractère final peut être changé, voir ce ) est un élément et plusieurs lignes forment une partition.

Enfin, je vous suggère de lire ce pour plus d' informations et aussi de décider comment choisir le nombre de partitions (trop ou trop peu?).

Créé 21/10/2017 à 19:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more