在Spark中计算RDD昂贵任务中的记录?

在Hadoop中,当我使用inputformat reader时,作业级别的日志会报告读取的记录数,还会显示字节数等。

在Spark中,当我使用相同的inputformat阅读器时,我得到的不是那些指标。

所以我想我会使用inputformat reader来填充rdd,然后只发布rdd中的记录数(rdd的大小)。

我知道rdd.count()返回rdd的大小。

但是,使用count()的成本对我来说并不清楚? 例如:

  • 它是分布式function吗? 每个分区是否会报告其计数并将计数汇总并报告? 或整个rdd被带入驱动程序并计算?
  • 执行count() ,rdd仍会保留在内存中还是我必须显式缓存它?
  • 有没有更好的方法来做我想做的事情,即在对它们进行操作之前对记录进行计数?

它是分布式function吗? 每个分区是否会报告其计数并将计数汇总并报告? 或整个rdd被带入驱动程序并计算?

伯爵分发。 在火花命名法中,计数是一种“行动”。 所有行动都是分发的。 实际上,只有极少数东西可以将所有数据带到驱动程序节点,并且它们通常都有很好的文档记录(例如,接收,收集等)

执行count()后,rdd仍会保留在内存中还是我必须显式缓存它?

不,数据不会在内存中。 如果你想要它,你需要在计数之前显式缓存。 在采取Action之前,Spark的延迟评估不会进行任何计算。 除非有缓存调用,否则在Action之后不会将数据存储在内存中。

有没有更好的方法来做我想做的事情,即在对它们进行操作之前对记录进行计数?

缓存,计数,操作似乎是一个可靠的计划