除非我遗漏了什么,如果你有一个 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 对象时,您还可以在setup 和cleanup 方法中访问Context,如果需要,这对进行一些初始化很有用。
另外值得一提的是,您可以直接从Configuration 对象调用addResource 方法,将您的属性直接添加为InputStream 或文件,但我相信这必须是像常规一样的XML 配置Hadoop XML 配置,所以这可能有点矫枉过正。
编辑:如果是非字符串对象,我建议使用序列化:您可以序列化您的对象,然后将它们转换为字符串(可能像我一样使用 Base64 对它们进行编码)不知道如果你有不寻常的字符会发生什么),然后在映射器/减速器端反序列化从Configuration 中的属性获得的字符串中的对象。
另一种方法是执行相同的序列化技术,但改为写入 HDFS,然后将这些文件添加到 DistributedCache。听起来有点矫枉过正,但这可能会奏效。