Java Flink数据集连接内部映射函数
因此,我在一个数据流上运行一个map函数,在map函数中,我想连接两个独立的数据集。只是想知道这在弗林克是否可行。我知道map函数本身作为一个单独的任务运行,用于单独的分区,因此想知道map函数内部是否允许分布式连接?好的,所以结果是不能,因为连接数据集发生在与流处理(发生在StreamExecutionContext)不同的上下文(ExecutionContext)上而且Flink不允许在彼此内部具有不同执行上下文的操作Java Flink数据集连接内部映射函数,java,hadoop,distributed-computing,apache-flink,flink-streaming,Java,Hadoop,Distributed Computing,Apache Flink,Flink Streaming,因此,我在一个数据流上运行一个map函数,在map函数中,我想连接两个独立的数据集。只是想知道这在弗林克是否可行。我知道map函数本身作为一个单独的任务运行,用于单独的分区,因此想知道map函数内部是否允许分布式连接?好的,所以结果是不能,因为连接数据集发生在与流处理(发生在StreamExecutionContext)不同的上下文(ExecutionContext)上而且Flink不允许在彼此内部具有不同执行上下文的操作 java.lang.IllegalArgumentException:
java.lang.IllegalArgumentException: The two inputs have different execution contexts.
at org.apache.flink.api.java.DataSet.checkSameExecutionContext(DataSet.java:1799)
at org.apache.flink.api.java.operators.TwoInputOperator.<init>(TwoInputOperator.java:42)
at org.apache.flink.api.java.operators.TwoInputUdfOperator.<init>(TwoInputUdfOperator.java:80)
at org.apache.flink.api.java.operators.CrossOperator.<init>(CrossOperator.java:90)
at org.apache.flink.api.java.operators.CrossOperator$DefaultCross.<init>(CrossOperator.java:150)
at org.apache.flink.api.java.DataSet.crossWithTiny(DataSet.java:1088)
at org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:138)
at org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:125)
at org.apache.flink.streaming.api.operators.KeyedProcessOperator.processElement(KeyedProcessOperator.java:94)
at org.apache.flink.streaming.runtime.io.StreamInputProcessor.processInput(StreamInputProcessor.java:207)
at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask.run(OneInputStreamTask.java:69)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:264)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
java.lang.IllegalArgumentException:这两个输入具有不同的执行上下文。
位于org.apache.flink.api.java.DataSet.CheckSameeExecutionContext(DataSet.java:1799)
位于org.apache.flink.api.java.operators.TwoInputOperator.(TwoInputOperator.java:42)
位于org.apache.flink.api.java.operators.TwoInputUdfoOperator.(TwoInputUdfoOperator.java:80)
位于org.apache.flink.api.java.operators.CrossOperator。(CrossOperator.java:90)
位于org.apache.flink.api.java.operators.CrossOperator$DefaultCross。(CrossOperator.java:150)
位于org.apache.flink.api.java.DataSet.crossWithTiny(DataSet.java:1088)
位于org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:138)
位于org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:125)
位于org.apache.flink.streaming.api.operators.KeyedProcessOperator.processElement(KeyedProcessOperator.java:94)
位于org.apache.flink.streaming.runtime.io.StreamInputProcessor.processInput(StreamInputProcessor.java:207)
位于org.apache.flink.streaming.runtime.tasks.OneInputStreamTask.run(OneInputStreamTask.java:69)
位于org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:264)
位于org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
好的,事实证明您不能,因为连接数据集发生在与流处理(发生在StreamExecutionContext上)不同的上下文(ExecutionContext)上,并且Flink不允许在彼此内部具有不同执行上下文的操作
java.lang.IllegalArgumentException: The two inputs have different execution contexts.
at org.apache.flink.api.java.DataSet.checkSameExecutionContext(DataSet.java:1799)
at org.apache.flink.api.java.operators.TwoInputOperator.<init>(TwoInputOperator.java:42)
at org.apache.flink.api.java.operators.TwoInputUdfOperator.<init>(TwoInputUdfOperator.java:80)
at org.apache.flink.api.java.operators.CrossOperator.<init>(CrossOperator.java:90)
at org.apache.flink.api.java.operators.CrossOperator$DefaultCross.<init>(CrossOperator.java:150)
at org.apache.flink.api.java.DataSet.crossWithTiny(DataSet.java:1088)
at org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:138)
at org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:125)
at org.apache.flink.streaming.api.operators.KeyedProcessOperator.processElement(KeyedProcessOperator.java:94)
at org.apache.flink.streaming.runtime.io.StreamInputProcessor.processInput(StreamInputProcessor.java:207)
at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask.run(OneInputStreamTask.java:69)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:264)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
java.lang.IllegalArgumentException:这两个输入具有不同的执行上下文。
位于org.apache.flink.api.java.DataSet.CheckSameeExecutionContext(DataSet.java:1799)
位于org.apache.flink.api.java.operators.TwoInputOperator.(TwoInputOperator.java:42)
位于org.apache.flink.api.java.operators.TwoInputUdfoOperator.(TwoInputUdfoOperator.java:80)
位于org.apache.flink.api.java.operators.CrossOperator。(CrossOperator.java:90)
位于org.apache.flink.api.java.operators.CrossOperator$DefaultCross。(CrossOperator.java:150)
位于org.apache.flink.api.java.DataSet.crossWithTiny(DataSet.java:1088)
位于org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:138)
位于org.myorg.quickstart.MessageStreamProcessor$MessageProcessor.processElement(MessageStreamProcessor.java:125)
位于org.apache.flink.streaming.api.operators.KeyedProcessOperator.processElement(KeyedProcessOperator.java:94)
位于org.apache.flink.streaming.runtime.io.StreamInputProcessor.processInput(StreamInputProcessor.java:207)
位于org.apache.flink.streaming.runtime.tasks.OneInputStreamTask.run(OneInputStreamTask.java:69)
位于org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:264)
位于org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
如果要将dataSet1与dataSet2连接起来,并且dataSet2并不大。您可以使用withBroadcastSet操作符在dataSet1的映射中广播dataSet2。您可以使用getRuntimeContext().getBroadcastVariable在映射函数中获取广播的数据集2。然后您可以在map函数中自己进行连接。为了加快连接速度,可以在广播dataSet2之前将dataSet2中的数据传输到地图中。例如:
Map<Integer, String> testMap = new HashMap<>();
dateSet2 = flinkEnv.fromElements(testMap);
dateSet1.map(new TestRichMapper()).withBroadcastSet(dateSet2, "dateSet2");
Map testMap=newhashmap();
dateSet2=flinkEnv.fromElements(testMap);
dateSet1.map(新的TestRichMapper())。带有广播集(dateSet2,“dateSet2”);
在RichMap函数中,您可以获取dateSet2并将其传输到地图中,如下所示:
Map<Integer, String> testMap = getRuntimeContext().getBroadcastVariable("dateSet2").toArray()[0];
Map testMap=getRuntimeContext().getBroadcastVariable(“dateSet2”).toArray()[0];
如果要将dataSet1与dataSet2连接起来,并且dataSet2并不大。您可以使用withBroadcastSet操作符在dataSet1的映射中广播dataSet2。您可以使用getRuntimeContext().getBroadcastVariable在映射函数中获取广播的数据集2。然后您可以在map函数中自己进行连接。为了加快连接速度,可以在广播dataSet2之前将dataSet2中的数据传输到地图中。例如:
Map<Integer, String> testMap = new HashMap<>();
dateSet2 = flinkEnv.fromElements(testMap);
dateSet1.map(new TestRichMapper()).withBroadcastSet(dateSet2, "dateSet2");
Map testMap=newhashmap();
dateSet2=flinkEnv.fromElements(testMap);
dateSet1.map(新的TestRichMapper())。带有广播集(dateSet2,“dateSet2”);
在RichMap函数中,您可以获取dateSet2并将其传输到地图中,如下所示:
Map<Integer, String> testMap = getRuntimeContext().getBroadcastVariable("dateSet2").toArray()[0];
Map testMap=getRuntimeContext().getBroadcastVariable(“dateSet2”).toArray()[0];
是否可以在数据流
上使用和广播集
?以一种动态的方式做到这一点。我的意思是,如果我连接两个不同数据源的元组,并且数据源在窗口中的元组数量不同。我想动态使用withBroadcastSet
。是否可以在数据流上使用withBroadcastSet
?以一种动态的方式做到这一点。我的意思是,如果我连接两个不同数据源的元组,并且数据源在窗口中的元组数量不同。我想动态地将与broadcastset一起使用。