我正在测试spring-yarn集成API,我对以下方面的Yarn容器定制的最佳实践感到困惑:
1)如果我想使用spring-boot-yarn组合,那么告诉spring boot获取我的纱线容器实现而不是DefaultYarnContainer的正确方法是什么...我想通过的唯一方法是通过ImportResource包含main方法的容器项目类中的注释,它指向带有声明的spring application xml:
<yarn:container container class="myhadoop.yarn.container.custom.MyContainerImplementation"/>
组件扫描根本不起作用... Spring引导仍然使用DefaultYarnContainer ...
2)如果我正确理解Yarn架构,那么应用程序主机负责启动容器。但是如果我为我的实现改变了DefaultYarnContainer,那么我需要通过run方法手动启动容器,没有什么是启动它,请问正确的方法是什么?
非常感谢您的帮助
答案 0 :(得分:1)
如果boot正在为yarn容器进行自动配置,则很少有方法可以定义默认为DefaultYarnContainer
的实际容器。
yarnContainerClass
yarnContainerRef
customContainerClass
的bean,它将是一个字符串答案 1 :(得分:0)
@EnableAutoConfiguration
@Configuration
@ComponentScan
public class ContainerApplication {
@Autowired
private MyContainerImplementation myContainerImplementation;
@Bean(name="yarnContainerClass")
public Class<? extends YarnContainer> getYarnContainerClass() {
return MyContainerImplementation.class;
}
@Bean(name="yarnContainerRef")
public MyContainerImplementation getYarnContainerRef() {
return myContainerImplementation;
}
@Bean(name="customContainerClass")
public String getCustomContainerClass() {
return "myhadoop.yarn.container.custom.MyContainerImplementation";
}
public static void main(String[] args) {
SpringApplication.run(ContainerApplication.class, args);
}
}
我在你指出时将MyContainerImplementation添加到yml中,我的容器实现是由应用程序主机启动的,而我没有手动运行run方法,因为我在hadoop日志中看到以下几行:
LifecycleObjectSupport:started
myhadoop.yarn.container.custom.MyContainerImplementation@5e2cd950
.
.
LifecycleObjectSupport: stopped
myhadoop.yarn.container.custom.MyContainerImplementation@5e2cd950
无论如何,我还有其他问题。我想测试像ContainerStateListener和YarnPublisher这样的低级纱线,但它们根本没有被调用.. :-(这是我的测试自定义容器:
@Component
public class MyContainerImplementation extends AbstractYarnContainer {
private static final Log log = LogFactory.getLog(MyContainerImplementation.class);
public MyContainerImplementation() {
super();
log.info("...Initializing yarn MyContainerImplementation....");
this.setYarnEventPublisher(new DefaultYarnEventPublisher() {
@Override
public void publishContainerAllocated(Object source, Container container) {
super.publishContainerAllocated(source, container);
log.info("Yarn container allocated: "+container.getResource().getMemory());
}
});
this.addContainerStateListener(new ContainerStateListener() {
@Override
public void state(ContainerState state, Object exit) {
switch(state) {
case COMPLETED: {
log.info("...Container started successfully!...");
break;
}
case FAILED: {
log.info("...Starting of container failed!...");
break;
}
default: {
log.info("Unexpected container state...exiting!...");
}
}
}
});
}
public void runInternal() {
log.info("...Running internal method...");
}
}
我是否需要添加其他配置才能使ContainerStateListener和YarnPublisher工作?
答案 2 :(得分:0)
你是对的。我没有注意到SpringYarnConfig中的以下方法:您不需要为容器实现所有bean,只需要一个 够了。
@Override
public void configure(YarnContainerConfigurer container) throws Exception {
if (StringUtils.hasText(sycp.getContainerClass())) {
container
.containerClass(sycp.getContainerClass());
} else if (yarnContainerClass != null){
container
.containerClass(yarnContainerClass);
} else if (yarnContainerRef != null) {
if (yarnContainerRef instanceof YarnContainer) {
container
.containerRef((YarnContainer) yarnContainerRef);
}
} else if (StringUtils.hasText(containerClass)) {
container.containerClass(containerClass);
}
}
很明显,一个人真的够......:)
使用事件发布者和状态监听器实际上意味着构建 阻止你需要自己打电话。
是的,我看到DefaultYarnContainer正在处理自己调用的notifyXXXX方法(触发容器状态更改)......好吧,我会更明确地使用它。
Janne,非常感谢你的帮助。您提供了对Spring-Yarn的完美更深入的了解。