Java Flink:DataSet.count()是瓶颈-如何并行计算?
我正在学习使用Flink的Map Reduce,并且有一个关于如何有效地计算数据集中的元素的问题。到目前为止,我得到的是: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-
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()在内部不这样做有什么原因吗?没有技术原因。弗林克理论上可以自动应用这种优化。碰巧它从未实现过——你需要在邮件列表上进行调查,找出原因。