我是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 )获取数据大小。
答案 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")
/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文档说:
sc.getRDDStorageInfo