在执行火花过程中我完全感到困惑。我已经提到了可能的文章和教程,没有人详细讨论。我可能误会了火花。请纠正我。
我有40GB的文件分布在10个节点群集的4个节点(每个节点10GB)上。
当我在代码中说spark.read.textFile("test.txt")
时,是否会将来自所有4个节点的数据(40GB)加载到驱动程序(主节点)中?
或将此RDD将分别加载到所有4个节点中。在这种情况下,每个节点RDD应该保存10GB的物理数据,是吗?
整个RDD可以存储10GB数据并为每个分区执行任务,即spark 2.0中为128MB。最后将输出改组到驱动程序(主节点)
我在某个地方读到“ numbers of cores in Cluster = no. of partitions
”,这意味着火花会将一个节点的分区移动到所有10个节点进行处理吗?
答案 0 :(得分:3)
Spark不必一次将整个文件读入内存。那个40GB的文件被分成许多128MB(或任何分区大小)的分区。这些分区中的每个分区都是一个处理任务。每个内核一次只能处理一个任务,而优先选择处理数据分区存储在同一节点上的任务。仅需要读取正在处理的128MB分区,而不会读取文件的其余部分。一旦任务完成(并产生一些输出),则用于下一个任务的128MB将被读入,并且可以从内存中释放用于第一个任务的读入数据。因此,一次只需要将少量要处理的数据加载到内存中,而不是一次加载整个文件。
严格来说,spark.read.textFile("test.txt")
也无济于事。它不读取数据,也不进行处理。它创建一个RDD,但RDD中不包含任何数据。 RDD只是一个执行计划。 spark.read.textFile("test.txt")
声明,如果对RDD进行了评估,但没有单独执行任何操作,则将读取文件test.txt作为数据源。