Hadoop的“映射器”和“缩减器”功能的设计?

时间:2019-01-26 14:39:53

标签: hadoop mapreduce reducers mapper

我正在尝试为Hadoop设计一个映射器和化简器。我是Hadoop的新手,我对应该如何为特定应用程序使用mapper和reducer感到有些困惑。

映射器的输入是大型有向图的连通性。它是2列输入,其中每一行都是单独的边缘连接。第一列是每个边的起始​​节点ID,第二列是每个边的终止节点ID。我正在尝试将每个起始节点ID的邻居数量输出到2列文本文件中,其中第一列按起始节点ID递增的顺序排序。

我的问题是:

(1)输入已经设置好,每一行都是一个键-值对,其中键是起始节点ID,值是结束节点ID。映射器会只是简单地读入每一行并写出来吗?这似乎是多余的。

(2)排序是在mapper和reducer之间进行的,还是实际上可以通过reducer本身进行的排序?

1 个答案:

答案 0 :(得分:0)

如果我的理解正确,那么您想计算一个键有多少个不同的值。

在简化器中简单地发出输入键-值对,然后对每个键的不同值进行计数(例如,通过将它们添加到集合中并以减小器的值来发出设置大小)是一种方法就像您说的那样,但是有点多余。

通常,您希望减少网络流量,因此您可能希望在改组之前进行更多的计算(是的,这是由Hadoop完成的)。

提高效率的两种简单方法是:

1)使用组合器,它将输出一组值,而不是单个值。这样,您将向精简器发送更少的键-值对,并且由于它们已经在同一键的本地值集中,因此某些值可能会被跳过。

2)使用地图端聚合。与其立即输出输入键值对,不如将它们本地存储在数据结构(例如哈希图或多图)的映射器中(在内存中)。该键可以是地图输入键,而值可以是到目前为止对该键可见的一组值。每种类型都需要为此键提供一个新值,然后将其附加到此结构中。在每个映射器的末尾,您都可以从close()方法发出这个结构(或将值转换为数组)(如果我记得这个名字的话)。

您可以使用关键字“ combiner”和“地图端聚合”查找这两种方法。

对键进行全局排序比较棘手。同样,有两个基本选项,但并不是很好: 1)您只使用一个reducer,但随后却没有从并行性中获得任何好处, 2)您使用总订单分区程序,这需要一些额外的编码。

除此之外,您可能需要迁移到Spark,以获得更直观,更有效的解决方案。