2017-10-09 72 views
0

在这些情况下,大文件会发生什么情况?当文件无法放入火花的主内存中时,火花如何读取大文件(petabye)

1)Spark从NameNode获取数据的位置。由于数据量太长,根据NameNode的信息,Spark会在这段时间内停止吗?

2)Spark根据datanode块大小对数据进行分区,但所有数据都不能存储到主存储器中。这里我们没有使用StorageLevel。那么这里会发生什么?

3)Spark做分区数据,一旦这个主存储器的数据再次处理,一些数据将存储在主存储器上,spark会从光盘上加载其他数据。

+0

Spark如何处理大型数据文件取决于您在读取数据后对数据做了什么。如果调用'cache',您将得到一个OOM,但它只是在执行一些操作,Spark会自动溢出到磁盘当它填满记忆。如果数据数量超过集群磁盘上的数据量,那么工作人员的操作系统通常会终止进程,您需要在磁盘(或内存)上进行扩展才能完成作业。 –

+0

感谢您的指导,但在Spark读取数据/文件时,绝对会存储它读取的数据。因此,它将在哪里存储这些数据。如果它不存储读取文件时发生的情况。 –

回答

2

首先,当一个动作(如countcollectwrite)被调用时,Spark才开始读取数据。一旦一个动作被调用,Spark会加载分区中的数据 - 并发加载分区的数量取决于您可用的核心数量。所以在Spark中你可以想到1分区= 1核心= 1任务。请注意,所有同时加载的分区都必须装入内存,否则您将得到一个OOM。

假设您有几个阶段,则Spark将仅从已加载分区的第一阶段运行转换。一旦它对已加载分区中的数据应用了转换,它将输出存储为shuffle-data,然后读入更多分区。然后,它对这些分区应用转换,将输出存储为shuffle-data,读入更多分区等等,直到读取完所有数据。

如果您不应用转换,但仅应用于例如count,Spark仍会读取分区中的数据,但它不会在群集中存储任何数据,并且如果您再次执行count,它将读取所有数据再次。为避免多次读取数据,您可以拨打cachepersist,在这种情况下,Spark 尝试将数据存储在您的群集中。在cache(与persist(StorageLevel.MEMORY_ONLY)相同,它会将所有分区存储在内存中 - 如果它不适合存储在内存中,您将得到一个OOM。如果您拨打persist(StorageLevel.MEMORY_AND_DISK),它将尽可能多地存储在内存中,其余的将会是如果数据不符合磁盘要么操作系统通常会杀死你的工作人员

请注意,Spark有它自己的小内存管理系统,你分配给你的Spark作业的一些内存用于保存数据正在研发中,一些内存用于存储,如果你打电话cachepersist

我希望这样的解释有助于:)