Apache flink ApacheFlink:为什么reduce或groupReduce转换不能并行运行?

Apache flink ApacheFlink:为什么reduce或groupReduce转换不能并行运行?,apache-flink,Apache Flink,例如: DataSet input=env.from元素(1,2,3,4,5,6,7,8,9); 数据集总和=输入.reduce(新的ReduceFunction(){ 公共Tuple1 reduce(Tuple1值1,Tuple1值2){ 返回新的Tuple1(value1.f0+value2.f0); } } 如果上面的reduce转换不是并行操作,我是否需要使用另外两个转换“partitionByHash”和“mapPartition”,如下所示: DataSet input=env.f

例如:

DataSet input=env.from元素(1,2,3,4,5,6,7,8,9);
数据集总和=输入.reduce(新的ReduceFunction(){
公共Tuple1 reduce(Tuple1值1,Tuple1值2){
返回新的Tuple1(value1.f0+value2.f0);
}
}
如果上面的reduce转换不是并行操作,我是否需要使用另外两个转换“partitionByHash”和“mapPartition”,如下所示:

DataSet input=env.from元素(1,2,3,4,5,6,7,8,9);
DataSet sum=input.partitionByHash(0).mapPartition(新的MapPartitionFunction(){
公共空间映射(Iterable值,收集器输出){
long sum=getSum(值);
out.collect(新元组1(总和));
}
}).reduce(新的ReduceFunction(){
公共Tuple1 reduce(Tuple1值1,Tuple1值2){
返回新的Tuple1(value1.f0+value2.f0);
}
}

以及为什么reduce转换的结果仍然是DataSet的实例,而不是
Tuple1

的实例,
reduce
reduceGroup
都是分组操作,并应用于记录组。如果不使用
groupBy
指定分组键,则数据集的所有记录都属于相同的组。因此,只有一个组,
reduce
reduceGroup
的最终结果不能并行计算


如果reduce转换是可组合的(对于任何
ReduceFunction
和所有可组合的
GroupReduceFunction
s都是如此),Flink可以并行应用组合器。

对于您的两个问题,有两个答案:

(1) 为什么reduce()不是并行的 Fabian给出了很好的解释。如果按键应用,则操作是并行的。否则,只有预聚合是并行的

在第二个示例中,通过引入一个键使其并行化。除了使用“mapPartition()”的复杂解决方法外,还可以简单地编写(Java 8样式)

数据集输入=。。。; input.groupBy(0).reduce((a,b)->新的Tuple1(a.f0+b.f0); 但是请注意,您的输入数据非常小,因此无论如何只有一个并行任务。如果使用较大的输入,您可以看到并行预聚合,例如:

ExecutionEnvironment env =     ExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(10);

DataSet<Long> input = env.generateSequence(1, 100000000);
DataSet<Long> sum = input.reduce ( (a, b) -> a + b );
ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
环境(10);;
数据集输入=环境生成序列(100000000);
数据集总和=input.reduce((a,b)->a+b);
(2) 为什么reduce()操作的结果仍然是数据集? 数据集仍然是群集中X的延迟表示形式。您可以继续在并行程序中使用该数据,而无需触发某些计算,也无需将结果数据从分布式工作程序回迁到驱动程序。这样,您就可以编写完全在分布式工作程序上运行且延迟执行的较大程序剪切。从未将数据提取到客户端并重新分发到并行工作程序

特别是在迭代程序中,这是非常强大的,因为整个循环都可以工作,而不需要涉及客户机,也不需要重新部署操作符


通过调用“dataSet.collext().get(0);”,您始终可以获得“X”-这明确了应该执行和获取某些内容。

Flink始终将
dataSet
s(或
DataStream
s)转换为
dataSet
s(或
DataStream
s)。如果对整个数据集应用非并行reduce,则结果将是一个
数据集
,其中包含一个
Tuple1
对象。如果在
groupBy
之后应用reduce,则结果
数据集
将包含每个组的一条记录。
数据集
始终位于cli上从不的群集中如果您想将数据放入客户端进行调试,您可以使用特殊的接收器:flinkA中GroupReduce的
GroupReduceFunction
上下文中的
CombineFunction
是什么意思?如果它实现了
CombineFunction
groupCombineeFunction
接口,那么它就是可组合的。Flink总是转换
数据将
s(或
DataStream
s)设置为
DataSet
s(或
DataStream
s)。如果对整个数据集应用非并行reduce,则结果将是一个
数据集
,其中包含一个
Tuple1
对象。如果在
groupBy
之后应用reduce,则结果
数据集
将包含每个组的一条记录。
数据集
始终位于cli上从不的群集中如果要将数据放入客户端进行调试,可以使用特殊接收器:
ExecutionEnvironment env =     ExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(10);

DataSet<Long> input = env.generateSequence(1, 100000000);
DataSet<Long> sum = input.reduce ( (a, b) -> a + b );