【问题标题】:Hadoop map/reduce structureHadoop map/reduce 结构
【发布时间】:2014-03-22 00:58:51
【问题描述】:

我想知道是否可以为 mapper/reducer 指定多个“键”;比如说我有一个如下的类

 class A {
     region
     name
     age
     .....
     more attributes
 }

我想根据三个不同的键提取信息:年龄、地区和姓名。

例如以年龄为键:

< age, attributes related to age >

然后将名称作为键:

< name, attributes related to name >

对于该地区也是如此;我现在的问题是,我是否必须创建不同的 map/reduce 作业,为每个作业提供不同的密钥?或者我可以在单个 map/reduce 作业中(安全地)做到这一点?

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    您也可以在单个 Map Reduce 作业中执行此操作。

    您的 Mapper 将读取数据。假设这是序列化格式,其结构类似于您的类(自定义可写)。

    您可以从映射器收集包含 2 个部分的复杂键形式的输出 - 您正在收集的内容:值,例如年龄:18。这可以是 Text 或自定义可再次写入。

    根据您的用例,您可能需要使用分区器来确保所有带有 Age 的键都转到单个减速器,而带有名称的键转到另一个减速器。没有分区器所有年龄:18 的键都将转到同一个减速器。

    【讨论】:

    • 我正在使用 Avro 框架进行序列化;那将是真棒。形成特定的键很好,很适合我的情况。我可以提供一个密钥,它是一对和一个自定义可写的,如下所示:&lt; Pair&lt;Age, 10&gt;, WritableClassAInstance &gt; 这有效吗?
    • 当我们这样做的时候,哪个会更好(性能方面)实现一个自定义的可写对象,或者只是将所有内容都变成一个字符串并在每个 reducer 上编写一个解析器?
    • 不确定 Avro。但是你建议的当然看起来不错。关于您关于性能的其他问题:没有字符串,它都是可写的。所以我认为性能不会成为问题。自定义可写代码的可读性和可维护性会更好,尤其是在使用 Avro 时。
    • 我们同意这一点。感谢@Venkat 的洞察力!
    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多