繁体   English   中英

在Hadoop中传播自定义配置值

[英]Propagating custom configuration values in Hadoop

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

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

应用程序如何“传播”此配置,以便每个映射器和reducer功能可以在需要时访问它?

一种方法可能是使用JobConf类的set(String, String)方法,例如,通过第二个参数传递序列化为JSON字符串的配置对象,但这可能是一个太大的黑客然后适当无论如何,每个MapperReducer都必须访问JobConf实例(例如,遵循前面问题中建议的方法)。

除非我遗漏了某些东西,否则如果你的M / R作业中有一个包含所需Properties对象,则只需要将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对象在mapper( map函数)或reducer( 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或文件,但我相信这必须是像常规Hadoop XML配置一样的XML配置,所以可能只是矫枉过正。

编辑 :如果是非String对象,我建议使用序列化:您可以序列化您的对象,然后将它们转换为字符串(可能使用Base64对它们进行编码,因为我不确定如果您有不寻常的字符会发生什么),然后在mapper / reducer端从您在Configuration的属性中获取的字符串中反序列化对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM