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

Java 对于小数据集,收集比第一次收集花费更多的时间,java,apache-spark,hdfs,Java,Apache Spark,Hdfs,我将数据保存为HDFS上的单个分区(以字节为单位),当我想使用下面的代码获取数据内容时,收集比数据的单个分区中的第一次花费更多的时间 javarddmytext=sc.textFile(“…”); 列表行=mytext.collect(); 我希望collect和first的时间相同。然而,对于HDFS的单个分区中的数据,collect比first慢 这背后的原因可能是什么?rdd.first()不必扫描整个分区。它只得到第一个 项目并将其返回。 rdd.collect()必须扫描整个分区,收

我将数据保存为HDFS上的单个分区(以字节为单位),当我想使用下面的代码获取数据内容时,
收集
比数据的单个分区中的
第一次
花费更多的时间

javarddmytext=sc.textFile(“…”);
列表行=mytext.collect();
我希望
collect
first
的时间相同。然而,对于HDFS的单个分区中的数据,
collect
first

这背后的原因可能是什么?

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

这可能是因为first()完全在驱动程序上执行 节点处于同一进程中,而
收集
()需要与工作进程连接
节点

通常在第一次运行操作时,大多数JVM代码都不是 优化了,类加载器还需要在 飞必须通过RPC与其他进程连接会降低第一个进程的速度 以对方付费方式执行

也就是说,如果您运行几次(在同一个驱动程序中)并且 速度仍然慢得多,您应该考虑其他因素,如网络
拥塞、工作人员的cpu/内存负载等。

为什么检索第一条记录与检索所有数据需要相同的时间?因为数据非常小或很小。
collect
几乎是第一条记录的3倍