我正在使用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中的项目的最佳做法是什么?
此致 西蒙
答案 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;