Map-Reduce 中的洗牌
Shuffling in Map-Reduce
我正在 java(没有 Hadoop)中编写一个 map-reduce 程序,只是为了练习。
经典的字数统计。
每个 Map(我有多个并行的 map 运行)都会产生这样的键值数据:
谢谢,1
java, 4
上下文,1
你,1
在,2
…,…
现在我必须打乱地图结果并将它们发送到 reduce 任务,但我不确定该怎么做。
我的第一个想法是按照字母顺序拆分 map 的输出,例如,从 a 到 d 的单词发送到第一个 reducer。从e到h的单词发送到第二个reducer,依此类推。
我不确定这是个好主意。单词分布不规则,因此某些 reducer 可能会比其他 reducer 收到更多的负载。
一种解决方案可能是某种哈希,在这种情况下可以使用 HashMap 的哈希吗?
有没有更好的方法?
您可以对键值使用散列函数。
是这样的:
hc = k.hashCode();
.
hashCode return 一个Integer,它的取值范围是从负数到正数(Integer.MIN_VALUE到Integer.MAX_VALUE),所以如果你用它来计算一个索引值来调用一个正确的 reduce 函数,使用 hc = k.hashCode() & 0xffffffff
。按位和函数 (&) 屏蔽第一位,即位符号。
没有哈希冲突的问题(哈希 return 不同键的相同值),重要的是对相同的键具有相同的哈希。
我正在 java(没有 Hadoop)中编写一个 map-reduce 程序,只是为了练习。 经典的字数统计。 每个 Map(我有多个并行的 map 运行)都会产生这样的键值数据: 谢谢,1 java, 4 上下文,1 你,1 在,2 …,…
现在我必须打乱地图结果并将它们发送到 reduce 任务,但我不确定该怎么做。 我的第一个想法是按照字母顺序拆分 map 的输出,例如,从 a 到 d 的单词发送到第一个 reducer。从e到h的单词发送到第二个reducer,依此类推。
我不确定这是个好主意。单词分布不规则,因此某些 reducer 可能会比其他 reducer 收到更多的负载。 一种解决方案可能是某种哈希,在这种情况下可以使用 HashMap 的哈希吗?
有没有更好的方法?
您可以对键值使用散列函数。
是这样的:
hc = k.hashCode();
.
hashCode return 一个Integer,它的取值范围是从负数到正数(Integer.MIN_VALUE到Integer.MAX_VALUE),所以如果你用它来计算一个索引值来调用一个正确的 reduce 函数,使用 hc = k.hashCode() & 0xffffffff
。按位和函数 (&) 屏蔽第一位,即位符号。
没有哈希冲突的问题(哈希 return 不同键的相同值),重要的是对相同的键具有相同的哈希。