自定义 Yarn 容器
Customizing Yarn container
我正在测试 spring-yarn 集成 API,我对以下方面的 Yarn 容器自定义最佳实践感到困惑:
1) 如果我想使用 spring-boot-yarn 组合,告诉 spring 引导选择我的 yarn container 而不是 DefaultYarnContainer 的实现的正确方法是什么。 .我想出的唯一方法是通过包含 main 方法的容器项目 class 中的 ImportResource 注释,它指向 spring 应用程序 xml 并声明:
<yarn:container container class="myhadoop.yarn.container.custom.MyContainerImplementation"/>
组件扫描根本不起作用...Spring 启动仍在使用 DefaultYarnContainer...
2) 如果我正确理解 Yarn 架构,那么 application master 负责启动容器。但是,如果我为我的实现更改了 DefaultYarnContainer,那么我需要通过 运行 方法手动启动容器,没有启动它,请问正确的方法是什么?
非常感谢您的帮助
如果引导正在为 yarn 容器进行自动配置,则有几种方法可以定义默认为 DefaultYarnContainer
的实际容器。
- 在yml
中使用spring.yarn.container.containerClass=foo.jee.MyContainer
- 创建 class 作为名称为
yarnContainerClass
的 bean
- 将容器实现创建为名称为
yarnContainerRef
的 bean
- Create bean as name
customContainerClass
这将是一个 class as string
珍妮,非常感谢!这种方式更加优雅并且有效......这是我所做的:
@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 中,我的容器实现是由 application master 启动的,没有我手动 运行ning 运行 方法,因为我在 hadoop 日志中看到以下行:
LifecycleObjectSupport:started
myhadoop.yarn.container.custom.MyContainerImplementation@5e2cd950
.
.
LifecycleObjectSupport: stopped
myhadoop.yarn.container.custom.MyContainerImplementation@5e2cd950
无论如何,我还有一个问题。我想测试像 ContainerStateListener 和 YarnPublisher 这样的低级 yarn 东西,但根本没有调用它们..:-( 这是我的测试定制容器:
@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 正常工作?
You don't need to implement all beans for container, just one is
enough.
你是对的。我没有注意到 SpringYarnConfig 中的以下方法:
@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);
}
}
很明显一个就够了...:)
Use of event publisher and state listener are really meant as building
blocks what you'd need to call yourself.
是的,我看到 DefaultYarnContainer 正在处理自己调用的 notifyXXXX 方法(触发容器状态更改)...好吧,我一定会更多地使用它。
Janne,非常感谢您的帮助。您提供了对 Spring-Yarn 的更深入的了解。
我正在测试 spring-yarn 集成 API,我对以下方面的 Yarn 容器自定义最佳实践感到困惑:
1) 如果我想使用 spring-boot-yarn 组合,告诉 spring 引导选择我的 yarn container 而不是 DefaultYarnContainer 的实现的正确方法是什么。 .我想出的唯一方法是通过包含 main 方法的容器项目 class 中的 ImportResource 注释,它指向 spring 应用程序 xml 并声明:
<yarn:container container class="myhadoop.yarn.container.custom.MyContainerImplementation"/>
组件扫描根本不起作用...Spring 启动仍在使用 DefaultYarnContainer...
2) 如果我正确理解 Yarn 架构,那么 application master 负责启动容器。但是,如果我为我的实现更改了 DefaultYarnContainer,那么我需要通过 运行 方法手动启动容器,没有启动它,请问正确的方法是什么?
非常感谢您的帮助
如果引导正在为 yarn 容器进行自动配置,则有几种方法可以定义默认为 DefaultYarnContainer
的实际容器。
- 在yml 中使用spring.yarn.container.containerClass=foo.jee.MyContainer
- 创建 class 作为名称为
yarnContainerClass
的 bean
- 将容器实现创建为名称为
yarnContainerRef
的 bean
- Create bean as name
customContainerClass
这将是一个 class as string
珍妮,非常感谢!这种方式更加优雅并且有效......这是我所做的:
@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 中,我的容器实现是由 application master 启动的,没有我手动 运行ning 运行 方法,因为我在 hadoop 日志中看到以下行:
LifecycleObjectSupport:started
myhadoop.yarn.container.custom.MyContainerImplementation@5e2cd950
.
.
LifecycleObjectSupport: stopped
myhadoop.yarn.container.custom.MyContainerImplementation@5e2cd950
无论如何,我还有一个问题。我想测试像 ContainerStateListener 和 YarnPublisher 这样的低级 yarn 东西,但根本没有调用它们..:-( 这是我的测试定制容器:
@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 正常工作?
You don't need to implement all beans for container, just one is enough.
你是对的。我没有注意到 SpringYarnConfig 中的以下方法:
@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);
}
}
很明显一个就够了...:)
Use of event publisher and state listener are really meant as building blocks what you'd need to call yourself.
是的,我看到 DefaultYarnContainer 正在处理自己调用的 notifyXXXX 方法(触发容器状态更改)...好吧,我一定会更多地使用它。
Janne,非常感谢您的帮助。您提供了对 Spring-Yarn 的更深入的了解。