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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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 executor可以进行无序读取并超过内存分配?_Apache Spark - Fatal编程技术网

Apache spark 为什么spark executor可以进行无序读取并超过内存分配?

Apache spark 为什么spark executor可以进行无序读取并超过内存分配?,apache-spark,Apache Spark,我为spark应用程序设置了如下参数: --conf spark.executor.instances=20 --conf spark.driver.memory=4G --conf spark.executor.memory=14G --conf spark.executor.cores=8 在我的工作中有一个洗牌阶段,当我检查spark UI时,我发现几个执行器读取了超过20G的洗牌数据(洗牌读取大小),并且没有内存不足异常 有人能解释一下为什么执行器可以读取比分配的内存量(14G)

我为spark应用程序设置了如下参数:

--conf spark.executor.instances=20 
--conf spark.driver.memory=4G 
--conf spark.executor.memory=14G 
--conf spark.executor.cores=8
在我的工作中有一个洗牌阶段,当我检查spark UI时,我发现几个执行器读取了超过20G的洗牌数据(洗牌读取大小),并且没有内存不足异常


有人能解释一下为什么执行器可以读取比分配的内存量(14G)更多的数据吗;DR:Shuffle将中间结果存储在磁盘上

大多数Spark操作以流式方式运行。让我们编写一个简单的程序来读取1T文本文件并计算行数:

sc.textFile("BIG_FILE.txt").count()

如果需要的话,我可以在一台小型计算机上运行这个程序(尽管需要很长时间),因为一次只需要在内存中存储一行。Shuffle的操作方式大致相同,将来自其他节点的传入数据写入磁盘,并在稍后通过流传输。

这很有意义!在我接受这一最佳答案之前,我只需跟进一下。若流被用于每个执行器,为什么有时我会有一个执行器内存不足异常?举个例子就好了。非常感谢。并不是每件事都能完美地进行。让我们看看一些常见的RDD操作:映射、筛选、连接。。。这些都是小溪。但是RDD的概念分布单元是一个分区,它是一起处理的元素的迭代器。可以在这些分区上调用任意scala代码,Spark无法控制这些操作的内存开销。让我们在每个分区中创建一组元素:rdd.mapPartitions(it=>it.toSet)。虽然此操作将流数据作为输入,但在传递时不会释放每个元素,因此很容易耗尽内存。