在这些情况下大文件会发生什么?
1)Spark从NameNode获取数据的位置。 Spark 是否会同时停止,因为根据 NameNode 的信息,数据大小太长?
2)Spark按照datanode块大小对数据进行分区,但所有数据不能存储到主内存中。这里我们没有使用StorageLevel。那么这里会发生什么呢?
3)Spark对数据进行分区,一些数据将存储在主内存上,一旦主内存存储的数据再次处理,Spark将从磁盘加载其他数据。
首先,Spark 仅在某个操作(例如count
, collect
or write
) 叫做。一旦调用某个操作,Spark 就会将数据加载到分区- 并发加载分区的数量取决于可用核心的数量。所以在 Spark 中你可以认为 1 个分区 = 1 个核心 = 1 个任务。请注意,所有并发加载的分区都必须适合内存,否则您将遇到 OOM。
假设您有多个阶段,Spark 将仅在已加载的分区上运行第一个阶段的转换。一旦它对加载的分区中的数据应用转换,它将输出存储为随机数据,然后读取更多分区。然后,它对这些分区应用转换,将输出存储为随机数据,读取更多分区等等,直到读取所有数据。
如果您不应用任何转换,而只执行例如count
,Spark仍会读入分区中的数据,但它不会在您的集群中存储任何数据,如果您执行以下操作count
再次它会再次读入所有数据。为了避免多次读入数据,您可以调用cache
or persist
在这种情况下火花will尝试将数据存储在您的集群中。在cache
(这与persist(StorageLevel.MEMORY_ONLY)
它将把所有分区存储在内存中 - 如果它不适合内存,您将得到 OOM。如果你打电话persist(StorageLevel.MEMORY_AND_DISK)
它将尽可能多地存储在内存中,其余的将存储在磁盘上。如果磁盘上放不下数据,操作系统通常会杀死你的工作人员。
请注意,Spark 有自己的小型内存管理系统。分配给 Spark 作业的部分内存用于保存正在处理的数据,部分内存用于存储(如果您调用)cache
or persist
.
我希望这个解释有帮助:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)