public LaunchRunner(Config config, Config runtime) { this.config = config; this.runtime = runtime; this.launcher = Runtime.launcherClassInstance(runtime); this.packing = Runtime.packingClassInstance(runtime); }
@Override public Boolean call() { SchedulerStateManagerAdaptor statemgr = Runtime.schedulerStateManagerAdaptor(runtime); TopologyAPI.Topology topology = Runtime.topology(runtime); String topologyName = Context.topologyName(config); // get the packed plan packing.initialize(config, runtime); PackingPlan packedPlan = packing.pack(); if (packedPlan == null) { LOG.severe("Failed to pack a valid PackingPlan. Check the config."); return false; } // Add the instanceDistribution to the runtime Config ytruntime = Config.newBuilder() .putAll(runtime) .put(Keys.instanceDistribution(), packedPlan.getInstanceDistribution()) .put(Keys.componentRamMap(), packedPlan.getComponentRamDistribution()) .build(); // initialize the launcher launcher.initialize(config, ytruntime); Boolean result; // Set topology def first since we determine whether a topology is running // by checking the existence of topology def // store the trimmed topology definition into the state manager result = statemgr.setTopology(trimTopology(topology), topologyName); if (result == null || !result) { LOG.severe("Failed to set topology definition"); return false; } // store the execution state into the state manager ExecutionEnvironment.ExecutionState executionState = createExecutionState(); result = statemgr.setExecutionState(executionState, topologyName); if (result == null || !result) { LOG.severe("Failed to set execution state"); statemgr.deleteTopology(topologyName); return false; } // launch the topology, clear the state if it fails if (!launcher.launch(packedPlan)) { statemgr.deleteExecutionState(topologyName); statemgr.deleteTopology(topologyName); LOG.log(Level.SEVERE, "Failed to launch topology"); return false; } return true; }
public ExecutionEnvironment.ExecutionState createExecutionState() { String releaseUsername = Context.buildUser(config); // TODO(mfu): Currently we leave release tag empty String releaseTag = ""; String releaseVersion = Context.buildVersion(config); TopologyAPI.Topology topology = Runtime.topology(runtime); ExecutionEnvironment.ExecutionState.Builder builder = ExecutionEnvironment.ExecutionState.newBuilder(); // set the topology name, id, submitting user and time builder .setTopologyName(topology.getName()) .setTopologyId(topology.getId()) .setSubmissionTime(System.currentTimeMillis() / 1000) .setSubmissionUser(System.getProperty("user.name")) .setCluster(Context.cluster(config)) .setRole(Context.role(config)) .setEnviron(Context.environ(config)); // build the heron release state ExecutionEnvironment.HeronReleaseState.Builder releaseBuilder = ExecutionEnvironment.HeronReleaseState.newBuilder(); releaseBuilder.setReleaseUsername(releaseUsername); releaseBuilder.setReleaseTag(releaseTag); releaseBuilder.setReleaseVersion(releaseVersion); builder.setReleaseState(releaseBuilder); if (builder.isInitialized()) { return builder.build(); } else { throw new RuntimeException("Failed to create execution state"); } }