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

时间:2016-04-19 16:14:30

标签: java hadoop apache-spark

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

在Spark中,当我使用相同的输入格式读取器时,我没有使用这些指标。

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

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

然而,使用count()的费用对我来说并不清楚?例如:

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

1 个答案:

答案 0 :(得分:13)

  

它是分布式功能吗?每个分区都会报告其计数      并计算和报告计数?或者整个rdd带来了      进入司机并计算?

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

  

执行count()后,rdd仍会保留在内存中或执行      我必须明确缓存它吗?

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

  

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

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