java在hadoop中传播自定义配置值

klr1opcd  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(430)

在map/reduce期间,有没有任何方法可以在hadoop中设置和(稍后)获取自定义配置对象?
例如,假设一个应用程序对一个大文件进行预处理,并动态确定与该文件相关的一些特征。此外,假设这些特征保存在自定义java对象(例如 Properties 对象,但不是唯一的,因为有些可能不是字符串),并且随后对于每个map和reduce作业都是必需的。
应用程序如何“传播”这个配置,以便在需要时每个Map器和缩减器函数都可以访问它?
一种方法是使用 set(String, String) 方法 JobConf 类,并传递序列化为 JSON 字符串,但这可能是一个太多的黑客,然后适当的 JobConf 示例必须由每个 Mapper 以及 Reducer 无论如何(例如,遵循前面问题中建议的方法)。

clj7thdc

clj7thdc1#

除非我遗漏了什么,如果你有 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 反对收回你的 Configuration 在两个Map器中 map 功能)或减速器 reduce 函数),如下所示:

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

请注意,在使用 Configuration 对象,也可以访问 Contextsetup 以及 cleanup 方法,如果需要,可以进行一些初始化。
另外值得一提的是,你可以直接打电话给 addResource 方法从 Configuration 对象直接将属性添加为 InputStream 或者一个文件,但我相信这必须是一个像常规hadoopxml配置那样的xml配置,所以这可能太过了。
编辑:对于非字符串对象,我建议使用序列化:您可以序列化对象,然后将其转换为字符串(可能使用base64对其进行编码,因为我不确定如果您有不寻常的字符会发生什么情况),然后在mapper/reducer端反序列化从属性中获取的字符串中的对象 Configuration .
另一种方法是使用相同的序列化技术,而是写入hdfs,然后将这些文件添加到 DistributedCache . 听起来有点过分,但这可能会奏效。

相关问题