如何在Hadoop中加载外部属性文件

时间:2012-12-17 20:56:02

标签: spring hadoop configuration-files

我有一个hadoop工作,其中包括一些春豆。此外,在spring上下文文件中,有一个名为app.properties的PropertyPlaceholderConfigurer。

这个app.properties在jar文件中,想法是从jar文件中删除它,以便在不重新编译的情况下更改某些属性。

我尝试了-file选项,-jarlibs选项,但都没有效果。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我做的是:

  • 对PropertyPlaceholderConfigurer
  • 进行子类化
  • 覆盖loadProperties方法
  • 如果有自定义System.getProperty(“hdfs_path”)

        try {
            Path pt = new Path(hdfsLocationPath);
            FileSystem fs = FileSystem.get(new Configuration());
            BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(pt)));
            props.load(br);
        } catch (Exception e) {
            LOG.error(e);
        }
    

就像一个魅力......

答案 1 :(得分:1)

您可以将此属性文件添加到分布式缓存中,如下所示:

...
String s3PropertiesFilePath = args[0];
DistributedCache.addCacheFile(new URI(s3PropertiesFilePath), conf);
...

稍后,在mapper / reducer的configure()中,您可以执行以下操作:

...
Path s3PropertiesFilePath;
Properties prop = new Properties();
@Override
public void configure(JobConf job) {
    s3PropertiesFilePath = DistributedCache.getLocalCacheFiles(job)[0];
    //load the properties file
    prop.load(new FileInputStream(s3PropertiesFilePath.toString()));
...
}

PS:如果您没有在Amazon EMR上运行它,那么您可以将此属性文件保留在hdfs中并改为提供该路径。