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

时间:2016-12-03 19:09:12

标签: java mapreduce apache-flink

我正在使用Flink学习Map-Reduce,并且对如何有效计算DataSet中的元素有疑问。到目前为止我所拥有的是:

DataSet<MyClass> ds = ...;
long num = ds.count();

执行此操作时,在我的flink日志中显示

  

12/03/2016 19:47:27 DataSink(count())(1/1)切换到RUNNING

所以只使用了一个CPU(我有四个和其他命令,如reduce使用所有这些)。

我认为count()在内部从所有四个CPU收集DataSet并按顺序对它们进行计数,而不是让每个CPU计算它的部分然后总结它。这是真的吗?

如果是,我如何利用我的所有CPU?首先将我的DataSet映射到包含原始值作为第一项的2元组,将长值1作为第二项,然后使用SUM函数聚合它是不是一个好主意?

例如,DataSet将映射到DataSet&gt;其中Long总是为1.所以当我总结所有项时,元组的第二个值的总和将是正确的计数值。

计算DataSet中的项目的最佳做法是什么?

此致 西蒙

1 个答案:

答案 0 :(得分:0)

这是一个很好的解决方案吗?

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;
相关问题