【问题标题】:MapReduce with "customized" key带有“自定义”键的 MapReduce
【发布时间】:2012-08-04 08:31:34
【问题描述】:

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

MapReduce 可以这样工作吗?

【问题讨论】:

    标签: java hadoop mapreduce equals gridgain


    【解决方案1】:

    在 GridGain 中,这可以通过将文本键存储在分区数据网格中轻松解决。 GridGain Data Grid 将根据键在集群中自动分区您的数据集,因此只要您的相似文本片段正确实现标准 java hashCode() 和 equals(),就可以了。

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

    【讨论】:

      【解决方案2】:
      1. 在映射阶段之后,其输出使用分区器(默认为 HashPartitioner,但您可以提供自己的分区器)进行分区。您的 TextKey 应实现 LSH hashCode,以便相似的 Text 值可能进入同一个分区。

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

      3. 问题出在 Grouper 上,它将分区中的每个组传递给单个 reduce 调用。默认情况下,此分组器会遍历此时排序的分区,并形成具有相等值的组。在您的情况下,您应该确保分组不是通过相等而是通过相似来完成的。因此,您的 TextKey 还应该实现 compareTo() 方法,如果 LSH 哈希码相同,请注意返回 0。

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

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 2016-07-27
        • 1970-01-01
        • 2020-07-03
        • 2011-02-17
        • 2017-05-17
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        相关资源
        最近更新 更多