package resa.evaluation.optimize; import backtype.storm.Config; import backtype.storm.generated.Nimbus; import backtype.storm.generated.TopologyInfo; import backtype.storm.scheduler.ExecutorDetails; import backtype.storm.task.GeneralTopologyContext; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.IRichSpout; import backtype.storm.topology.TopologyBuilder; import backtype.storm.utils.NimbusClient; import backtype.storm.utils.Utils; import org.junit.Test; import resa.evaluation.simulate.sleep.TASplitSentence; import resa.evaluation.simulate.sleep.TAWordCounter; import resa.evaluation.util.RedisDataSource; import resa.examples.wc.RandomSentenceSpout; import resa.optimize.AggResultCalculator; import resa.optimize.SimpleGeneralAllocCalculator; import resa.util.ResaConfig; import resa.util.TopologyHelper; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * Created by Tom.fu on 5/5/2014. */ public class SimpleGeneralAllocCalculatorTest { private TopologyBuilder builder = new TopologyBuilder(); private Map<String, Object> conf = ResaConfig.create(true); private Map<Integer, String> t2c = new HashMap<>(); @Test public void testMake() throws Exception { int numWorkers = 3; int numAckers = 1; conf.put(Config.TOPOLOGY_WORKERS, 3); conf.put(Config.TOPOLOGY_ACKER_EXECUTORS, 1); IRichSpout spout = new RandomSentenceSpout(); builder.setSpout("sentenceSpout", spout, 1); double split_mu = 10.0; IRichBolt splitBolt = new TASplitSentence(() -> (long) (-Math.log(Math.random()) * 1000.0 / split_mu)); builder.setBolt("split", splitBolt, 4).shuffleGrouping("sentenceSpout"); double counter_mu = 5.0; IRichBolt wcBolt = new TAWordCounter(() -> (long) (-Math.log(Math.random()) * 1000.0 / counter_mu)); builder.setBolt("counter", wcBolt, 2).shuffleGrouping("split"); t2c.clear(); t2c.put(5, "sentenceSpout"); t2c.put(3, "counter"); t2c.put(4, "counter"); t2c.put(6, "split"); t2c.put(7, "split"); t2c.put(8, "split"); t2c.put(9, "split"); Map<String, Integer> currAllocation = new HashMap<>(); currAllocation.put("counter", 2); currAllocation.put("split", 4); currAllocation.put("sentenceSpout", 1); SimpleGeneralAllocCalculator smdm = new SimpleGeneralAllocCalculator(); smdm.init(conf, currAllocation, builder.createTopology()); String host = "192.168.0.31"; int port = 6379; String queue = "ta1wc"; int maxLen = 50; Map<String, List<ExecutorDetails>> comp2Executors = new HashMap<>(); comp2Executors.put("counter", Arrays.asList(new ExecutorDetails(3, 3), new ExecutorDetails(4, 4))); comp2Executors.put("sentenceSpout", Arrays.asList(new ExecutorDetails(5, 5))); comp2Executors.put("split", Arrays.asList(new ExecutorDetails(6, 6), new ExecutorDetails(7, 7), new ExecutorDetails(8, 8), new ExecutorDetails(9, 9))); AggResultCalculator resultCalculator = new AggResultCalculator( RedisDataSource.readData(host, port, queue, maxLen), comp2Executors, builder.createTopology()); resultCalculator.calCMVStat(); System.out.println(smdm.calc(resultCalculator.getResults(), 6)); } @Test public void testRebalanceUsingTopologyHelper() throws Exception { conf.put(Config.NIMBUS_HOST, "192.168.0.31"); conf.put(Config.NIMBUS_THRIFT_PORT, 6627); conf.put("resa.opt.smd.qos.ms", 1500.0); conf.put("resa.opt.win.history.size", 3); GeneralTopologyContext gtc = TopologyHelper.getGeneralTopologyContext("ta1wc", conf); if (gtc == null) { System.out.println("gtc is null"); return; } String host = "192.168.0.31"; int port = 6379; String queue = "ta1wc"; int maxLen = 500; String topoName = "ta1wc"; NimbusClient nimbusClient = NimbusClient.getConfiguredClient(conf); Nimbus.Client nimbus = nimbusClient.getClient(); String topoId = TopologyHelper.getTopologyId(nimbus, topoName); Map<String, List<ExecutorDetails>> comp2Executors = TopologyHelper.getTopologyExecutors(topoName, conf) .entrySet().stream().filter(e -> !Utils.isSystemId(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); for (int i = 0; i < 10000; i++) { Utils.sleep(10000); TopologyInfo topoInfo = nimbus.getTopologyInfo(topoId); Map<String, Integer> currAllocation = topoInfo.get_executors().stream().filter(e -> !Utils.isSystemId(e.get_component_id())) .collect(Collectors.groupingBy(e -> e.get_component_id(), Collectors.reducing(0, e -> 1, (i1, i2) -> i1 + i2))); System.out.println("-------------Report on: " + System.currentTimeMillis() + "------------------------------"); System.out.println(currAllocation); } } @Test public void testMakeUsingTopologyHelper() throws Exception { conf.put(Config.NIMBUS_HOST, "192.168.0.30"); conf.put(Config.NIMBUS_THRIFT_PORT, 6627); conf.put("resa.opt.smd.qos.ms", 1500.0); conf.put("resa.opt.win.history.size", 3); conf.put("resa.comp.sample.rate", 1.0); conf.put(ResaConfig.ALLOWED_EXECUTOR_NUM, 7); GeneralTopologyContext gtc = TopologyHelper.getGeneralTopologyContext("ta1wc2Redis", conf); if (gtc == null) { System.out.println("gtc is null"); return; } String host = "192.168.0.30"; int port = 6379; String queue = "ta1wc"; int maxLen = 500; String topoName = "ta1wc2Redis"; NimbusClient nimbusClient = NimbusClient.getConfiguredClient(conf); Nimbus.Client nimbus = nimbusClient.getClient(); String topoId = TopologyHelper.getTopologyId(nimbus, topoName); TopologyInfo topoInfo = nimbus.getTopologyInfo(topoId); Map<String, Integer> currAllocation = topoInfo.get_executors().stream().filter(e -> !Utils.isSystemId(e.get_component_id())) .collect(Collectors.groupingBy(e -> e.get_component_id(), Collectors.reducing(0, e -> 1, (i1, i2) -> i1 + i2))); SimpleGeneralAllocCalculator smdm = new SimpleGeneralAllocCalculator(); smdm.init(conf, currAllocation, gtc.getRawTopology()); Map<String, List<ExecutorDetails>> comp2Executors = TopologyHelper.getTopologyExecutors(topoName, conf) .entrySet().stream().filter(e -> !Utils.isSystemId(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); for (int i = 0; i < 10000; i++) { Utils.sleep(30000); topoInfo = nimbus.getTopologyInfo(topoId); Map<String, Integer> updatedAllocation = topoInfo.get_executors().stream().filter(e -> !Utils.isSystemId(e.get_component_id())) .collect(Collectors.groupingBy(e -> e.get_component_id(), Collectors.reducing(0, e -> 1, (i1, i2) -> i1 + i2))); AggResultCalculator resultCalculator = new AggResultCalculator( RedisDataSource.readData(host, port, queue, maxLen), comp2Executors, gtc.getRawTopology()); resultCalculator.calCMVStat(); System.out.println("-------------Report on: " + System.currentTimeMillis() + "------------------------------"); if (currAllocation.equals(updatedAllocation)) { System.out.println(currAllocation + "-->" + smdm.calc(resultCalculator.getResults(), 7)); } else { currAllocation = updatedAllocation; smdm.allocationChanged(currAllocation); System.out.println("Allocation updated to " + currAllocation); } } } @Test public void testMakeUsingTopologyHelperForkTopology() throws Exception { conf.put(Config.NIMBUS_HOST, "192.168.0.30"); conf.put(Config.NIMBUS_THRIFT_PORT, 6627); conf.put("resa.opt.smd.qos.ms", 1500.0); conf.put("resa.opt.win.history.size", 3); conf.put("resa.opt.win.history.size.ignore", -1); conf.put("resa.comp.sample.rate", 1.0); int allewedExecutorNum = 24; conf.put(ResaConfig.ALLOWED_EXECUTOR_NUM, allewedExecutorNum); String host = "192.168.0.30"; int port = 6379; String queue = "ta1wc"; int maxLen = 5000; NimbusClient nimbusClient = NimbusClient.getConfiguredClient(conf); Nimbus.Client nimbus = nimbusClient.getClient(); //String topoName = "ta1wc2P2Redis"; ///String topoName = "ta1wcLoopRedis"; ///String topoName = "arwcRedis"; ///String topoName = "outdetResa"; ///String topoName = "rwc"; String topoName = "fpt"; String topoId = TopologyHelper.getTopologyId(nimbus, topoName); TopologyInfo topoInfo = nimbus.getTopologyInfo(topoId); Map<String, Integer> currAllocation = topoInfo.get_executors().stream().filter(e -> !Utils.isSystemId(e.get_component_id())) .collect(Collectors.groupingBy(e -> e.get_component_id(), Collectors.reducing(0, e -> 1, (i1, i2) -> i1 + i2))); SimpleGeneralAllocCalculator smdm = new SimpleGeneralAllocCalculator(); smdm.init(conf, currAllocation, nimbus.getUserTopology(topoId)); for (int i = 0; i < 10000; i++) { Utils.sleep(30000); topoInfo = nimbus.getTopologyInfo(topoId); Map<String, Integer> updatedAllocation = topoInfo.get_executors().stream().filter(e -> !Utils.isSystemId(e.get_component_id())) .collect(Collectors.groupingBy(e -> e.get_component_id(), Collectors.reducing(0, e -> 1, (i1, i2) -> i1 + i2))); Map<String, List<ExecutorDetails>> comp2Executors = TopologyHelper.getTopologyExecutors(topoName, conf) .entrySet().stream().filter(e -> !Utils.isSystemId(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); AggResultCalculator resultCalculator = new AggResultCalculator( RedisDataSource.readData(host, port, queue, maxLen), comp2Executors, nimbus.getUserTopology(topoId)); resultCalculator.calCMVStat(); System.out.println("-------------Report on: " + System.currentTimeMillis() + "------------------------------"); if (currAllocation.equals(updatedAllocation)) { System.out.println(currAllocation + "-->" + smdm.calc(resultCalculator.getResults(), allewedExecutorNum)); } else { currAllocation = updatedAllocation; smdm.allocationChanged(currAllocation); RedisDataSource.clearQueue(host, port, queue); System.out.println("Allocation updated to " + currAllocation); } } } @Test public void runAllocCalculatorAlg() throws Exception { conf.put(Config.NIMBUS_HOST, "192.168.0.30"); conf.put(Config.NIMBUS_THRIFT_PORT, 6627); conf.put("resa.opt.smd.qos.ms", 1500.0); conf.put("resa.opt.win.history.size", 1); conf.put("resa.opt.win.history.size.ignore", 0); conf.put("resa.comp.sample.rate", 1.0); int allewedExecutorNum = 24; conf.put(ResaConfig.ALLOWED_EXECUTOR_NUM, allewedExecutorNum); String host = "192.168.0.30"; int port = 6379; String queue = "fpm-7-1417774110-metrics"; int maxLen = 5000; NimbusClient nimbusClient = NimbusClient.getConfiguredClient(conf); Nimbus.Client nimbus = nimbusClient.getClient(); //String topoName = "ta1wc2P2Redis"; ///String topoName = "ta1wcLoopRedis"; ///String topoName = "arwcRedis"; ///String topoName = "outdetResa"; ///String topoName = "rwc"; String topoName = "fpm"; String topoId = TopologyHelper.getTopologyId(nimbus, topoName); TopologyInfo topoInfo = nimbus.getTopologyInfo(topoId); Map<String, Integer> currAllocation = topoInfo.get_executors().stream().filter(e -> !Utils.isSystemId(e.get_component_id())) .collect(Collectors.groupingBy(e -> e.get_component_id(), Collectors.reducing(0, e -> 1, (i1, i2) -> i1 + i2))); SimpleGeneralAllocCalculator smdm = new SimpleGeneralAllocCalculator(); smdm.init(conf, currAllocation, nimbus.getUserTopology(topoId)); Map<String, List<ExecutorDetails>> comp2Executors = TopologyHelper.getTopologyExecutors(topoName, conf) .entrySet().stream().filter(e -> !Utils.isSystemId(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); AggResultCalculator resultCalculator = new AggResultCalculator( RedisDataSource.iterData(host, port, queue, maxLen), comp2Executors, nimbus.getUserTopology(topoId)); resultCalculator.calCMVStat(); System.out.println("-------------Report on: " + System.currentTimeMillis() + "------------------------------"); System.out.println(currAllocation + "-->" + smdm.calc(resultCalculator.getResults(), allewedExecutorNum).currOptAllocation); } }