在hadoop中,记录拆分需要为每条记录生成唯一的键吗?

bfrts1fy  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(243)

我对hadoop还比较陌生。为了理解mapreduce作业的记录分割步骤是如何工作的,我一直在遵循我能找到的示例。我注意到textinputformat将文件拆分为记录,key作为字节偏移量,value作为字符串。在这种情况下,我们可以在一个Map器中有两个不同的记录,它们与不同的输入文件具有相同的偏移量。
它是否会以任何方式影响Map器?我认为如果我们不处理mapper的键(例如wordcount),那么它的唯一性就无关紧要了。但是如果我们必须在mapper中处理它,那么密钥可能必须是唯一的。有人能详细说明一下吗?
提前谢谢。

chy5wohz

chy5wohz1#

实际上,你的问题的答案完全取决于场景。
如果您没有使用key(例如,textinputformat的字节偏移量是使用最少的,但是如果您使用的是keyvalusepairinputformat,您可能正在使用它),那么它不会产生影响,但是如果map()函数逻辑是这样的,您在key的基础上进行一些计算,那么它肯定会产生影响。
所以这完全取决于情况。

6jjcrrmo

6jjcrrmo2#

有个误会。实际上,
对于文件的每个输入分割,将分配一个Map器。对于给定的作业,来自单个输入拆分的所有记录将仅由一个Map器处理。
无需为Map器到达具有重复键的记录而烦恼,因为Map器的执行范围在任何时间点总是在一个键/值对上。
Map器任务的输出是n个键/值对,最终根据键进行合并、排序和分区。
reducer将根据分区从所有Map器收集所需的输出,并将其带到reducer的内存中,在内存中按如下方式排列键/值对 <key , Iterable <value> > .

0mkxixxg

0mkxixxg3#

Map器的输入是一个文件(或hdfs块),而不是一个键值对。换句话说,Map器本身创建键值对,并且不受重复键的影响。
Map器生成的“最终”输出是多值hashmap。

< Key, <List of Values>>

该输出成为减速器的输入。一个键的所有值都由同一个减速机处理。Map程序可以为一个键创建多个值。事实上,有些解决方案依赖于这种行为。

相关问题