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

hba*_*hba 9 java hadoop apache-spark

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

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

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

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

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

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

Dav*_*vid 14

它是分布式功能吗?每个分区是否会报告其计数并将计数汇总并报告?或整个rdd被带入司机并计算?

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

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

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

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

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