当前位置: 首页 > 知识库问答 >
问题:

火花:混洗写入、混洗溢出(内存)、混洗溢出(磁盘)之间的区别?

贺正祥
2023-03-14

我有下面的spark工作,努力把一切都留在记忆中:

val myOutRDD = myInRDD.flatMap { fp =>
  val tuple2List: ListBuffer[(String, myClass)] = ListBuffer()
        :

  tuple2List
}.persist(StorageLevel.MEMORY_ONLY).reduceByKey { (p1, p2) =>
   myMergeFunction(p1,p2)
}.persist(StorageLevel.MEMORY_ONLY)

然而,当我查看作业跟踪器时,我仍然有很多Shuffle Write和Shuffle spill到磁盘...

Total task time across all tasks: 49.1 h
Input Size / Records: 21.6 GB / 102123058
Shuffle write: 532.9 GB / 182440290
Shuffle spill (memory): 370.7 GB
Shuffle spill (disk): 15.4 GB

然后作业失败,因为“设备上没有剩余空间”...我想知道这里的532.9GB混洗写入,是写入磁盘还是内存?

共有1个答案

慕飞章
2023-03-14

如果不多次访问RDD,代码中的persist调用就会被完全浪费。如果你从未访问过它,那么存储它又有什么意义呢?缓存与shuffle行为没有关系,只是您可以通过缓存它们的输出来避免重新执行shuffle。

洗牌溢出由spark.Shuffle.spillspark.Shuffle.memoryfraction配置参数控制。如果启用了spill(默认情况下是这样),那么如果洗牌文件开始使用的值超过memoryfract给定的值(默认情况下为20%),则洗牌文件将溢出到磁盘。

这些指标非常混乱。我对代码的理解是,“shuffle spill(memory)”是当内容溢出到磁盘时释放的内存量。“shuffle spill(disk)”的代码看起来是实际写入磁盘的数量。根据“shuffle write”的代码,我认为这是直接写入磁盘的量-- ,而不是从排序器溢出的量。

 类似资料:
  • 问题内容: 如何在Swift中随机或随机排列数组中的元素?例如,如果我的阵列由52张扑克牌,我想 洗牌 的阵列,以洗牌。 问题答案: 该答案详细说明了如何在Swift 4.2+中使用快速统一的算法(Fisher- Yates)进行改组,以及如何在各个早期版本的Swift中添加相同功能。每个Swift版本的命名和行为都与该版本的变异和非变异排序方法匹配。 并且是从Swift 4.2开始原生的 用法示

  • 如果有人能用简单的术语回答这些与火花洗牌相关的问题,我将不胜感激。 在spark中,当加载一个数据集时,我们指定分区的数量,这表示输入数据(RDD)应该被划分为多少个块,并且根据分区的数量启动相等数量的任务(如果假设错误,请纠正我)。对于工作节点中的X个核心数。一次运行相应的X个任务。 沿着类似的思路,这里有几个问题。 因为,所有byKey操作以及联合、重新分区、连接和共组都会导致数据混乱。 >

  • 我在火花变换函数中有一个简单的问题。 coalesce(numPartitions) - 将 RDD 中的分区数减少到 numPartitions。可用于在筛选大型数据集后更有效地运行操作。 我的问题是 > < Li > < p > coalesce(num partitions)真的会从filterRDD中删除空分区吗? coalesce(numPartitions)是否经历了洗牌?

  • JNIEXPORT jint JNICALL Java_nc_mes_pub_hardware_PCI1761_readChanel(JNIEnv*,jobject,jint channel){ }

  • 大多数纸牌游戏都需要洗牌,也就是让纸牌随机排列。在第10.5节,我们看到了怎样生成随机数,但怎样利用随机数实现洗牌功能却并非显然意见的。 一种可行的方案是,模拟人洗牌的方法,将牌分为两堆,然后通过在每个牌堆中轮流选择的方式实现原牌堆的重新组织。因为一般而言,人并不能做到完美地洗牌,而程序经过大约7次迭代之后,牌堆中纸牌的顺序已经相当随机了。但是计算机程序每次在做完美洗牌的时候有一个令人讨厌的属性—