在Hadoop中传播自定义配置值

PNS*_*PNS 5 java configuration hadoop mapreduce properties

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

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

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

一种方法可能是使用类的set(String, String)方法JobConf,例如,通过JSON第二个参数传递序列化为字符串的配置对象,但这可能是一个太多的黑客攻击然后JobConf必须访问相应的实例Mapper,Reducer无论如何(例如,采用类似于先前问题中建议的方法).

Cha*_*guy 8

除非我遗漏了某些内容,否则如果您的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);
}
Run Code Online (Sandbox Code Playgroud)

然后在你的M/R作业中,你可以使用该Context对象Configuration在mapper(map函数)或reducer(reduce函数)中取回你的对象,如下所示:

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

需要注意的是使用时Configuration的对象,您还可以访问Contextsetupcleanup方法,有用做一些初始化如果需要的话.

另外值得一提的是你可以直接addResourceConfiguration对象中调用方法直接将你的属性添加为一个InputStream或一个文件,但我相信这必须是一个像常规Hadoop XML配置一样的XML配置,所以这可能只是矫枉过正.

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

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