Je suis nouveau chez Spark. quelqu'un peut-il effacer mon doute:
Supposons que ci-dessous est mon code:
a = sc.textFile(filename)
b = a.filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()
J'espère que ce qui se passe en interne est le suivant: (Veuillez corriger si ma compréhension est fausse)
(1) la variable a sera enregistrée en tant que variable RDD contenant le contenu attendu du fichier txt
(2) Le nœud du pilote décompose le travail en tâches et chaque tâche contient des informations sur la répartition des données sur lesquelles elle fonctionnera. Maintenant, ces tâches sont affectées aux nœuds de travail.
(3) lorsque l'action de collecte (c'est-à-dire collect () dans notre cas) est invoquée, les résultats seront retournés au maître à partir de différents nœuds et enregistrés en tant que variable locale c.
Maintenant, je veux comprendre quelle différence fait le code ci-dessous:
a = sc.textFile(filename).collect()
b = sc.parallelize(a).filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()
Quelqu'un pourrait-il clarifier?
(1) la variable a sera enregistrée en tant que variable RDD contenant le contenu attendu du fichier txt
(Soulignant le mien) Pas vraiment. La ligne juste décrit ce qui se passera après l'exécution d'une action, c.-à-d. la variable RDD ne contient pas le contenu attendu du fichier txt.
Le RDD décrit les partitions qui, lorsqu'une action est appelée, deviennent des tâches qui liront leurs parties du fichier d'entrée.
(2) Le nœud du pilote décompose le travail en tâches et chaque tâche contient des informations sur la répartition des données sur lesquelles elle fonctionnera. Maintenant, ces tâches sont affectées aux nœuds de travail.
Oui, mais uniquement lorsqu'une action est appelée, qui est c=b.collect()
dans votre cas.
(3) lorsque l'action de collecte (c'est-à-dire collect () dans notre cas) est invoquée, les résultats seront retournés au maître à partir de différents nœuds et enregistrés en tant que variable locale c.
OUI! C'est l'opération la plus dangereuse en mémoire car tous les Spark exécuteurs exécutant quelque part dans le cluster commencent à renvoyer des données au pilote.
Maintenant, je veux comprendre quelle différence fait le code ci-dessous
Citant la documentation de sc.textFile :
textFile (chemin: String, minPartitions: Int = defaultMinPartitions): RDD [String] Lire un fichier texte depuis HDFS, un système de fichiers local (disponible sur tous nœuds), ou tout URI de système de fichiers pris en charge par Hadoop, et le renvoyer en tant que RDD de chaînes.
Citant la documentation de sc.parallelize :
paralléliser [T] (seq: Seq [T], numSlices: Int = defaultParallelism) (arg0 implicite: ClassTag [T]): RDD [T] Distribuez une collection locale Scala pour former un RDD.
La différence réside dans les ensembles de données - fichiers (pour textFile
) et dans une collection locale (pour parallelize
). Soit fait la même chose sous les couvertures, c'est-à-dire qu'ils construisent tous deux une description de la façon d'accéder aux données qui vont être traitées à l'aide de transformations et d'une action.
La principale différence est donc la source des données.