【问题标题】:collect takes more time than first for small dataset对于小型数据集,收集比第一次花费更多时间
【发布时间】:2019-10-22 13:21:14
【问题描述】:

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

JavaRDD<String> mytext = sc.textFile("...");
List<String> lines = mytext.collect();

我期待 collectfirst 花费相同的时间。然而,对于 HDFS 单个分区中的数据,collectfirst 慢。

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

【问题讨论】:

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

标签: java apache-spark hdfs


【解决方案1】:

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

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

通常第一次运行一个动作时,大部分 JVM 代码都不会 优化了,classloader也需要加载很多东西 飞。必须通过 RPC 与其他进程连接可能会减慢第一个进程 在收集中执行。

也就是说,如果您运行几次(在同一个驱动程序中)并且它 还是慢很多,你应该看看其他因素,比如网络 拥塞、工作人员的 cpu/内存负载等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2017-06-02
    • 2022-09-30
    相关资源
    最近更新 更多