我是Spark的新手。有人可以清楚我的怀疑:
让我们假设下面是我的代码:
a = sc.textFile(filename)
b = a.filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()
我希望下面是内部发生的事情:(如果我的理解错误,请纠正)
(1)变量a将保存为包含预期txt文件内容的RDD变量
(2)驱动程序节点将工作分解为任务,每个任务都包含有关它将对其进行操作的数据拆分的信息。 现在,这些任务被分配给工作节点。
(3)当调用集合动作(即我们的例子中的collect())时,结果将从不同的节点返回到主节点,并保存为局部变量c。
现在我想了解代码下面的区别:
a = sc.textFile(filename).collect()
b = sc.parallelize(a).filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()
请有人澄清一下吗?
答案 0 :(得分:13)
(1)变量a将保存为RDD变量包含预期的txt文件内容
(突出我的)不是真的。该行描述了在执行操作后会发生什么,即RDD变量不包含预期的txt文件内容。
RDD描述了在调用操作时成为将读取输入文件部分的任务的分区。
(2)驱动程序节点将工作分解为任务,每个任务都包含有关它将对其进行操作的数据拆分的信息。现在,这些任务被分配给工作节点。
是的,但仅在您的案件中调用c=b.collect()
的操作时。
(3)当调用集合动作(即我们的例子中的collect())时,结果将从不同的节点返回到主节点,并保存为局部变量c。
YES!这是内存最危险的操作,因为群集中运行某处的所有Spark执行程序都开始将数据发送回驱动程序。
现在我想了解代码下面的差异
引用sc.textFile的文档:
textFile(path:String,minPartitions:Int = defaultMinPartitions):RDD [String] 从HDFS读取文本文件,本地文件系统(在所有节点上都可用)或任何支持的Hadoop文件系统URI,并将其作为字符串的RDD返回。
引用sc.parallelize的文档:
parallelize [T](seq:Seq [T],numSlices:Int = defaultParallelism)(隐式arg0:ClassTag [T]):RDD [T] 分发本地Scala集合以形成RDD。
区别在于数据集 - 文件(用于textFile
)而本地集合(用于parallelize
)。要么在幕后做同样的事情,也就是说它们都构建了如何访问将要使用转换和动作处理的数据的描述。
因此,主要区别在于数据来源。