在这些情况下,大文件会发生什么?
1) Spark从NameNode获取数据的位置。如果数据大小超过了NameNode提供的信息,那么Spark会在此时停止吗?
2) Spark根据数据节点块大小对数据进行分区,但是所有数据无法存储到主内存中。 在这里,我们不使用StorageLevel。 那么这里会发生什么?
3) Spark对数据进行分区,一些数据将存储在主内存中,一旦这些主内存存储的数据处理完成,Spark会从磁盘加载其他数据。
在这些情况下,大文件会发生什么?
1) Spark从NameNode获取数据的位置。如果数据大小超过了NameNode提供的信息,那么Spark会在此时停止吗?
2) Spark根据数据节点块大小对数据进行分区,但是所有数据无法存储到主内存中。 在这里,我们不使用StorageLevel。 那么这里会发生什么?
3) Spark对数据进行分区,一些数据将存储在主内存中,一旦这些主内存存储的数据处理完成,Spark会从磁盘加载其他数据。
count
、collect
或write
)时才开始读入数据。一旦调用了操作,Spark就会将数据加载到分区中 - 同时加载的分区数量取决于可用核心数。因此,在Spark中,您可以认为1个分区=1个核心=1个任务。请注意,所有同时加载的分区都必须适合内存,否则将出现OOM。count
,则Spark仍会按分区读入数据,但不会将任何数据存储在集群中,如果再次执行count
,则会再次读取所有数据。为避免多次读取数据,您可以调用cache
或persist>,在这种情况下,Spark将试图将数据存储在集群中。对于cache
(与persist(StorageLevel.MEMORY_ONLY)
相同),它将所有分区存储在内存中 - 如果内存不足,您将会遇到OOM。如果调用persist(StorageLevel.MEMORY_AND_DISK)
,它将尽可能多地存储在内存中,其余数据将被放置在磁盘上。如果数据也不适合磁盘,则操作系统通常会杀死您的工作程序。
请注意,Spark有自己的小型内存管理系统。您分配给Spark作业的一些内存用于保存正在处理的数据,另一些内存用于存储如果调用cache
或persist
时。希望这个解释能够帮助您 :)
cache
,也不能使用persist(StorageLevel.MEMORY_ONLY)
。但是您可以使用其他所有的存储级别,所以StorageLevel.DISK_ONLY
也是一个选择 :) - Glennie Helles SindholtStorageLevel.DISK_ONLY
肯定会影响性能!我之所以提到它,是因为问题是关于StorageLevel.MEMORY_AND_DISK
是否是_唯一_选项,而实际上不是 :) - Glennie Helles Sindholt--executor-memory
标志(与 spark.executor.memoryOverhead 设置相结合)配置每个执行器的内存。分配给并发加载任务的内存的实际分布由 Spark 内部管理,但你可能可以假设大致均匀分布。 - Glennie Helles Sindholt我的数据需要放入内存才能使用Spark吗?
不需要。如果数据无法放入内存,则Spark运算符会将其溢出到磁盘上,从而使它能够在任何大小的数据上高效运行。同样,如果缓存数据集无法放入内存,则根据RDD的存储级别,在需要时可以将其溢出到磁盘上或重新计算。
在Apache Spark中,如果数据无法放入内存,则Spark会将该数据简单地保存到磁盘中。
Apache Spark中的persist方法提供了六种持久化存储级别来持久化数据。
MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER
(Java and Scala), MEMORY_AND_DISK_SER
(Java and Scala), DISK_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK_2, OFF_HEAP.
cache
方法会导致内存溢出(OOM),但如果只进行一系列操作,当内存填满时Spark将自动溢写到磁盘。如果集群中的磁盘放不下所有数据,工作节点上的操作系统通常会终止进程,此时需要增加磁盘(或内存)容量来完成作业。 - Glennie Helles Sindholt