首页 > 解决方案 > spark如何将数据加载到内存中

问题描述

我在火花执行过程中完全混乱。我参考了可能的文章和教程,没有人详细讨论。我可能错误地理解了火花。请纠正我。

我的 40GB 文件分布在 10 节点集群的 4 个节点(每个节点 10GB)上。当我spark.read.textFile("test.txt")在我的代码中说时,它会将数据(40GB)从所有 4 个节点加载到驱动程序(主节点)中吗?或者这个 RDD 将分别加载到所有 4 个节点中。在那种情况下,每个节点 RDD 应该保存 10GB 的物理数据,是吗?整个 RDD 保存 10GB 数据并为每个分区执行任务,即 spark 2.0 中的 128MB。最后将输出打乱到驱动程序(主节点)

我在某处读到“ numbers of cores in Cluster = no. of partitions”是否意味着,火花会将一个节点的分区移动到所有 10 个节点进行处理?

标签: scalaapache-spark

解决方案


Spark 不必一次将整个文件读入内存。那个 40GB 的文件被分成许多 128MB(或任何你的分区大小)的分区。这些分区中的每一个都是一个处理任务。每个核心一次只能处理一个任务,优先处理数据分区存储在同一节点上的任务。只需要读取正在处理的 128MB 分区,不读取文件的其余部分。一旦任务完成(并产生一些输出),就可以读入下一个任务的 128MB,并且可以从内存中释放为第一个任务读入的数据。因此,一次只需要将少量正在处理的数据加载到内存中,而不是一次将整个文件加载到内存中。

严格来说spark.read.textFile("test.txt")也无济于事。它不读取数据,也不进行任何处理。它创建一个 RDD,但 RDD 不包含任何数据。而RDD只是一个执行计划。 spark.read.textFile("test.txt")声明文件 test.txt 将被读取并用作数据源,如果以及当 RDD 被评估但它自己不做任何事情时。


推荐阅读