【问题标题】:Propagating custom configuration values in Hadoop在 Hadoop 中传播自定义配置值
【发布时间】:2013-02-04 23:31:55
【问题描述】:

在 Map/Reduce 期间,有没有办法在 Hadoop 中设置和(稍后)获取自定义配置对象?

例如,假设一个应用程序预处理一个大文件并动态确定与该文件相关的一些特征。此外,假设这些特征保存在自定义 Java 对象中(例如,Properties 对象,但不是唯一的,因为有些可能不是字符串),并且随后对于每个 map 和 reduce 作业都是必需的。

应用程序如何“传播”此配置,以便每个映射器和缩减器函数在需要时都可以访问它?

一种方法可能是使用JobConf 类的set(String, String) 方法,例如,通过第二个参数将配置对象序列化为JSON 字符串,但这可能太过分了然后每个MapperReducer 都必须访问适当的JobConf 实例(例如,遵循earlier question 中建议的方法)。

【问题讨论】:

    标签: java properties configuration hadoop mapreduce


    【解决方案1】:

    除非我遗漏了什么,如果你有一个 Properties 对象包含你在 M/R 工作中需要的所有属性,你只需要将 Properties 对象的内容写入 Hadoop Configuration 对象.例如,像这样:

    Configuration conf = new Configuration();
    Properties params = getParameters(); // do whatever you need here to create your object
    for (Entry<Object, Object> entry : params.entrySet()) {
        String propName = (String)entry.getKey();
        String propValue = (String)entry.getValue();
        conf.set(propName, propValue);
    }
    

    然后在您的 M/R 作业中,您可以使用 Context 对象在映射器(map 函数)或减速器(reduce 函数)中取回您的 Configuration,就像这样:

    public void map(MD5Hash key, OverlapDataWritable value, Context context)
        Configuration conf = context.getConfiguration();
        String someProperty = conf.get("something");
        ....
    }
    

    请注意,在使用Configuration 对象时,您还可以在setupcleanup 方法中访问Context,如果需要,这对进行一些初始化很有用。

    另外值得一提的是,您可以直接从Configuration 对象调用addResource 方法,将您的属性直接添加为InputStream 或文件,但我相信这必须是像常规一样的XML 配置Hadoop XML 配置,所以这可能有点矫枉过正。

    编辑:如果是非字符串对象,我建议使用序列化:您可以序列化您的对象,然后将它们转换为字符串(可能像我一样使用 Base64 对它们进行编码)不知道如果你有不寻常的字符会发生什么),然后在映射器/减速器端反序列化从Configuration 中的属性获得的字符串中的对象。

    另一种方法是执行相同的序列化技术,但改为写入 HDFS,然后将这些文件添加到 DistributedCache。听起来有点矫枉过正,但这可能会奏效。

    【讨论】:

    • 如果所有属性都是字符串,这很好。在我的用例中,有些不是,它们是 map 和 reduce 部分都需要的(相当复杂的)自定义 Java 对象。但是无论如何+1的答案。 :-)
    • @PNS 好吧,如果你想传递非字符串对象,你总是可以在将对象转换为字符串并将这些字符串传递给Configuration之前序列化你的对象,然后在映射器/减速器中反序列化对象。我认为没有任何本地方式可以像这样传递对象。您可能还可以将对象序列化为文件并将其放入 HDFS 中,然后使用 DistributedCache 获取此文件。
    • 是的,序列化似乎还是有必要的,因为 MapReduce 是一个分布式应用程序。
    • 使用 Base64 对序列化字符串进行编码是一个非常好的主意。 *、'、" 等特殊符号可能导致作业失败。
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2020-06-13
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多