对于小型数据集,收集花费的时间比第一次花费更多

时间:2019-06-07 03:05:28

标签: java apache-spark hdfs

我将数据保存为HDFS上的单个分区(以字节为单位),当我想使用以下代码获取数据内容时,在单个分区中,send()collect花费更多的时间数据。

first

我期望JavaRDD<String> mytext = sc.textFile("..."); List<String> lines = mytext.collect(); collect花费相同的时间。对于单个HDFS分区中的数据,firstcollect慢。

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

rdd.first()不必扫描整个分区。它只有第一个 项并返回它。 rdd.collect()必须扫描整个分区,收集所有分区并发送 全部退回(序列化+反序列化成本等)

reason (see apache-spark-developers forum)可能是因为first()完全在驱动程序上执行 节点在同一过程中,而collect()需要与worker连接 节点。

通常,第一次运行操作时,大多数JVM代码不是 优化后,类加载器还需要在 飞。必须通过RPC与其他进程连接会减慢第一个进程的速度 在收集执行。

也就是说,如果您在相同的驱动程序中运行几次,它会 仍然慢得多,您应该考虑其他因素,例如网络 拥塞,工人的CPU /内存负载等。