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

为什么Spark要将映射相位输出保存到本地磁盘?

韦高谊
2023-03-14

我试图深入理解火花洗牌过程。当我开始阅读时,我发现了以下一点。

Spark在完成后将映射任务(ShuffleMapTask)输出直接写入磁盘。

如果有很多小的中间文件作为输出,spark如何处理网络和I/O瓶颈?

共有1个答案

董康平
2023-03-14

首先,Spark并不以严格的map-reduce方式工作,map输出不会写入磁盘,除非必要。向磁盘写入洗牌文件。

这并不意味着洗牌后的数据不保存在内存中。Spark中的Shuffle文件主要是为了避免在多个下游操作的情况下进行重新计算而编写的。为什么要写入文件系统?至少有两个交织的原因:

  • 内存是一种宝贵的资源,而Spark中的内存缓存是短暂的。需要时可以从缓存中删除旧数据。
  • 洗牌是一个昂贵的过程,如果没有必要,我们希望避免。以一种使洗牌数据在给定上下文的生存期内持久化的方式存储洗牌数据更有意义。

关于网络和I/O瓶颈,这里没有灵丹妙药。虽然Spark可以通过组合转换、在内存中缓存和提供转换感知的工作者首选项来减少写入磁盘或洗牌的数据量,但它与任何其他分布式框架一样受到相同的限制。

 类似资料:
  • 我正在Electronic(因此是node.js)中试验纵隔流记录API,希望将输出作为流处理。作为流处理将允许我在保存到磁盘之前处理MediaCorder输出-例如,我可以加密它。对于我的特定用例,我只关心音频,所以我没有任何视频元素记录。 下面是一个突出我所尝试的项目。中的关键代码是record.js,在save()函数中。 最终,我将尝试创建一个合适的来插入使用使用。 总结起来,我尝试了以下

  • 问题内容: 不幸的是,简单地返回’{}’,这意味着a在还原后变成空对象。 我发现es6-mapify允许在Map和普通对象之间进行上/下转换,所以这可能是一种解决方案,但是我希望我仅需要使用外部依赖项来持久保存我的地图。 问题答案: 假设您的键和值都是可序列化的, 应该管用。反之,使用

  • 我只想用hadoop mapreduce来排序我的日志行。我将该行的所有字段作为输出键,并将输出值设置为null。但是当运行时,在第行出现空指针异常 所以为什么hadoop映射的输出值不能为空?为什么hadoop reduce的输出值可以(我测试过)?

  • 我一直在使用系统保存截图的方式将位图保存到磁盘和图库中。这在Android4.2及之前版本中有效,但在Android3.3中无效。 相关代码: 此处为完整代码。 然而,在4.3(新的Nexus 7)中,我在第二行得到了FileNotFoundException。我在网站上看不到与此相关的4.3中的任何更改。 那么,将图像保存到磁盘和图库的正确方法是什么呢? 已验证: 使用此方法装载存储 image

  • 问题内容: 我在所有技术术语上都不是很好,所以我会尽力解释我的问题。 我已经编写了一个小脚本来打开android SDK并检查连接的设备(使用Windows 10和python 2.7.14)。我得到的代码如下: 一切正常,但我想将最后3行保存到文本文件中。我尝试过使用并将其全部转换为字符串并将其写入文件并关闭它,但是它不起作用。它甚至都没有创建文件,更不用说向它写入任何内容了。 我可能缺少一些关

  • 问题内容: 这是一个要阐述的问题:为什么说内核在进程地址空间中? 这可能是一个愚蠢的问题,但在我脑海中浮现出来。有关进程地址空间和虚拟内存布局的所有文字都提到进程地址空间具有为内核保留的空间。例如,在32位系统上,进程地址空间为4GB,其中1 GB为Linux中的内核保留(其他OS上可能有所不同)。 我只是想知道为什么当进程无法直接寻址内核时,为什么说内核位于进程地址空间中。为什么我们不说内核具有