当前位置: 首页 > 面试题库 >

在Hadoop中传播自定义配置值

贺子昂
2023-03-14
问题内容

在Map / Reduce期间,有什么方法可以设置和(以后)在Hadoop中获取自定义配置对象?

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

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

一种方法可能是使用该类的set(String, String)方法JobConf,例如,通过JSON第二个参数传递配置为字符串的配置对象,但这可能太多了,因此无论如何JobConf都必须访问适当的html" target="_blank">实例(例如,遵循前面问题中建议的方法)。Mapper``Reducer


问题答案:

除非缺少我的东西,否则如果您有一个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函数)或化简器(函数)中找回自己reduce,如下所示:

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

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

同样值得一提的是,您可能可以直接addResourceConfiguration对象调用该方法以将属性直接添加为InputStream一个文件或文件,但是我认为这必须是像常规Hadoop
XML配置一样的XML配置,因此这可能会显得过大。

编辑
:对于非字符串对象,我建议使用序列化:您可以序列化对象,然后将它们转换为字符串(例如,可能使用Base64对其进行编码,因为我不确定如果使用不寻常的字符会发生什么情况),然后在mapper
/ reducer上,从您从内部属性获得的字符串中反序列化对象Configuration

另一种方法是执行相同的序列化技术,而是写入HDFS,然后将这些文件添加到中DistributedCache。听起来有点矫kill过正,但这可能行得通。



 类似资料:
  • MOSN 自定义配置说明。 本文是对 MOSN 自定义配置的说明。 Duration String 字符串,由一个十进制数字和一个时间单位后缀组成,有效的时间单位为 ns、us(或?s)、ms、s、m、h,例如 1h、3s、500ms。 metadata metadata 用于 MOSN 路由和 Cluster Host 之间的匹配。 { "filter_metadata":{ "mo

  • 如果你想自定义 Next.js 的高级配置,可以在根目录下新建next.config.js文件(与pages/ 和 package.json一起) 注意:next.config.js是一个 Node.js 模块,不是一个 JSON 文件,可以用于 Next 启动服务已经构建阶段,但是不作用于浏览器端。 // next.config.js module.exports = { /* config

  • 问题内容: 我有一个关于从自定义配置文件加载属性的问题。我尝试了两种不同的方式来加载文件,但我都无法正常工作,因此希望这里有人可以帮助我。 我尝试的第一种方法是将文件添加到conf目录中,并由此进行引用: 但这又回来了。 我尝试的第二种方法是添加: 到文件,然后在我的控制器中引用它,例如: 但是,这不能编译。 谁能说明我在这里做错了什么? 问题答案: 我不确定conf是否是类路径的一部分。因此,我

  • Gitea 引用 custom 目录中的自定义配置文件来覆盖配置、模板等默认配置。 如果从二进制部署 Gitea ,则所有默认路径都将相对于该 gitea 二进制文件;如果从发行版安装,则可能会将这些路径修改为Linux文件系统标准。Gitea 将会自动创建包括 custom/ 在内的必要应用目录,应用本身的配置存放在 custom/conf/app.ini 当中。在发行版中可能会以 /etc/g

  • Examples Custom babel configuration 为了扩展方便我们使用babel,可以在应用根目录新建.babelrc文件,该文件可配置。 如果有该文件,我们将会考虑数据源,因此也需要定义 next 项目需要的东西,也就是 next/babel预设。 这种设计方案将会使你不诧异于我们可以定制 babel 配置。 下面是.babelrc文件案例: { "presets":

  • Examples Custom webpack bundle analyzer 可以使用些一些常见的模块 @zeit/next-css @zeit/next-sass @zeit/next-less @zeit/next-preact @zeit/next-typescript 注意: webpack方法将被执行两次,一次在服务端一次在客户端。你可以用isServer属性区分客户端和服务端来配置