对于小数据集,collect 比 first 花费更多的时间
collect takes more time than first for small dataset
我将数据保存为 HDFS 上的单个分区(以字节为单位),当我想使用以下代码获取数据内容时,collect
比 first
花费更多时间数据的单个分区。
JavaRDD<String> mytext = sc.textFile("...");
List<String> lines = mytext.collect();
我原以为 collect
和 first
会同时进行。然而,对于 HDFS 单个分区中的数据,collect
比 first
慢。
这背后的原因可能是什么?
rdd.first()
不必扫描整个分区。它只得到第一个
项目和 returns 它。
rdd.collect()
必须扫描整个分区,收集所有分区并发送
全部返回(序列化 + 反序列化成本等)
reason (see apache-spark-developers forum) 可能是因为 first() 完全在驱动程序上执行
同一进程中的节点,而 collect
() 需要与工作人员连接
节点。
通常你第一次运行一个动作,大部分JVM代码都不会
优化了,classloader也需要加载很多东西在
飞。必须通过 RPC 与其他进程连接会减慢第一个进程
在收集中执行。
就是说,如果你 运行 这几次(在同一个驱动程序中)并且它
还是慢很多,你应该看看其他因素,比如网络
拥堵,cpu/memory 工人负担等
我将数据保存为 HDFS 上的单个分区(以字节为单位),当我想使用以下代码获取数据内容时,collect
比 first
花费更多时间数据的单个分区。
JavaRDD<String> mytext = sc.textFile("...");
List<String> lines = mytext.collect();
我原以为 collect
和 first
会同时进行。然而,对于 HDFS 单个分区中的数据,collect
比 first
慢。
这背后的原因可能是什么?
rdd.first()
不必扫描整个分区。它只得到第一个
项目和 returns 它。
rdd.collect()
必须扫描整个分区,收集所有分区并发送
全部返回(序列化 + 反序列化成本等)
reason (see apache-spark-developers forum) 可能是因为 first() 完全在驱动程序上执行
同一进程中的节点,而 collect
() 需要与工作人员连接
节点。
通常你第一次运行一个动作,大部分JVM代码都不会 优化了,classloader也需要加载很多东西在 飞。必须通过 RPC 与其他进程连接会减慢第一个进程 在收集中执行。
就是说,如果你 运行 这几次(在同一个驱动程序中)并且它 还是慢很多,你应该看看其他因素,比如网络 拥堵,cpu/memory 工人负担等