Java 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:

因此,我在一个数据流上运行一个map函数,在map函数中,我想连接两个独立的数据集。只是想知道这在弗林克是否可行。我知道map函数本身作为一个单独的任务运行,用于单独的分区,因此想知道map函数内部是否允许分布式连接?

好的,所以结果是不能,因为连接数据集发生在与流处理(发生在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)

好的,事实证明您不能,因为连接数据集发生在与流处理(发生在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一起使用。