package com.neverwinterdp.scribengin.dataflow.worker; import java.util.Map; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Stage; import com.mycila.guice.ext.closeable.CloseableInjector; import com.mycila.guice.ext.closeable.CloseableModule; import com.mycila.guice.ext.jsr250.Jsr250Module; import com.neverwinterdp.module.AppModule; import com.neverwinterdp.module.MycilaJmxModuleExt; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryConfig; import com.neverwinterdp.scribengin.dataflow.DataflowContainer; import com.neverwinterdp.vm.VMApp; import com.neverwinterdp.vm.VMConfig; import com.neverwinterdp.vm.VMDescriptor; public class VMDataflowWorkerApp extends VMApp { private Logger logger = LoggerFactory.getLogger(VMDataflowWorkerApp.class) ; private DataflowContainer container; private DataflowTaskExecutorManager dataflowTaskExecutorManager; public DataflowTaskExecutorManager getDataflowWorker() { return this.dataflowTaskExecutorManager; } @Override public void run() throws Exception { final VMConfig vmConfig = getVM().getDescriptor().getVmConfig(); AppModule module = new AppModule(vmConfig.getProperties()) { @Override protected void configure(Map<String, String> properties) { Registry registry = getVM().getVMRegistry().getRegistry(); bindInstance(RegistryConfig.class, registry.getRegistryConfig()); bindInstance(VMDescriptor.class, getVM().getDescriptor()); try { bindType(Registry.class, registry.getClass().getName()); FileSystem fs = null; VMConfig.Environment env = vmConfig.getEnvironment(); if(env == VMConfig.Environment.YARN || env == VMConfig.Environment.YARN_MINICLUSTER) { YarnConfiguration conf = new YarnConfiguration(); vmConfig.overrideHadoopConfiguration(conf); fs = FileSystem.get(conf) ; } else { fs = FileSystem.getLocal(new Configuration()); } bindInstance(FileSystem.class, fs); } catch (Exception e) { logger.error("Error:", e);; } }; }; Module[] modules = { new CloseableModule(),new Jsr250Module(), new MycilaJmxModuleExt(getVM().getDescriptor().getVmConfig().getName()), module }; Injector injector = Guice.createInjector(Stage.PRODUCTION, modules); container = injector.getInstance(DataflowContainer.class); dataflowTaskExecutorManager = container.getDataflowTaskExecutorManager(); try { this.addListener(new VMApp.EventListener() { @Override public void onEvent(VMApp vmApp, Event event) { try { if(event == Event.Shutdown) { dataflowTaskExecutorManager.shutdown(); } } catch (Exception e) { e.printStackTrace(); } } }); dataflowTaskExecutorManager.waitForExecutorTermination(5000); } catch(InterruptedException ex) { } finally { dataflowTaskExecutorManager.shutdown(); container.getInstance(CloseableInjector.class).close(); } } }