除非缺少我的东西,否则如果您有一个
Properties包含M /
R作业中所需的每个属性的对象,则只需要将
Properties对象的内容写入Hadoop
Configuration对象。例如,如下所示:
Configuration conf = new Configuration();Properties params = getParameters(); // do whatever you need here to create your objectfor (Entry<Object, Object> entry : params.entrySet()) { String propName = (String)entry.getKey(); String propValue = (String)entry.getValue(); conf.set(propName, propValue);}然后在M /
R作业内部,您可以使用该
Context对象
Configuration在映射器(
map函数)或化简器(函数)中找回自己
reduce,如下所示:
public void map(MD5Hash key, OverlapDataWritable value, Context context) Configuration conf = context.getConfiguration(); String someProperty = conf.get("something"); ....}需要注意的是使用时
Configuration的对象,您还可以访问
Context中
setup和
cleanup方法,有用的,如果需要做一些初始化。
同样值得一提的是,您可能可以直接
addResource从
Configuration对象调用该方法以将属性直接添加为
InputStream一个文件或文件,但是我认为这必须是像常规Hadoop
XML配置一样的XML配置,因此这可能会显得过大。
编辑
:对于非字符串对象,我建议使用序列化:您可以序列化对象,然后将它们转换为字符串(例如,可能使用base64对其进行编码,因为我不确定如果使用不寻常的字符会发生什么情况),然后在mapper
/ reducer上,从您从内部属性获得的字符串中反序列化对象
Configuration。
另一种方法是执行相同的序列化技术,而是写入HDFS,然后将这些文件添加到中
DistributedCache。听起来有点矫kill过正,但这可能行得通。



