如何将对象传递给Mapper和reducers

时间:2011-10-22 16:44:47

标签: java hadoop

我在hadoop上运行了一个应用程序。如何将对象传递给映射器和缩减器以便处理数据。例如,我声明一个FieldFilter对象来过滤Mappers中处理的行。过滤器包含许多由用户指定的过滤规则。所以,我想知道如何将过滤器和规则传递给Mappers和Reducers? 我的想法是将对象序列化为String,通过configure传递字符串,然后通过字符串重新构造对象。但似乎对我不好!还有其他办法吗? 谢谢!

public class FieldFilter  {      
private final ArrayList<FieldFilterRule> rules = new ArrayList<FieldFilterRule>();

public FieldFilter addRule(FieldFilterRule ... rules) {
    for (int i = 0; i < rules.length; i++) {
        this.rules.add(rules[i]);
        rules[i].setFieldFilter(this);
    }
    return this;
}    }

2 个答案:

答案 0 :(得分:4)

您希望使用setClass()中的Configuration,因为您可以看到here。然后,您可以newInstance()实例化您的课程。请记住在mapper / reducer的setup()方法中进行实例化,这样每次调用map / reduce方法时都不会实例化过滤器。祝你好运。

- 编辑。我应该补充说,您可以通过上下文访问配置,这就是您获得所需课程的方式。配置api中有getClass()方法。

答案 1 :(得分:1)

在HDFS中序列化FieldFilter和put,然后使用HDFS API在mapper / reducer函数中读取它。如果您有一个大型集群,那么您可能希望将序列化FieldFilter类的默认值replication factor增加到3,因为更多的映射器和读取器任务将读取序列化的FieldFilter类。

如果使用新的MapReduce API,则可以在Mapper.setup()函数中读取序列化的FieldFilter文件。这在map任务初始化期间调用。无法找到旧MapReduce API的相似内容。

您还可以考虑使用DistributedCache将序列化的FieldFilter类分发到不同的节点。