Java Flink:DataSet.count()是瓶颈-如何并行计算?

Java Flink:DataSet.count()是瓶颈-如何并行计算?,java,mapreduce,apache-flink,Java,Mapreduce,Apache Flink,我正在学习使用Flink的Map Reduce,并且有一个关于如何有效地计算数据集中的元素的问题。到目前为止,我得到的是: DataSet<MyClass> ds = ...; long num = ds.count(); 数据集ds=。。。; long num=ds.count(); 执行此操作时,在我的flink日志中显示 2016年3月12日19:47:27数据链路(count())(1/1)切换为运行 因此,只使用了一个CPU(我有四个和其他命令,如reduce-use-

我正在学习使用Flink的Map Reduce,并且有一个关于如何有效地计算数据集中的元素的问题。到目前为止,我得到的是:

DataSet<MyClass> ds = ...;
long num = ds.count();
数据集ds=。。。; long num=ds.count(); 执行此操作时,在我的flink日志中显示

2016年3月12日19:47:27数据链路(count())(1/1)切换为运行

因此,只使用了一个CPU(我有四个和其他命令,如reduce-use-all)

我认为count()在内部收集来自所有四个CPU的数据集,并按顺序对它们进行计数,而不是让每个CPU对其部分进行计数,然后将其相加。这是真的吗

如果是,我如何利用我所有的CPU?首先将我的数据集映射到一个2元组,其中包含原始值作为第一项,长值1作为第二项,然后使用SUM函数对其进行聚合,这是一个好主意吗

例如,数据集将映射到DataSet>,其中Long始终为1。因此,当我对所有项求和时,元组的第二个值的和将是正确的计数值

对数据集中的项目进行计数的最佳实践是什么

问候 Simon是一个非并行操作,因此只能使用单个线程


您可以按键进行计数以获得并行化,并对键计数应用最终总和以获得总计数以加快计算速度。

这是一个好的解决方案吗

DataSet<Tuple1<Long>> x = ds.map(new MapFunction<MyClass, Tuple1<Long>>() { 
    @Override public Tuple1<Long> map(MyClass t) throws Exception { 
        return new Tuple1<Long>(1L); 
    } 
}).groupBy(0).sum(0);

Long c = x.collect().iterator().next().f0;
DataSet x=ds.map(新的MapFunction(){
@重写公共元组1映射(MyClass t)引发异常{
返回新的元组1(1L);
} 
}).groupBy(0)。总和(0);
长c=x.collect().iterator().next().f0;

谢谢您的回答。不幸的是,我不知道如何按键计数。这是弗林克手术吗?我找不到这方面的信息,我找到了解决方案。你是说这个吗?DataSet x=hasNum.map(new-MapFunction(){@Override public Tuple1-map(MyClass t)抛出异常{return new Tuple1(1L);}}});差不多;)我对您自己的答案进行了评论总体思路是正确的——但是,您映射到Tuple1并对所有元组使用相同的值——因此,所有元组都在同一个线程上,并且实际上仍然是单线程的——即使启动多个线程,也只有一个线程会接收数据。因此,您应该在
新Tuple1(…)
中生成一个随机值。使用
count()
而不是
sum(0)
。这将为您提供需要再次汇总的多个计数。count()在内部不这样做有什么原因吗?没有技术原因。弗林克理论上可以自动应用这种优化。碰巧它从未实现过——你需要在邮件列表上进行调查,找出原因。