@Override public String toString() { return String.format("StreamRouterSpec[streamId=%s,partition=%s, queue=[%s]]", this.getStreamId(), this.getPartition(), this.getTargetQueue()); }
private List<StreamRoutePartitioner> calculatePartitioner(StreamRouterSpec streamRouterSpec, Map<String, StreamDefinition> sds, Map<StreamPartition, List<StreamRoutePartitioner>> routePartitionerMap) throws Exception { List<StreamRoutePartitioner> routePartitioners = routePartitionerMap.get(streamRouterSpec.getPartition()); if (routePartitioners == null) { routePartitioners = new ArrayList<>(); } for (PolicyWorkerQueue pwq : streamRouterSpec.getTargetQueue()) { routePartitioners.add(StreamRoutePartitionFactory.createRoutePartitioner( Lists.transform(pwq.getWorkers(), WorkSlot::getBoltId), sds.get(streamRouterSpec.getPartition().getStreamId()), streamRouterSpec.getPartition())); } return routePartitioners; }
@Test public void testStreamRouterSpec() { StreamRouterSpec streamRouterSpec = new StreamRouterSpec(); Assert.assertEquals(null, streamRouterSpec.getPartition()); Assert.assertEquals(null, streamRouterSpec.getStreamId()); Assert.assertTrue(streamRouterSpec.getTargetQueue().isEmpty()); workers.add(workSlot2); PolicyWorkerQueue policyWorkerQueue = new PolicyWorkerQueue(workers); streamRouterSpec.addQueue(policyWorkerQueue); streamRouterSpec.setStreamId("streamRouterSpec"); Assert.assertEquals("streamRouterSpec", streamRouterSpec.getStreamId()); Assert.assertEquals(1, streamRouterSpec.getTargetQueue().size()); Assert.assertEquals(2, streamRouterSpec.getTargetQueue().get(0).getWorkers().size()); StreamRouterSpec streamRouterSpec1 = new StreamRouterSpec(); streamRouterSpec1.addQueue(policyWorkerQueue); streamRouterSpec1.setStreamId("streamRouterSpec1"); Assert.assertFalse(streamRouterSpec.equals(streamRouterSpec1)); streamRouterSpec1.setStreamId("streamRouterSpec"); Assert.assertTrue(streamRouterSpec.equals(streamRouterSpec1)); Assert.assertTrue(streamRouterSpec.hashCode() == streamRouterSpec1.hashCode());
public static StreamRouterSpec createSampleStreamRouteSpec(String streamId, String groupByField, List<String> targetEvaluatorIds) { List<WorkSlot> slots = Arrays.asList(targetEvaluatorIds.stream().map((t) -> { return new WorkSlot("sampleTopology", t); }).toArray(WorkSlot[]::new)); StreamRouterSpec streamRouteSpec = new StreamRouterSpec(); streamRouteSpec.setStreamId(streamId); streamRouteSpec.setPartition(createSampleStreamGroupbyPartition(streamId, Arrays.asList(groupByField))); streamRouteSpec.setTargetQueue(Arrays.asList(new PolicyWorkerQueue(slots))); return streamRouteSpec; }
private Map<String, RouterSpec> generateGroupbyMonitorMetadata() { Map<String, RouterSpec> groupSpecsMap = new HashMap<String, RouterSpec>(); for (TopologyUsage u : context.getTopologyUsages().values()) { RouterSpec spec = groupSpecsMap.get(u.getTopoName()); if (spec == null) { spec = new RouterSpec(u.getTopoName()); groupSpecsMap.put(u.getTopoName(), spec); } for (MonitoredStream ms : u.getMonitoredStream()) { // mutiple stream on the same policy group : for correlation group case: for (StreamPartition partiton : ms.getStreamGroup().getStreamPartitions()) { StreamRouterSpec routeSpec = new StreamRouterSpec(); routeSpec.setPartition(partiton); routeSpec.setStreamId(partiton.getStreamId()); for (StreamWorkSlotQueue sq : ms.getQueues()) { if (sq.getTopoGroupStartIndex().containsKey(u.getTopoName())) { PolicyWorkerQueue queue = new PolicyWorkerQueue(); queue.setWorkers(sq.getWorkingSlots()); queue.setPartition(partiton); routeSpec.addQueue(queue); } } spec.addRouterSpec(routeSpec); } } } return groupSpecsMap; }
private void inplaceRemove(Map<StreamPartition, List<StreamRouterSpec>> routeSpecMap, Map<StreamPartition, List<StreamRoutePartitioner>> routePartitionerMap, StreamRouterSpec toBeRemoved) { routeSpecMap.remove(toBeRemoved.getPartition()); routePartitionerMap.remove(toBeRemoved.getPartition()); }
Assert.assertEquals(1, spec.getRouterSpecs().size()); StreamRouterSpec routeSpec = spec.getRouterSpecs().get(0); Assert.assertEquals(STREAM2, routeSpec.getStreamId()); Assert.assertEquals(Arrays.asList("col1"), routeSpec.getPartition().getColumns());
if (spec.getStreamId().equals(STREAM1)) { Assert.assertTrue(spec.getTargetQueue().size() == 1);
/** * in correlation cases, multiple streams will go to the same queue for correlation policy. * * @param spec */ private void sanityCheck(RouterSpec spec) { Set<String> totalRequestedSlots = new HashSet<>(); for (StreamRouterSpec s : spec.getRouterSpecs()) { for (PolicyWorkerQueue q : s.getTargetQueue()) { List<String> workers = new ArrayList<>(); q.getWorkers().forEach(w -> workers.add(w.getBoltId())); totalRequestedSlots.addAll(workers); } } if (totalRequestedSlots.size() > getOutputStreamIds().size()) { String error = String.format("Requested slots are not consistent with provided slots, %s, %s", totalRequestedSlots, getOutputStreamIds()); LOG.error(error); throw new IllegalStateException(error); } }
@Test public void testRouterBoltSpec() { List<String> topics = Arrays.asList("testTopic3", "testTopic4", "testTopic5"); RouterSpec boltSpec = new RouterSpec(); for (String topic : topics) { String streamId = getStreamNameByTopic(topic); // StreamPartition, groupby col1 for stream cpuUsageStream StreamPartition sp = new StreamPartition(); sp.setStreamId(streamId); sp.setColumns(Arrays.asList("value")); sp.setType(StreamPartition.Type.GROUPBY); StreamSortSpec sortSpec = new StreamSortSpec(); sortSpec.setWindowMargin(1000); sortSpec.setWindowPeriod2(Period.seconds(10)); sp.setSortSpec(sortSpec); // set StreamRouterSpec to have 2 WorkSlot StreamRouterSpec routerSpec = new StreamRouterSpec(); routerSpec.setPartition(sp); routerSpec.setStreamId(streamId); PolicyWorkerQueue queue = new PolicyWorkerQueue(); queue.setPartition(sp); queue.setWorkers(Arrays.asList(new WorkSlot("testTopology", "alertBolt0"), new WorkSlot("testTopology", "alertBolt1"))); routerSpec.setTargetQueue(Arrays.asList(queue)); boltSpec.addRouterSpec(routerSpec); } String json = MetadataSerDeser.serialize(boltSpec); System.out.println(json); RouterSpec deserializedSpec = MetadataSerDeser.deserialize(json, RouterSpec.class); Assert.assertEquals(3, deserializedSpec.getRouterSpecs().size()); }
public Map<StreamPartition, List<StreamRouterSpec>> makeSRS() { Map<StreamPartition, List<StreamRouterSpec>> newSRS = new HashMap<>(); this.getRouterSpecs().forEach(t -> { if (!newSRS.containsKey(t.getPartition())) { newSRS.put(t.getPartition(), new ArrayList<>()); } newSRS.get(t.getPartition()).add(t); }); return newSRS; }
@Test public void testIrregularPolicyParallelismHint() { Config config = ConfigFactory.load(); int defaultParallelism = config.getInt("coordinator.policyDefaultParallelism"); TestTopologyMgmtService mgmtService = new TestTopologyMgmtService(5, 12); InMemScheduleConext context = createScheduleContext(mgmtService); // recreate test poicy context.getPolicies().clear(); // make the hint bigger than bolt number int irregularParallelism = defaultParallelism + 2; createSamplePolicy(context, "irregularPolicy", STREAM1, irregularParallelism); GreedyPolicyScheduler ps = new GreedyPolicyScheduler(); ps.init(context, mgmtService); ScheduleState scheduled = ps.schedule(new ScheduleOption()); Assert.assertEquals(2, scheduled.getSpoutSpecs().size()); Assert.assertEquals(2, scheduled.getGroupSpecs().size()); Assert.assertEquals(2, scheduled.getAlertSpecs().size()); // assertion RouterSpec spec = scheduled.getGroupSpecs().get(TOPO1); Assert.assertTrue(spec.getRouterSpecs().size() > 0); // must be allocated for (StreamRouterSpec routerSpec : spec.getRouterSpecs()) { Assert.assertEquals(1, routerSpec.getTargetQueue().size()); // irregularParallelism is prompted to 2 * defaultParallelism = 10 Assert.assertEquals(10, routerSpec.getTargetQueue().get(0).getWorkers().size()); } }
Assert.assertEquals(1, routeSpecs.size()); for (StreamRouterSpec spec : routeSpecs) { StreamPartition par = spec.getPartition(); Assert.assertEquals(STREAM1, par.getStreamId()); Assert.assertEquals(Arrays.asList("col1"), par.getColumns()); Assert.assertEquals(STREAM1, spec.getStreamId()); Assert.assertEquals(1, spec.getTargetQueue().size()); List<PolicyWorkerQueue> queues = spec.getTargetQueue(); Assert.assertEquals(1, queues.size()); Assert.assertEquals(5, queues.get(0).getWorkers().size());
StreamRouterSpec spec1 = new StreamRouterSpec(); spec1.setStreamId(streamId); spec1.setPartition(partition); spec1.setTargetQueue(new ArrayList<PolicyWorkerQueue>() {{ add(queue1); }}); StreamRouterSpec spec2 = new StreamRouterSpec(); spec2.setStreamId(streamId); spec2.setPartition(partition); spec2.setTargetQueue(new ArrayList<PolicyWorkerQueue>() {{ add(queue2); }});
private void inplaceAdd(Map<StreamPartition, List<StreamRouterSpec>> routeSpecMap, Map<StreamPartition, List<StreamRoutePartitioner>> routePartitionerMap, StreamRouterSpec toBeAdded, Map<String, StreamDefinition> sds) { if (!routeSpecMap.containsKey(toBeAdded.getPartition())) { routeSpecMap.put(toBeAdded.getPartition(), new ArrayList<StreamRouterSpec>()); } routeSpecMap.get(toBeAdded.getPartition()).add(toBeAdded); try { List<StreamRoutePartitioner> routePartitioners = calculatePartitioner(toBeAdded, sds, routePartitionerMap); routePartitionerMap.put(toBeAdded.getPartition(), routePartitioners); } catch (Exception e) { LOG.error("ignore this failure StreamRouterSpec " + toBeAdded + ", with error" + e.getMessage(), e); routeSpecMap.remove(toBeAdded.getPartition()); routePartitionerMap.remove(toBeAdded.getPartition()); } }
Assert.assertEquals(1, routeSpecs.size()); for (StreamRouterSpec spec : routeSpecs) { StreamPartition par = spec.getPartition(); Assert.assertEquals(STREAM1, par.getStreamId()); Assert.assertEquals(Arrays.asList("col1"), par.getColumns()); Assert.assertEquals(STREAM1, spec.getStreamId()); Assert.assertEquals(1, spec.getTargetQueue().size()); List<PolicyWorkerQueue> queues = spec.getTargetQueue(); Assert.assertEquals(1, queues.size()); Assert.assertEquals(5, queues.get(0).getWorkers().size());
StreamRouterSpec routerSpec = new StreamRouterSpec(); routerSpec.setPartition(sp); routerSpec.setStreamId(streamId); PolicyWorkerQueue queue = new PolicyWorkerQueue(); queue.setPartition(sp); queue.setWorkers(Arrays.asList(new WorkSlot("testTopology", "alertBolt1"), new WorkSlot("testTopology", "alertBolt2"))); routerSpec.setTargetQueue(Collections.singletonList(queue)); boltSpec.addRouterSpec(routerSpec); boltSpec.setVersion("version1");
public Map<StreamPartition, StreamSortSpec> makeSSS() { Map<StreamPartition, StreamSortSpec> newSSS = new HashMap<>(); this.getRouterSpecs().forEach(t -> { if (t.getPartition().getSortSpec() != null) { newSSS.put(t.getPartition(), t.getPartition().getSortSpec()); } }); return newSSS; }
if (copyRouteSpecMap.containsKey(spec.getPartition()) && copyRouteSpecMap.get(spec.getPartition()).contains(spec)) { LOG.error("Metadata calculation error: add existing StreamRouterSpec " + spec); } else { if (!copyRouteSpecMap.containsKey(spec.getPartition()) || !copyRouteSpecMap.get(spec.getPartition()).contains(spec)) { LOG.error("Metadata calculation error: remove non-existing StreamRouterSpec " + spec); } else { if (!copyRouteSpecMap.containsKey(spec.getPartition()) || copyRouteSpecMap.get(spec.getPartition()).contains(spec)) { LOG.error("Metadata calculation error: modify nonexisting StreamRouterSpec " + spec); } else {