Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 当文件无法装入spark'时,spark如何读取大文件(PB);主存储器_Apache Spark_Rdd_Partition - Fatal编程技术网

Apache spark 当文件无法装入spark'时,spark如何读取大文件(PB);主存储器

Apache spark 当文件无法装入spark'时,spark如何读取大文件(PB);主存储器,apache-spark,rdd,partition,Apache Spark,Rdd,Partition,在这些情况下,大型文件会发生什么情况 1) Spark从NameNode获取数据的位置。Spark是否会在同一时间停止,因为根据NameNode的信息,数据大小太长 2) Spark按照datanode块大小对数据进行分区,但不能将所有数据存储到主存中。这里我们不使用StorageLevel。那么这里会发生什么 3) Spark会对数据进行分区,一旦此主存存储区的数据再次处理,一些数据将存储在主存上Spark会从光盘加载其他数据。首先,Spark仅在调用操作(如计数,收集或写入)时才开始读取数据

在这些情况下,大型文件会发生什么情况

1) Spark从NameNode获取数据的位置。Spark是否会在同一时间停止,因为根据NameNode的信息,数据大小太长

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


3) Spark会对数据进行分区,一旦此主存存储区的数据再次处理,一些数据将存储在主存上Spark会从光盘加载其他数据。

首先,Spark仅在调用操作(如
计数
收集
写入
)时才开始读取数据。调用操作后,Spark将加载分区中的数据—并发加载的分区数取决于可用的内核数。所以在Spark中,你可以想到1个分区=1个核心=1个任务。请注意,所有并发加载的分区都必须装入内存,否则会出现OOM

假设您有几个阶段,Spark然后只在加载的分区上运行第一阶段的转换。一旦对加载的分区中的数据应用了转换,它将输出存储为随机数据,然后读取更多分区。然后在这些分区上应用转换,将输出存储为随机数据,读取更多分区,等等,直到所有数据都被读取

如果您不应用任何转换,而只进行一次
计数
,Spark仍将读取分区中的数据,但它不会在集群中存储任何数据,如果您再次进行
计数
,它将再次读取所有数据。为了避免多次读取数据,您可以调用
cache
persist
,在这种情况下,Spark将尝试将数据存储在集群中。在
cache
(与
persist(仅限StorageLevel.MEMORY)相同)
它将在内存中存储所有分区-如果它不适合内存,您将得到一个OOM。如果调用
persist(StorageLevel.MEMORY\u和\u DISK)
它将在内存中存储尽可能多的数据,其余的数据将放在磁盘上。如果数据不能放在磁盘上,操作系统通常会杀死你的工人

请注意,Spark有自己的小内存管理系统。如果调用
缓存
持久化
,则分配给Spark作业的部分内存用于保存正在处理的数据,而部分内存用于存储


我希望这个解释有帮助:)

这是直接从ApacheSpark常见问题解答()

我的数据需要存储在内存中才能使用Spark吗

不,Spark的操作员会将数据泄漏到磁盘,如果磁盘不适合内存, 允许它在任何大小的数据上运行良好。同样,缓存的数据集 内存中不适合的数据要么溢出到磁盘,要么重新计算 根据RDD的存储级别,在需要时飞行

在apachespark中,如果数据不适合内存,那么Spark只是将该数据保存到磁盘

apachespark中的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.

堆外存储正在试验中。

Spark如何处理大型数据文件取决于读入数据后对数据的处理方式。如果调用
cache
您将得到一个OOM,但如果您只是在执行一些操作,则Spark将在填满内存时自动溢出到磁盘。如果集群中磁盘上的数据量超过了可容纳的数据量,那么workers上的操作系统通常会终止该进程,您需要在磁盘(或内存)上进行扩展以完成该作业。感谢您的指导,但在这里,Spark读取数据/文件时,它肯定会存储已读取的数据。那么它将在哪里存储这些数据。。如果无法存储,则读取文件时会发生什么。对于大型数据集,设置StorageLevel.MEMORY\u和磁盘是唯一的选项?如果数据集中的数据超过了单独存储在内存中的数据量,则既不能使用
缓存
也不能使用
持久化(仅限StorageLevel.MEMORY\u)
。但是您可以使用所有其他存储级别,因此
StorageLevel.DISK\u ONLY
也可以作为一个选项:)@devesh使用
StorageLevel.DISK\u ONLY
肯定会影响性能!我之所以提到它,是因为问题是存储级别是否
StorageLevel。内存和磁盘
是唯一的选项,但事实并非如此:)很好的答案在标准文本中没有得到很好的解决!事实并非如此,spark将尝试重新计算,如果所有数据至少不能放入文档中的RDD中,这是最新的行为-内存仅将RDD作为反序列化Java对象存储在JVM中。如果RDD不适合内存,则某些分区将不会被缓存,并且会在每次需要时动态重新计算。这是默认级别。