Apache spark 为什么spark executor可以进行无序读取并超过内存分配?
我为spark应用程序设置了如下参数: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)
--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)。虽然此操作将流数据作为输入,但在传递时不会释放每个元素,因此很容易耗尽内存。