我正在尝试使用 spring boot 编写一个 yarn 应用程序。只是为了明确一点,我没有使用弹簧纱线功能。相反,我正在使用普通的弹簧靴子来使用纱线。出于某种原因,当我在 Spring 引导应用程序中加载 new YarnConfiguration()
对象时,它只加载核心站点.xml和 yarn-site.xml而不是 mapred、hdfs 和所有默认的 xml 等效项。如果我不使用 spring 启动,则加载所有 xml 文件。不加载 xml 文件的问题是应用程序无法连接到资源管理器。我假设这是由 spring boot 引起的类路径中的一些变化引起的,但我不确定如何解决它们。
这是我的配置
@Configuration
@EnableConfigurationProperties
@EnableAutoConfiguration
@ComponentScan
public class Application implements CommandLineRunner {
@Bean
public org.apache.hadoop.conf.Configuration conf() throws IOException {
YarnConfiguration conf = new YarnConfiguration();
log.info("conf " + conf.toString());
log.info("fs " + FileSystem.get(conf));
return new YarnConfiguration();
}
日志输出显示配置中仅加载了 2 个 xml 文件,因此,下一行加载的 fs 是本地文件系统而不是 HDFS。
任何想法...
这里有几个可能的问题:
关于本地文件系统而不是 hdfs:YarnConfiguration 应该加载 core-site.xml,你的 core-site .xml 应该有这样的东西:
<property>
<name>fs.defaultFS</name>
<value>hdfs://NAMENODE:8020</value>
</property>
此外,这个核心站点.xml应该在你的应用程序的类路径中,请注意Hadoopjars也有一个默认/空的核心站点.xml,所以你必须确保你的有优先级。
关于 Yarn 和 mapreduce:Yarn 是一个通用的资源管理和调度框架,mapReduce 只是可以在 yarn 上运行的应用程序类型之一。这就是为什么 YarnConfiguration 不会加载 mapreduce-*.xml,但是当你尝试提交 mapreduce 作业时,这些文件将由 mapreduce 代码加载:
Configuration configuration = new YarnConfiguration()
Job job = Job.newInstance(configuration)
job.getConfiguration(); // this configuration should have mapred-*.xml files loaded
job.submit();