我将数据保存为HDFS上的单个分区(以字节为单位),当我想使用以下代码获取数据内容时,在单个分区中,send()
比collect
花费更多的时间数据。
first
我期望JavaRDD<String> mytext = sc.textFile("...");
List<String> lines = mytext.collect();
和collect
花费相同的时间。对于单个HDFS分区中的数据,first
比collect
慢。
这可能是什么原因?
答案 0 :(得分:1)
rdd.first()
不必扫描整个分区。它只有第一个
项并返回它。
rdd.collect()
必须扫描整个分区,收集所有分区并发送
全部退回(序列化+反序列化成本等)
reason (see apache-spark-developers forum)可能是因为first()完全在驱动程序上执行
节点在同一过程中,而collect
()需要与worker连接
节点。
通常,第一次运行操作时,大多数JVM代码不是 优化后,类加载器还需要在 飞。必须通过RPC与其他进程连接会减慢第一个进程的速度 在收集执行。
也就是说,如果您在相同的驱动程序中运行几次,它会 仍然慢得多,您应该考虑其他因素,例如网络 拥塞,工人的CPU /内存负载等。