2012-08-04 42 views
1

我有以下问题:我有大量的键值对形式的数据。关键是一些id和价值 - 一些文字。我的目标是将这些对象以文本片段以某种方式“相似”分组。所以它看起来像是MapReduce的一项任务,如果将我的文本片段作为关键字,并将id作为值。但是这样的密钥并不是传统的MapReduce使用方式,而且我也没有真正意识到MapReduces框架的内部实现,所以我不确定这种方式是否有效。所以我的想法详细是: 1.在Java中采用一些MapReduce(Hadoop,GridGain) 2.为我的文本块创建特殊类(如TextKey) 3.覆盖类的equals(),打包文本比较逻辑(比如levenstein距离比较,或者其他) 4.重写compareTo()允许MapReduce按键排序(比如说词典排序) 5.可能覆盖hashCode() 6.将我的数据映射到键值对:键 - >文本块,包装在TextKey类中,值 - > IDs 7.简单地通过收集每个“相等”(实际上相似的)键的ID来减少MapReduce与“定制”键

MapReduce可以以这种方式工作吗?右边的地图阶段之后

回答

0
  1. ,其输出使用分区程序分区(HashPartitioner默认,但你可以提供自己的Parititioner)。你的TextKey应该实现一个LSH hashCode,以便类似的Text值可能会进入同一个分区。

  2. 如果键是字符串/文本对象,默认排序器将工作,但我认为这不会影响您的结果给出你描述的情况。

  3. 问题在于Grouper将分区内的每个组传递给单个reduce调用。默认情况下,这个分组器遍历按这个时刻排序的分区,它形成了等值的分组。在你的情况下,你应该确保分组不是平等的,而是相似的。所以,你的TextKey也应该实现compareTo()方法,并且在LSH hashCode相同的情况下注意返回0。

总之,你可以使用默认的数据路径去(即默认分区程序,分拣机,石斑鱼),但您的TextKey(这应该实现WritableComparable)应该做的hashCode()compareTo()方法神奇

3

在通过将文本键存储在分区数据网格中,可以轻松解决GridGain问题。 GridGain数据网格会根据密钥自动将数据集划分到集群中,所以只要你有相似的文本部分正确地实现了标准的java hashCode()和equals(),你应该没问题。

您还可以在GridGain中发送基于亲和力的MapReduce任务,以确保您的作业最终位于与数据相同的节点上,以避免在您需要对数据执行一些计算时发生冗余数据移动。这可以通过执行GridProjection.affinityRun(...)方法来实现。