scala - spark如何将数据加载到内存中

标签 scala apache-spark

我在 Spark 执行过程中完全困惑。我引用了可能的文章和教程,没有人详细讨论。我可能错误地理解了 Spark 。请纠正我。

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

我在某处读到“Cluster 中的核心数 = 分区数”是否意味着 spark 会将一个节点的分区移动到所有 10 个节点进行处理?

最佳答案

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

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

关于scala - spark如何将数据加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55488204/

相关文章:

scala - 构造函数应用程序列表

scala - scala 中反向排序的最佳方法是什么?

scala - Scala 的特征如何不是真正的特征?

r - 使用 sparklyr 将数据从数据库传输到 Spark

apache-spark - 是否可以获取已经运行的 spark 应用程序的 sparkcontext?

java - Spark DataSet 有效获取整行的长度大小

python - Pyspark - 2 个数据帧之间的区别 - 识别插入、更新和删除

scala - 自定义映射到 Slick 中的嵌套案例类结构(超过 22 列)

scala - 如何调试akka关联进程?

apache-spark - spark k8s 资源登台服务器(RSS)在哪里?