组合器在哪里组合映射器输出 - 在映射阶段或映射减少作业中的减少阶段?

2023-12-14

我的印象是组合器就像作用于本地映射任务的减速器一样,即它聚合单个映射任务的结果以减少输出传输的网络带宽。

并且从阅读中Hadoop- The definitive guide 3rd edition,我的理解似乎是正确的。

摘自第 2 章(第 34 页)

组合器功能 许多 MapReduce 作业都受到集群上可用带宽的限制,因此尽量减少 Map 和 Reduce 任务之间传输的数据是值得的。 Hadoop 允许用户指定要在映射输出上运行的组合器函数——组合器函数的输出形成reduce 函数的输入。由于组合器函数是一种优化,因此 Hadoop 不保证它将针对特定映射输出记录调用它多少次(如果有的话)。换句话说,调用组合器函数零次、一次或多次应该从减速器中产生相同的输出。

所以我在字数统计问题上尝试了以下方法:

job.setMapperClass(mapperClass);
job.setCombinerClass(reduceClass);
job.setNumReduceTasks(0);

这是计数器:

14/07/18 10:40:15 INFO mapred.JobClient: Counters: 10
14/07/18 10:40:15 INFO mapred.JobClient:   File System Counters
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of bytes read=293
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of bytes written=75964
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of read operations=0
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of large read operations=0
14/07/18 10:40:15 INFO mapred.JobClient:     FILE: Number of write operations=0
14/07/18 10:40:15 INFO mapred.JobClient:   Map-Reduce Framework
14/07/18 10:40:15 INFO mapred.JobClient:     Map input records=7
14/07/18 10:40:15 INFO mapred.JobClient:     Map output records=16
14/07/18 10:40:15 INFO mapred.JobClient:     Input split bytes=125
14/07/18 10:40:15 INFO mapred.JobClient:     Spilled Records=0
14/07/18 10:40:15 INFO mapred.JobClient:     Total committed heap usage (bytes)=85000192

这是part-m-00000:

hello   1
world   1
Hadoop  1
programming 1
mapreduce   1
wordcount   1
lets    1
see 1
if  1
this    1
works   1
12345678    1
hello   1
world   1
mapreduce   1
wordcount   1

所以显然没有应用组合器。据我所知,Hadoop 不保证是否会调用组合器。但是当我打开归约阶段时,组合器就会被调用。

为什么会出现这种行为?

现在当我读到第 6 章(第 208 页)时how MapReduce works。我看到这一段描述在Reduce side.

如果map输出足够小,则它们会被复制到reduce任务JVM的内存中(缓冲区的大小由mapred.job.shuffle.input.buffer.percent控制,它指定用于此目的的堆的比例);否则,它们将被复制到磁盘。当内存缓冲区达到阈值大小(由mapred.job.shuffle.merge.percent控制)或达到映射输出的阈值数量(mapred.inmem.merge.threshold)时,它将被合并并溢出到磁盘。如果指定了组合器,它将在合并期间运行,以减少写入磁盘的数据量。

我从这一段中得出的推论是: 1) 合路器是ALSO在减少阶段运行。


的主要功能是combiner是优化。在大多数情况下,它的作用就像一个迷你减速机。从同一本书的第 206 页,章节 - MapReduce 的工作原理(地图侧):

运行组合器函数可以使映射输出更紧凑,因此写入本地磁盘和传输到减速器的数据更少。

引用你的问题,

如果指定了组合器,它将在合并期间运行,以减少写入磁盘的数据量。

两个引号都表明combiner运行主要是为了紧凑性。减少输出传输的网络带宽是此优化的一个优点。

另外,出自同一本书,

回想一下组合器 可以对输入重复运行而不影响最终结果。如果只有 一两次溢出,那么地图输出大小的潜在减少是不值得的 调用组合器的开销,因此不会针对此映射输出再次运行它。

这意味着 hadoop 不保证组合器运行多少次(也可能为零)

组合器永远不会为仅映射作业运行。这是有道理的,因为组合器改变了映射输出。此外,由于它不能保证调用的次数,因此也不能保证映射输出是相同的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

组合器在哪里组合映射器输出 - 在映射阶段或映射减少作业中的减少阶段? 的相关文章

随机推荐

  • Django 单元测试;使用 python-social-auth 登录

    我想为我正在使用的 Django 应用程序编写单元测试python 社交 身份验证 运行 Django 并使用浏览器时一切都很好 感谢 python social auth 但是 我似乎无法编写单元测试 因为我无法创建经过身份验证的客户端来
  • 为什么#include 之后仍然需要使用 std::string ? [复制]

    这个问题在这里已经有答案了 为了使用字符串 我需要包含字符串标头 以便其实现可用 但如果是这样 为什么我还需要添加这一行using std string 为什么它还不知道字符串数据类型 include
  • git clone 的 Python 进度条

    我使用 GitPython 在我的程序中克隆一个存储库 我想出了如何使用 clone from 命令显示克隆的状态 但我希望状态看起来更像 tqdm 进度条 我尝试使用 requests 库来获取文件的大小 但我仍然不确定如何实现它 尝试做
  • Nodemailer和Godaddy,我已经尝试了所有解决方案都无济于事

    我通过 GoDaddy 购买了一个域名和一个电子邮件地址 并捆绑了 Office 365 Basic 几天来 我尝试从我的节点应用程序中使用 nodemailer 发送一封电子邮件 但从未成功 因为我总是收到535 Authenticati
  • 使用 twinx 时旋转 xtick 标签时出现问题

    我的 X 轴旋转有问题 我尝试旋转输出图而没有错误 但我没有结果 Import Data df pd read csv https github com selva86 datasets raw master economics csv x
  • 使用 angularJS 时未捕获的错误:[$injector:modulerr]

    我在我的应用程序中使用 angularJS 但是当我添加路由配置部分时 我收到此错误 Uncaught Error injector modulerr http errors angularjs org 1 2 9 injector mod
  • 如何限制用户使用datetimepicker输入数据并禁用手动用户输入?

    我想限制用户只能使用日期时间选择器输入数据 下面是我正在使用的代码 div class form group div
  • 查看函数列表时出现呼叫提示/文档字符串?

    我最近刚刚转用 Komodo 进行 Python 编程 到目前为止我很喜欢它 我喜欢输入函数名称 然后输入开括号 它会打开调用提示 文档字符串 我也喜欢输入模块名称 然后输入 它会打开可用函数的列表 我的问题是 当我列出函数列表时 是否可以
  • 使用批处理文件复制目录路径中带有通配符的文件?

    我想要一个批处理文件将文件从每月更改的文件夹复制到另一个文件夹 但 Windows 命令提示符似乎不喜欢通配符 Example 我想复制文件夹media1并包含此目录中的文件 K Eng NAVDB Navigation Databases
  • 使用 Git 进行代码升级

    我试图弄清楚如何将 git 用于多个环境 开发 gt 测试 gt 产品 并进行代码升级 我读了一些有关分支的内容 但不太明白这如何解决我的问题 因为我必须有能力同时且彼此独立地运行所有环境 将非常感谢某种操作方法 这种三层工作流程似乎是很常
  • join 命令遗漏了一行数字

    我有两个文件 我想取出第三列中具有共同数据的行 但它遗漏了一行应该匹配的行 File1 b b b 4 5 3 c c c File2 1 2 3 4 a b c d e f g h i j k l l m n o 输出是 c c c a
  • Silverlight 图表 - 饼图显示图表上的依赖值

    我想在饼图本身上显示相关值 不在图例区域中 我正在使用 Silverlight 4 Silverlight 4 Toolkit 2010 年 4 月 这应该是一个很常见的请求 但我还没有找到解决方案 我该怎么做
  • Angular 4 中的 HashLocationStrategy 和查询参数

    我正在将现有的 Angular 4 应用程序从 PathLocationStrategy 迁移到HashLocationStrategy并且需要保持入口点 url 正常工作 它看起来像www test com param1 123 问题是
  • 我可以只用 CSS 创建这个形状吗?

    我正在为具有特定形状的网页构建一个英雄部分 目前我只是使用图像作为实际部分背景的叠加层 但我希望减少我发出的请求数量 并且会想知道是否可以使用 CSS 完成以下形状 所以黑色部分是实际图像所在的位置 而白色部分是我尝试使用 CSS 构建的部
  • C# 用阴影给图像着色

    我目前正在使用 C 创建一款游戏 并尝试为玩家创建服装 我想做布料设计并让玩家选择颜色 我从 TibiaME tibiame com 的游戏文件中拍摄了照片 它几乎满足了我的要求 我怎样才能用颜色填写这个表格 当我尝试替换某种颜色时 它不起
  • 无法将字符串分配给 Swift 函数内的数组元素

    下面代码中的两个赋值行都给出了这个错误 value T5 与 String 不同 func PrintShoppingList myList Array
  • SQL Server,检查 varchar 是否包含全零

    我需要编写一个函数来检查 varchar 变量值是否全为零 由于变量是 varchar 而不是 int 我有点迷失了 你会怎么办 多谢 您可以使用双重否定LIKE test variable NOT LIKE 0 这表示变量isn t由一定
  • 在同一个 goroutine 中创建的 goroutine 总是按顺序执行吗?

    package main func main c make chan int for i 0 i lt 100 i i i go func c lt i for b lt c println b if b 100 break 上面
  • 如何在 UIScrollView 中加载 UIViewController

    这是我的设置 我有一个UIScrollView在我的主视图控制器之上 我在其中加载多个视图控制器 我还有一个 添加 按钮 它将使用 Push segue 呈现一个新的视图控制器 我希望这个视图控制器也只加载在滚动视图的顶部 而不是整个屏幕
  • 组合器在哪里组合映射器输出 - 在映射阶段或映射减少作业中的减少阶段?

    我的印象是组合器就像作用于本地映射任务的减速器一样 即它聚合单个映射任务的结果以减少输出传输的网络带宽 并且从阅读中Hadoop The definitive guide 3rd edition 我的理解似乎是正确的 摘自第 2 章 第 3