@Test public void testChannelSelectors() { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<Long> src = env.generateSequence(0, 0); DataStream<Long> broadcast = src.broadcast(); DataStreamSink<Long> broadcastSink = broadcast.print(); StreamPartitioner<?> broadcastPartitioner = env.getStreamGraph() .getStreamEdges(src.getId(), broadcastSink.getTransformation().getId()) .get(0) .getPartitioner(); assertTrue(broadcastPartitioner instanceof BroadcastPartitioner); DataStream<Long> shuffle = src.shuffle(); DataStreamSink<Long> shuffleSink = shuffle.print(); StreamPartitioner<?> shufflePartitioner = env.getStreamGraph() .getStreamEdges(src.getId(), shuffleSink.getTransformation().getId()) .get(0) .getPartitioner(); assertTrue(shufflePartitioner instanceof ShufflePartitioner); DataStream<Long> forward = src.forward(); DataStreamSink<Long> forwardSink = forward.print(); StreamPartitioner<?> forwardPartitioner = env.getStreamGraph() .getStreamEdges(src.getId(), forwardSink.getTransformation().getId()) .get(0) .getPartitioner(); assertTrue(forwardPartitioner instanceof ForwardPartitioner); DataStream<Long> rebalance = src.rebalance(); DataStreamSink<Long> rebalanceSink = rebalance.print(); StreamPartitioner<?> rebalancePartitioner = env.getStreamGraph() .getStreamEdges(src.getId(), rebalanceSink.getTransformation().getId()) .get(0) .getPartitioner(); assertTrue(rebalancePartitioner instanceof RebalancePartitioner); DataStream<Long> global = src.global(); DataStreamSink<Long> globalSink = global.print(); StreamPartitioner<?> globalPartitioner = env.getStreamGraph() .getStreamEdges(src.getId(), globalSink.getTransformation().getId()) .get(0) .getPartitioner(); assertTrue(globalPartitioner instanceof GlobalPartitioner); }
@Test public void testTypeInfo() { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Long> src1 = env.generateSequence(0, 0); assertEquals(TypeExtractor.getForClass(Long.class), src1.getType()); DataStream<Tuple2<Integer, String>> map = src1.map( new MapFunction<Long, Tuple2<Integer, String>>() { @Override public Tuple2<Integer, String> map(Long value) throws Exception { return null; } }); assertEquals(TypeExtractor.getForObject(new Tuple2<>(0, "")), map.getType()); DataStream<String> window = map.windowAll(GlobalWindows.create()) .trigger(PurgingTrigger.of(CountTrigger.of(5))) .apply( new AllWindowFunction<Tuple2<Integer, String>, String, GlobalWindow>() { @Override public void apply( GlobalWindow window, Iterable<Tuple2<Integer, String>> values, Collector<String> out) throws Exception {} }); assertEquals(TypeExtractor.getForClass(String.class), window.getType()); DataStream<CustomPOJO> flatten = window .windowAll(GlobalWindows.create()) .trigger(PurgingTrigger.of(CountTrigger.of(5))) .fold( new CustomPOJO(), new FoldFunction<String, CustomPOJO>() { private static final long serialVersionUID = 1L; @Override public CustomPOJO fold(CustomPOJO accumulator, String value) throws Exception { return null; } }); assertEquals(TypeExtractor.getForClass(CustomPOJO.class), flatten.getType()); }
@Test public void testTypeInfo() { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Long> src1 = env.generateSequence(0, 0); assertEquals(TypeExtractor.getForClass(Long.class), src1.getType()); DataStream<Tuple2<Integer, String>> map = src1.map( new MapFunction<Long, Tuple2<Integer, String>>() { @Override public Tuple2<Integer, String> map(Long value) throws Exception { return null; } }); assertEquals(TypeExtractor.getForObject(new Tuple2<Integer, String>(0, "")), map.getType()); WindowedDataStream<String> window = map.window(Count.of(5)) .mapWindow( new WindowMapFunction<Tuple2<Integer, String>, String>() { @Override public void mapWindow( Iterable<Tuple2<Integer, String>> values, Collector<String> out) throws Exception {} }); assertEquals(TypeExtractor.getForClass(String.class), window.getType()); DataStream<CustomPOJO> flatten = window .foldWindow( new CustomPOJO(), new FoldFunction<String, CustomPOJO>() { @Override public CustomPOJO fold(CustomPOJO accumulator, String value) throws Exception { return null; } }) .flatten(); assertEquals(TypeExtractor.getForClass(CustomPOJO.class), flatten.getType()); }
/** * Tests {@link SingleOutputStreamOperator#name(String)} functionality. * * @throws Exception */ @Test public void testNaming() throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Long> dataStream1 = env.generateSequence(0, 0) .name("testSource1") .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .name("testMap"); DataStream<Long> dataStream2 = env.generateSequence(0, 0) .name("testSource2") .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .name("testMap"); DataStreamSink<Long> connected = dataStream1 .connect(dataStream2) .flatMap( new CoFlatMapFunction<Long, Long, Long>() { private static final long serialVersionUID = 1L; @Override public void flatMap1(Long value, Collector<Long> out) throws Exception {} @Override public void flatMap2(Long value, Collector<Long> out) throws Exception {} }) .name("testCoFlatMap") .windowAll(GlobalWindows.create()) .trigger(PurgingTrigger.of(CountTrigger.of(10))) .fold( 0L, new FoldFunction<Long, Long>() { private static final long serialVersionUID = 1L; @Override public Long fold(Long accumulator, Long value) throws Exception { return null; } }) .name("testWindowFold") .print(); // test functionality through the operator names in the execution plan String plan = env.getExecutionPlan(); assertTrue(plan.contains("testSource1")); assertTrue(plan.contains("testSource2")); assertTrue(plan.contains("testMap")); assertTrue(plan.contains("testMap")); assertTrue(plan.contains("testCoFlatMap")); assertTrue(plan.contains("testWindowFold")); }
@Test public void sinkKeyTest() { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSink<Long> sink = env.generateSequence(1, 100).print(); assertTrue( env.getStreamGraph().getStreamNode(sink.getTransformation().getId()).getStatePartitioner() == null); assertTrue( env.getStreamGraph() .getStreamNode(sink.getTransformation().getId()) .getInEdges() .get(0) .getPartitioner() instanceof ForwardPartitioner); KeySelector<Long, Long> key1 = new KeySelector<Long, Long>() { private static final long serialVersionUID = 1L; @Override public Long getKey(Long value) throws Exception { return (long) 0; } }; DataStreamSink<Long> sink2 = env.generateSequence(1, 100).keyBy(key1).print(); assertTrue( env.getStreamGraph().getStreamNode(sink2.getTransformation().getId()).getStatePartitioner() != null); assertEquals( key1, env.getStreamGraph() .getStreamNode(sink2.getTransformation().getId()) .getStatePartitioner()); assertTrue( env.getStreamGraph() .getStreamNode(sink2.getTransformation().getId()) .getInEdges() .get(0) .getPartitioner() instanceof HashPartitioner); KeySelector<Long, Long> key2 = new KeySelector<Long, Long>() { private static final long serialVersionUID = 1L; @Override public Long getKey(Long value) throws Exception { return (long) 0; } }; DataStreamSink<Long> sink3 = env.generateSequence(1, 100).keyBy(key2).print(); assertTrue( env.getStreamGraph().getStreamNode(sink3.getTransformation().getId()).getStatePartitioner() != null); assertEquals( key2, env.getStreamGraph() .getStreamNode(sink3.getTransformation().getId()) .getStatePartitioner()); assertTrue( env.getStreamGraph() .getStreamNode(sink3.getTransformation().getId()) .getInEdges() .get(0) .getPartitioner() instanceof HashPartitioner); }
@Test public void operatorTest() { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<Long> src = env.generateSequence(0, 0); MapFunction<Long, Integer> mapFunction = new MapFunction<Long, Integer>() { @Override public Integer map(Long value) throws Exception { return null; } }; DataStream<Integer> map = src.map(mapFunction); map.addSink(new NoOpSink<Integer>()); assertEquals(mapFunction, getFunctionForDataStream(map)); FlatMapFunction<Long, Integer> flatMapFunction = new FlatMapFunction<Long, Integer>() { private static final long serialVersionUID = 1L; @Override public void flatMap(Long value, Collector<Integer> out) throws Exception {} }; DataStream<Integer> flatMap = src.flatMap(flatMapFunction); flatMap.addSink(new NoOpSink<Integer>()); assertEquals(flatMapFunction, getFunctionForDataStream(flatMap)); FilterFunction<Integer> filterFunction = new FilterFunction<Integer>() { @Override public boolean filter(Integer value) throws Exception { return false; } }; DataStream<Integer> unionFilter = map.union(flatMap).filter(filterFunction); unionFilter.addSink(new NoOpSink<Integer>()); assertEquals(filterFunction, getFunctionForDataStream(unionFilter)); try { env.getStreamGraph().getStreamEdge(map.getId(), unionFilter.getId()); } catch (RuntimeException e) { fail(e.getMessage()); } try { env.getStreamGraph().getStreamEdge(flatMap.getId(), unionFilter.getId()); } catch (RuntimeException e) { fail(e.getMessage()); } OutputSelector<Integer> outputSelector = new OutputSelector<Integer>() { @Override public Iterable<String> select(Integer value) { return null; } }; SplitStream<Integer> split = unionFilter.split(outputSelector); split.select("dummy").addSink(new NoOpSink<Integer>()); List<OutputSelector<?>> outputSelectors = env.getStreamGraph().getStreamNode(unionFilter.getId()).getOutputSelectors(); assertEquals(1, outputSelectors.size()); assertEquals(outputSelector, outputSelectors.get(0)); DataStream<Integer> select = split.select("a"); DataStreamSink<Integer> sink = select.print(); StreamEdge splitEdge = env.getStreamGraph().getStreamEdge(unionFilter.getId(), sink.getTransformation().getId()); assertEquals("a", splitEdge.getSelectedNames().get(0)); ConnectedStreams<Integer, Integer> connect = map.connect(flatMap); CoMapFunction<Integer, Integer, String> coMapper = new CoMapFunction<Integer, Integer, String>() { private static final long serialVersionUID = 1L; @Override public String map1(Integer value) { return null; } @Override public String map2(Integer value) { return null; } }; DataStream<String> coMap = connect.map(coMapper); coMap.addSink(new NoOpSink<String>()); assertEquals(coMapper, getFunctionForDataStream(coMap)); try { env.getStreamGraph().getStreamEdge(map.getId(), coMap.getId()); } catch (RuntimeException e) { fail(e.getMessage()); } try { env.getStreamGraph().getStreamEdge(flatMap.getId(), coMap.getId()); } catch (RuntimeException e) { fail(e.getMessage()); } }
/** Tests whether parallelism gets set. */ @Test public void testParallelism() { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<Tuple2<Long, Long>> src = env.fromElements(new Tuple2<>(0L, 0L)); env.setParallelism(10); SingleOutputStreamOperator<Long, ?> map = src.map( new MapFunction<Tuple2<Long, Long>, Long>() { @Override public Long map(Tuple2<Long, Long> value) throws Exception { return null; } }) .name("MyMap"); DataStream<Long> windowed = map.windowAll(GlobalWindows.create()) .trigger(PurgingTrigger.of(CountTrigger.of(10))) .fold( 0L, new FoldFunction<Long, Long>() { @Override public Long fold(Long accumulator, Long value) throws Exception { return null; } }); windowed.addSink(new NoOpSink<Long>()); DataStreamSink<Long> sink = map.addSink( new SinkFunction<Long>() { private static final long serialVersionUID = 1L; @Override public void invoke(Long value) throws Exception {} }); assertEquals(1, env.getStreamGraph().getStreamNode(src.getId()).getParallelism()); assertEquals(10, env.getStreamGraph().getStreamNode(map.getId()).getParallelism()); assertEquals(1, env.getStreamGraph().getStreamNode(windowed.getId()).getParallelism()); assertEquals( 10, env.getStreamGraph().getStreamNode(sink.getTransformation().getId()).getParallelism()); env.setParallelism(7); // Some parts, such as windowing rely on the fact that previous operators have a parallelism // set when instantiating the Discretizer. This would break if we dynamically changed // the parallelism of operations when changing the setting on the Execution Environment. assertEquals(1, env.getStreamGraph().getStreamNode(src.getId()).getParallelism()); assertEquals(10, env.getStreamGraph().getStreamNode(map.getId()).getParallelism()); assertEquals(1, env.getStreamGraph().getStreamNode(windowed.getId()).getParallelism()); assertEquals( 10, env.getStreamGraph().getStreamNode(sink.getTransformation().getId()).getParallelism()); try { src.setParallelism(3); fail(); } catch (IllegalArgumentException success) { // do nothing } DataStreamSource<Long> parallelSource = env.generateSequence(0, 0); parallelSource.addSink(new NoOpSink<Long>()); assertEquals(7, env.getStreamGraph().getStreamNode(parallelSource.getId()).getParallelism()); parallelSource.setParallelism(3); assertEquals(3, env.getStreamGraph().getStreamNode(parallelSource.getId()).getParallelism()); map.setParallelism(2); assertEquals(2, env.getStreamGraph().getStreamNode(map.getId()).getParallelism()); sink.setParallelism(4); assertEquals( 4, env.getStreamGraph().getStreamNode(sink.getTransformation().getId()).getParallelism()); }
/** * Tests union functionality. This ensures that self-unions and unions of streams with differing * parallelism work. * * @throws Exception */ @Test public void testUnion() throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(4); DataStream<Long> input1 = env.generateSequence(0, 0) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }); DataStream<Long> selfUnion = input1 .union(input1) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }); DataStream<Long> input6 = env.generateSequence(0, 0) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }); DataStream<Long> selfUnionDifferentPartition = input6 .broadcast() .union(input6) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }); DataStream<Long> input2 = env.generateSequence(0, 0) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .setParallelism(4); DataStream<Long> input3 = env.generateSequence(0, 0) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .setParallelism(2); DataStream<Long> unionDifferingParallelism = input2 .union(input3) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .setParallelism(4); DataStream<Long> input4 = env.generateSequence(0, 0) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .setParallelism(2); DataStream<Long> input5 = env.generateSequence(0, 0) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .setParallelism(4); DataStream<Long> unionDifferingPartitioning = input4 .broadcast() .union(input5) .map( new MapFunction<Long, Long>() { @Override public Long map(Long value) throws Exception { return null; } }) .setParallelism(4); StreamGraph streamGraph = env.getStreamGraph(); // verify self union assertTrue(streamGraph.getStreamNode(selfUnion.getId()).getInEdges().size() == 2); for (StreamEdge edge : streamGraph.getStreamNode(selfUnion.getId()).getInEdges()) { assertTrue(edge.getPartitioner() instanceof ForwardPartitioner); } // verify self union with differnt partitioners assertTrue( streamGraph.getStreamNode(selfUnionDifferentPartition.getId()).getInEdges().size() == 2); boolean hasForward = false; boolean hasBroadcast = false; for (StreamEdge edge : streamGraph.getStreamNode(selfUnionDifferentPartition.getId()).getInEdges()) { if (edge.getPartitioner() instanceof ForwardPartitioner) { hasForward = true; } if (edge.getPartitioner() instanceof BroadcastPartitioner) { hasBroadcast = true; } } assertTrue(hasForward && hasBroadcast); // verify union of streams with differing parallelism assertTrue( streamGraph.getStreamNode(unionDifferingParallelism.getId()).getInEdges().size() == 2); for (StreamEdge edge : streamGraph.getStreamNode(unionDifferingParallelism.getId()).getInEdges()) { if (edge.getSourceId() == input2.getId()) { assertTrue(edge.getPartitioner() instanceof ForwardPartitioner); } else if (edge.getSourceId() == input3.getId()) { assertTrue(edge.getPartitioner() instanceof RebalancePartitioner); } else { fail("Wrong input edge."); } } // verify union of streams with differing partitionings assertTrue( streamGraph.getStreamNode(unionDifferingPartitioning.getId()).getInEdges().size() == 2); for (StreamEdge edge : streamGraph.getStreamNode(unionDifferingPartitioning.getId()).getInEdges()) { if (edge.getSourceId() == input4.getId()) { assertTrue(edge.getPartitioner() instanceof BroadcastPartitioner); } else if (edge.getSourceId() == input5.getId()) { assertTrue(edge.getPartitioner() instanceof ForwardPartitioner); } else { fail("Wrong input edge."); } } }