在 Hadoop 二级排序中将键值路由到正确的 Reducer
Posted
技术标签:
【中文标题】在 Hadoop 二级排序中将键值路由到正确的 Reducer【英文标题】:Routing Key-Values to the correct Reducer in a Hadoop Secondary Sort 【发布时间】:2013-11-02 19:27:14 【问题描述】:我有三个 reducer,我需要它们每个都接收相同的密钥,如下所示:
GOOG - Reducer 0
AAPL - Reducer 1
VMW - Reducer 2
在分区器中,getPartition() 方法应返回一个 int 值,指示化简器的索引(0,1,2)之一。
我拥有的getPartition()的实现是:
return ((CompositeKey) key).getSymbol().hashCode() % numReduceTasks;
然而这在我这里是行不通的:
int numReduceTasks = 3;
System.out.println("GOOG".hashCode() % numReduceTasks);//output: 0
System.out.println("AAPL".hashCode() % numReduceTasks);//output: 1
System.out.println("VMW".hashCode() % numReduceTasks);//output: 1
所以在我得到的输出文件中
.../part-r-00000
GOOG
.../part-r-00001
AAPL
VMW
.../part-r-00002
<empty>
问题是我该如何解决这个问题?即我如何编写一个分区函数来保证相同的键进入同一个减速器。
【问题讨论】:
【参考方案1】:代码的工作方式完全符合任何人的预期。您使用的是随机的哈希码,您不能保证当您 %3 时它们会给出不同的值。我认为这样做的唯一方法是使用一系列 if 语句来做出确定性决定:
if GOOG: return 0
if AAPL: return 1
if VMW: return 2
一些建议:在 MapReduce 中“跳出框框”是一种危险的游戏。使用 MapReduce 的最佳方式是遵守规则并继承其优势。有时它并不总是可行的,但你应该总是尝试!
【讨论】:
感谢@Donald,但在这种情况下,我将无法在 LocalJobRunner 中运行它。以上是关于在 Hadoop 二级排序中将键值路由到正确的 Reducer的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )
如何在 Laravel 4 中将一个路由重定向到 HTTPS,将所有其他路由重定向到 HTTP?
javascript 在二级菜单中将Divi社交图标移动到右侧