2017-02-10 2 views
2

Je suis en train de développer un framework de traitement Spark qui lit de gros fichiers CSV, les charge dans des RDD, effectue quelques transformations et enregistre des statistiques.Lire le fichier CSV dans Spark de manière distribuée

Les fichiers CSV en question ont une taille moyenne d'environ 50 Go. J'utilise Spark 2.0.

Ma question est:

Quand je charge les fichiers en utilisant la fonction sparkContext.textFile(), le fichier ne doit être stocké dans la mémoire du pilote d'abord, puis il est distribué aux travailleurs (ainsi nécessitant une assez grande quantité de mémoire sur le pilote)? Ou le fichier est lu "en parallèle" par chaque travailleur, d'une manière qu'aucun d'entre eux n'a besoin de stocker le fichier entier, et le conducteur agit seulement comme un "gestionnaire"?

Merci à l'avance

Répondre

5

Lorsque vous définissez la lecture, le fichier serait divisé en partitions en fonction de votre schéma de parallélisme et les instructions seront envoyées aux travailleurs. Ensuite, le fichier est lu directement par les employés du système de fichiers (d'où la nécessité d'un système de fichiers distribué disponible pour tous les nœuds tels que HDFS).

En note, il serait préférable de le lire dans une structure de données en utilisant spark.read.csv et non dans RDD. Cela prendrait moins de mémoire et permettrait à l'étincelle d'optimiser vos requêtes.

MISE À JOUR

Dans le commentaire, il a été demandé ce qui se passerait si le système de fichiers n'a pas été distribué et le fichier serait situé sur une seule machine. La réponse est que si vous avez plus d'une machine, elle échouera probablement. Lorsque vous exécutez le fichier sparkContext.textFile, rien n'est réellement lu, il indique simplement à l'opérateur ce que vous voulez lire.

Ensuite, vous effectuez une transformation et rien n'est encore lu parce que vous définissez un plan. Une fois que vous exécutez une action (par exemple, collecter), le traitement réel commence. Spark diviserait le travail en tâches et les enverrait aux exécuteurs. Les exécuteurs (qui peuvent être sur le nœud maître ou sur les nœuds de travail) tenteront alors de lire des parties du fichier. Le problème est que tout exécuteur PAS sur le nœud maître rechercherait le fichier et ne le trouverait pas, provoquant l'échec des tâches. Spark réessayerait plusieurs fois (je crois que la valeur par défaut est 4) et échouerait complètement.

Bien sûr, si vous n'avez qu'un seul nœud, tous les exécutants verront le fichier et tout ira bien. En théorie, il se peut aussi que les tâches échouent sur le travailleur, puis sur le maître et y parviennent, mais dans tous les cas, les travailleurs ne travailleraient pas à moins de voir une copie du fichier.

Vous pouvez résoudre ce problème en copiant le fichier sur le même chemin dans tous les nœuds ou en utilisant n'importe quel type de système de fichiers distribué (même les partages NFS sont corrects).

Bien sûr, vous pouvez toujours travailler sur un seul noeud, mais vous ne profiterez pas de l'évolutivité de l'étincelle.

+0

En ce qui concerne la première partie de votre réponse, supposons que je n'ai PAS de système de fichiers distribué et que le fichier se trouve dans le système de fichiers de ** une seule machine ** (supposons que c'est le maître). Dans ce scénario, que se passerait-il? Cette machine unique devrait le charger dans la mémoire ** avant ** la distribution se produit? –

+0

@AnderMurilloZohn Voir l'explication mise à jour –

+0

Merci, maintenant je comprends. –