scala - 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 个节点进行处理?
解决方案
Spark 不必一次将整个文件读入内存。那个 40GB 的文件被分成许多 128MB(或任何你的分区大小)的分区。这些分区中的每一个都是一个处理任务。每个核心一次只能处理一个任务,优先处理数据分区存储在同一节点上的任务。只需要读取正在处理的 128MB 分区,不读取文件的其余部分。一旦任务完成(并产生一些输出),就可以读入下一个任务的 128MB,并且可以从内存中释放为第一个任务读入的数据。因此,一次只需要将少量正在处理的数据加载到内存中,而不是一次将整个文件加载到内存中。
严格来说spark.read.textFile("test.txt")
也无济于事。它不读取数据,也不进行任何处理。它创建一个 RDD,但 RDD 不包含任何数据。而RDD只是一个执行计划。 spark.read.textFile("test.txt")
声明文件 test.txt 将被读取并用作数据源,如果以及当 RDD 被评估但它自己不做任何事情时。
推荐阅读
- php - 在 docker 中使用 magento/bin setup:di:compile 耗尽 PHP 内存大小
- typescript - ionic 4 存储注入错误:没有提供程序
- axios - 使用 Nuxt.js 进行开发和生产的不同 baseURL
- android - Pipelines:mavenLocal 位于 Pipelines 的什么位置?
- sql - 如何解决在 localhost 中正常运行的服务器中的查询问题?
- f# - F# Literate 将参数传递给脚本文件
- c# - 使用 JSON.NET 序列化的具有循环引用的对象能否在 .NET 之外成功脱轨?
- report - 查看 .rpt 文件
- css - 如何选择x元素之后的所有n元素?
- e-commerce - 可配置产品 Magento 2