You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ch...@apache.org on 2015/11/24 22:41:10 UTC

flink git commit: [FLINK-2318] Union can be used as BroadcastVariable

Repository: flink
Updated Branches:
  refs/heads/master 49f5a0179 -> 25ef3240c


[FLINK-2318] Union can be used as BroadcastVariable

This closes #1390


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/25ef3240
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/25ef3240
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/25ef3240

Branch: refs/heads/master
Commit: 25ef3240c504f8e2989af0dcac4e16f471510f39
Parents: 49f5a01
Author: zentol <ch...@apache.org>
Authored: Thu Nov 19 13:20:18 2015 +0100
Committer: zentol <ch...@apache.org>
Committed: Tue Nov 24 22:24:14 2015 +0100

----------------------------------------------------------------------
 .../plantranslate/JobGraphGenerator.java        |  7 +-
 .../runtime/operators/util/TaskConfig.java      |  4 +-
 .../broadcastvars/BroadcastUnionITCase.java     | 74 ++++++++++++++++++++
 3 files changed, 82 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/25ef3240/flink-optimizer/src/main/java/org/apache/flink/optimizer/plantranslate/JobGraphGenerator.java
----------------------------------------------------------------------
diff --git a/flink-optimizer/src/main/java/org/apache/flink/optimizer/plantranslate/JobGraphGenerator.java b/flink-optimizer/src/main/java/org/apache/flink/optimizer/plantranslate/JobGraphGenerator.java
index c9140a5..1546631 100644
--- a/flink-optimizer/src/main/java/org/apache/flink/optimizer/plantranslate/JobGraphGenerator.java
+++ b/flink-optimizer/src/main/java/org/apache/flink/optimizer/plantranslate/JobGraphGenerator.java
@@ -620,10 +620,13 @@ public class JobGraphGenerator implements Visitor<PlanNode> {
 			// the inputs of the union as well, because the optimizer has a separate union
 			// node, which does not exist in the JobGraph. Otherwise, this can result in
 			// deadlocks when closing a branching flow at runtime.
-			if (input.getDataExchangeMode().equals(DataExchangeMode.BATCH)) {
-				for (Channel in : inputPlanNode.getInputs()) {
+			for (Channel in : inputPlanNode.getInputs()) {
+				if (input.getDataExchangeMode().equals(DataExchangeMode.BATCH)) {
 					in.setDataExchangeMode(DataExchangeMode.BATCH);
 				}
+				if (isBroadcast) {
+					in.setShipStrategy(ShipStrategyType.BROADCAST, in.getDataExchangeMode());
+				}
 			}
 		}
 		else if (inputPlanNode instanceof BulkPartialSolutionPlanNode) {

http://git-wip-us.apache.org/repos/asf/flink/blob/25ef3240/flink-runtime/src/main/java/org/apache/flink/runtime/operators/util/TaskConfig.java
----------------------------------------------------------------------
diff --git a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/util/TaskConfig.java b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/util/TaskConfig.java
index 0254c8c..c32c43b 100644
--- a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/util/TaskConfig.java
+++ b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/util/TaskConfig.java
@@ -462,8 +462,10 @@ public class TaskConfig implements Serializable {
 	
 	public void addBroadcastInputToGroup(int groupIndex) {
 		final String grp = BROADCAST_INPUT_GROUP_SIZE_PREFIX + groupIndex;
+		if (!this.config.containsKey(grp)) {
+			this.config.setInteger(NUM_BROADCAST_INPUTS, this.config.getInteger(NUM_BROADCAST_INPUTS, 0) + 1);
+		}
 		this.config.setInteger(grp, this.config.getInteger(grp, 0) + 1);
-		this.config.setInteger(NUM_BROADCAST_INPUTS, this.config.getInteger(NUM_BROADCAST_INPUTS, 0) + 1);
 	}
 	
 	public void setInputAsynchronouslyMaterialized(int inputNum, boolean temp) {

http://git-wip-us.apache.org/repos/asf/flink/blob/25ef3240/flink-tests/src/test/java/org/apache/flink/test/broadcastvars/BroadcastUnionITCase.java
----------------------------------------------------------------------
diff --git a/flink-tests/src/test/java/org/apache/flink/test/broadcastvars/BroadcastUnionITCase.java b/flink-tests/src/test/java/org/apache/flink/test/broadcastvars/BroadcastUnionITCase.java
new file mode 100644
index 0000000..080a3de
--- /dev/null
+++ b/flink-tests/src/test/java/org/apache/flink/test/broadcastvars/BroadcastUnionITCase.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.flink.test.broadcastvars;
+
+import java.util.List;
+import org.apache.flink.api.common.functions.ReduceFunction;
+import org.apache.flink.api.common.functions.RichMapFunction;
+import org.apache.flink.api.java.DataSet;
+import org.apache.flink.api.java.ExecutionEnvironment;
+import org.apache.flink.configuration.Configuration;
+import org.apache.flink.test.util.JavaProgramTestBase;
+import org.junit.Assert;
+
+public class BroadcastUnionITCase extends JavaProgramTestBase {
+	private static final String BC_NAME = "bc";
+
+	@Override
+	protected void testProgram() throws Exception {
+		ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
+		env.setParallelism(4);
+
+		DataSet<Long> input = env.generateSequence(1, 10);
+		DataSet<Long> bc1 = env.generateSequence(1, 5);
+		DataSet<Long> bc2 = env.generateSequence(6, 10);
+
+		List<Long> result = input
+				.map(new Mapper())
+				.withBroadcastSet(bc1.union(bc2), BC_NAME)
+				.reduce(new Reducer())
+				.collect();
+		
+		Assert.assertEquals(result.get(0), Long.valueOf(3025));
+	}
+
+	public static class Mapper extends RichMapFunction<Long, Long> {
+		private List<Long> values;
+
+		@Override
+		public void open(Configuration config) {
+			values = getRuntimeContext().getBroadcastVariable(BC_NAME);
+		}
+
+		@Override
+		public Long map(Long value) throws Exception {
+			long sum = 0;
+			for (Long v : values) {
+				sum += value * v;
+			}
+			return sum;
+		}
+	}
+
+	public static class Reducer implements ReduceFunction<Long> {
+		@Override
+		public Long reduce(Long value1, Long value2) throws Exception {
+			return value1 + value2;
+		}
+	}
+}