从apache spark中的文本文件中查找存储在rdd中的数据大小

时间:2015-08-24 09:52:18

标签: scala apache-spark apache-spark-1.4

我是Apache Spark(版本1.4.1)的新手。我写了一个小代码来读取文本文件并将其数据存储在Rdd中。

有没有办法在rdd中获取数据大小。

这是我的代码:

import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.util.SizeEstimator
import org.apache.spark.sql.Row

object RddSize {

  def main(args: Array[String]) {

    val sc = new SparkContext("local", "data size")
    val FILE_LOCATION = "src/main/resources/employees.csv"
    val peopleRdd = sc.textFile(FILE_LOCATION)

    val newRdd = peopleRdd.filter(str => str.contains(",M,"))
    //Here I want to find whats the size remaining data
  }
} 

我想在过滤器转换( peopleRdd )之前和之后( newRdd )获取数据大小。

3 个答案:

答案 0 :(得分:8)

获取RDD大小的方法有多种

1.在你的spark上下文中添加spark监听器

SparkDriver.getContext.addSparkListener(new SparkListener() {
override def onStageCompleted(stageCompleted: SparkListenerStageCompleted) {
  val map = stageCompleted.stageInfo.rddInfos
  map.foreach(row => {
      println("rdd memSize " + row.memSize)
      println("rdd diskSize " + row.diskSize)
   })
}})

2。将rdd保存为文本文件。

myRDD.saveAsTextFile("person.txt")

并致电Apache Spark REST API

/applications/[app-id]/stages

3。您也可以尝试SizeEstimater

val rddSize = SizeEstimator.estimate(myRDD)

答案 1 :(得分:4)

我不确定你是否需要这样做。您可以缓存rdd并在Spark UI中检查大小。但是,让我们说你确实希望以编程方式执行此操作,这是一个解决方案。

    def calcRDDSize(rdd: RDD[String]): Long = {
        //map to the size of each string, UTF-8 is the default
        rdd.map(_.getBytes("UTF-8").length.toLong) 
           .reduce(_+_) //add the sizes together
    }

然后,您可以为两个RDD调用此函数:

println(s"peopleRdd is [${calcRDDSize(peopleRdd)}] bytes in size")
println(s"newRdd is [${calcRDDSize(newRdd)}] bytes in size")

即使文件大小大于群集中可用的内存,此解决方案也应该有效。

答案 2 :(得分:0)

Spark API文档说:

  1. 您可以从Spark上下文获取有关您的RDD的信息:sc.getRDDStorageInfo
  2. RDD信息包括内存和磁盘大小:RDDInfo doc