package com.neverwinterdp.scribengin.dataflow.service; import java.util.HashMap; import java.util.Map; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryConfig; import com.neverwinterdp.scribengin.dataflow.DataflowDescriptor; import com.neverwinterdp.scribengin.dataflow.DataflowRegistry; import com.neverwinterdp.scribengin.dataflow.DataflowTaskDescriptor; import com.neverwinterdp.scribengin.dataflow.worker.VMDataflowWorkerApp; import com.neverwinterdp.scribengin.storage.StorageDescriptor; import com.neverwinterdp.scribengin.storage.sink.Sink; import com.neverwinterdp.scribengin.storage.sink.SinkFactory; import com.neverwinterdp.scribengin.storage.source.Source; import com.neverwinterdp.scribengin.storage.source.SourceFactory; import com.neverwinterdp.scribengin.storage.source.SourceStream; import com.neverwinterdp.vm.VMConfig; import com.neverwinterdp.vm.VMDescriptor; import com.neverwinterdp.vm.client.VMClient; public class DataflowServiceInititializer { public void onInit(DataflowService service) throws Exception { DataflowRegistry dataflowRegistry = service.getDataflowRegistry(); DataflowDescriptor dataflowDescriptor = dataflowRegistry.getDataflowDescriptor(); initTaskDescriptors(service, dataflowDescriptor); initWorkers(service, dataflowDescriptor); } private void initTaskDescriptors(DataflowService service, DataflowDescriptor dataflowDescriptor) throws Exception { SourceFactory sourceFactory = service.getSourceFactory(); SinkFactory sinkFactory = service.getSinkFactory() ; Source source = sourceFactory.create(dataflowDescriptor.getSourceDescriptor()) ; Map<String, Sink> sinks = new HashMap<String, Sink>(); for(Map.Entry<String, StorageDescriptor> entry : dataflowDescriptor.getSinkDescriptors().entrySet()) { Sink sink = sinkFactory.create(entry.getValue()); sinks.put(entry.getKey(), sink); } SourceStream[] sourceStream = source.getStreams(); for(int i = 0; i < sourceStream.length; i++) { DataflowTaskDescriptor descriptor = new DataflowTaskDescriptor(); descriptor.setId(i); descriptor.setScribe(dataflowDescriptor.getScribe()); descriptor.setSourceStreamDescriptor(sourceStream[i].getDescriptor()); for(Map.Entry<String, Sink> entry : sinks.entrySet()) { descriptor.add(entry.getKey(), entry.getValue().newStream().getDescriptor()); } service.addAvailableTask(descriptor); } } private void initWorkers(DataflowService service, DataflowDescriptor dataflowDescriptor) throws Exception { DataflowRegistry dataflowRegistry = service.getDataflowRegistry(); Registry registry = dataflowRegistry.getRegistry(); VMClient vmClient = new VMClient(registry); RegistryConfig registryConfig = registry.getRegistryConfig(); String dataflowAppHome = dataflowDescriptor.getDataflowAppHome(); for(int i = 0; i < dataflowDescriptor.getNumberOfWorkers(); i++) { VMConfig vmConfig = new VMConfig(). setEnvironment(service.getVMConfig().getEnvironment()). setName(dataflowDescriptor.getName() + "-worker-" + (i + 1)). addRoles("dataflow-worker"). setRegistryConfig(registryConfig). setVmApplication(VMDataflowWorkerApp.class.getName()). addProperty("dataflow.registry.path", dataflowRegistry.getDataflowPath()). setHadoopProperties(service.getVMConfig().getHadoopProperties()); if(dataflowAppHome != null) { vmConfig.setAppHome(dataflowAppHome); vmConfig.addVMResource("dataflow.libs", dataflowAppHome + "/libs"); } VMDescriptor vmDescriptor = vmClient.allocate(vmConfig); service.addWorker(vmDescriptor); } } }