MapReduce with "customized" key



我有以下问题:我有很多键值对形式的数据。键是某个id,值是某段文本。我的目标是将这些对象分组到文本片段在某种程度上"相似"的集群中。因此,如果将我的文本片段作为键,将id作为值,这看起来就像是MapReduce的一项任务。但这样的键并不是传统的MapReduce使用方式,而且由于我并不真正了解MapReduce框架的内部实现,我不确定这种方式是否有效。因此,我的详细想法是:1.使用Java中的MapReduce(Hadoop、GridGain)2.为我的文本片段创建特殊类(比如TextKey)3.重写类的equals(),将文本比较逻辑打包在这里(比如levenstein距离比较,或者其他什么)4.重写compareTo()以允许MapReduce按关键字排序(比如字典顺序)5.可能会覆盖hashCode()6.将我的数据映射到键值对:keys->text片段,打包在TextKey类中,values->ids7.通过收集每个"相等"(实际上相似)密钥的ID来简单地减少

MapReduce能以这种方式工作吗?

在GridGain中,通过将文本键存储在分区数据网格中,可以轻松解决此问题。GridGain Data Grid会自动根据键在集群中对数据集进行分区,所以只要你有类似的文本片段正确地实现标准的java hashCode()和equals(),你就可以了。

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

  1. 映射阶段结束后,它的输出将使用Partitioner(默认情况下为HashPartitioner,但您可以提供自己的Paritionier)进行分区。您的TextKey应该实现一个LSH hashCode,这样类似的Text值可能会被分配到同一个分区。

  2. 如果键是Strings/Text对象,默认排序器将工作,但我认为这不会影响您描述的场景的结果。

  3. 问题出在Grouper,它将分区内的每个组传递给一个reduce调用。默认情况下,这个分组器遍历按该时刻排序的分区,并用相等的值组成组。在你的情况下,你应该确保分组不是通过相等,而是通过相似。因此,您的TextKey还应该实现compareTo()方法,并且如果LSH hashCodes相同,请注意返回0。

总之,您可以使用默认的数据路径(即默认的Partitioner、Sorter、Grouper),但您的TextKey(应该实现WritableComparable)应该在hashCode()compareTo()方法

中发挥作用

相关内容

  • 没有找到相关文章