在map/reduce期间,有没有任何方法可以在hadoop中设置和(稍后)获取自定义配置对象?
例如,假设一个应用程序对一个大文件进行预处理,并动态确定与该文件相关的一些特征。此外,假设这些特征保存在自定义java对象(例如 Properties
对象,但不是唯一的,因为有些可能不是字符串),并且随后对于每个map和reduce作业都是必需的。
应用程序如何“传播”这个配置,以便在需要时每个Map器和缩减器函数都可以访问它?
一种方法是使用 set(String, String)
方法 JobConf
类,并传递序列化为 JSON
字符串,但这可能是一个太多的黑客,然后适当的 JobConf
示例必须由每个 Mapper
以及 Reducer
无论如何(例如,遵循前面问题中建议的方法)。
1条答案
按热度按时间clj7thdc1#
除非我遗漏了什么,如果你有
Properties
对象包含在m/r作业中需要的每个属性,只需编写Properties
对象到hadoopConfiguration
对象。例如,类似这样的情况:然后在你的m/r工作中,你可以使用
Context
反对收回你的Configuration
在两个Map器中map
功能)或减速器reduce
函数),如下所示:请注意,在使用
Configuration
对象,也可以访问Context
在setup
以及cleanup
方法,如果需要,可以进行一些初始化。另外值得一提的是,你可以直接打电话给
addResource
方法从Configuration
对象直接将属性添加为InputStream
或者一个文件,但我相信这必须是一个像常规hadoopxml配置那样的xml配置,所以这可能太过了。编辑:对于非字符串对象,我建议使用序列化:您可以序列化对象,然后将其转换为字符串(可能使用base64对其进行编码,因为我不确定如果您有不寻常的字符会发生什么情况),然后在mapper/reducer端反序列化从属性中获取的字符串中的对象
Configuration
.另一种方法是使用相同的序列化技术,而是写入hdfs,然后将这些文件添加到
DistributedCache
. 听起来有点过分,但这可能会奏效。