我知道如何在scala中找到文件大小。但是如何在spark中找到RDD / dataframe大小?
Scala的:
object Main extends App {
val file = new java.io.File("hdfs://localhost:9000/samplefile.txt").toString()
println(file.length)
}
火花:
val distFile = sc.textFile(file)
println(distFile.length)
但如果我处理它没有获得文件大小。如何找到RDD大小?
答案 0 :(得分:41)
如果您只想计算rdd
中的行数,请执行:
val distFile = sc.textFile(file)
println(distFile.count)
如果您对字节感兴趣,可以使用SizeEstimator
:
import org.apache.spark.util.SizeEstimator
println(SizeEstimator.estimate(distFile))
https://spark.apache.org/docs/latest/api/java/org/apache/spark/util/SizeEstimator.html
答案 1 :(得分:9)
是的,最后我得到了解决方案。 包括这些库。
import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD
import org.apache.spark.rdd
import org.apache.spark.util.SizeEstimator
如何查找RDD大小:
def calcRDDSize(rdd: RDD[String]): Long = {
rdd.map(_.getBytes("UTF-8").length.toLong)
.reduce(_+_) //add the sizes together
}
查找DataFrame大小的函数: (此函数只是在内部将DataFrame转换为RDD)
val dataFrame = sc.textFile(args(1)).toDF() // you can replace args(1) with any path
val rddOfDataframe = dataFrame.rdd.map(_.toString())
val size = calcRDDSize(rddOfDataframe)
答案 2 :(得分:7)
以下是SizeEstimator
之外的一种方式。我经常使用
从代码中了解一下RDD是否被缓存,更确切地说,有多少分区缓存在内存中以及有多少缓存在磁盘上?获取存储级别,也想了解当前的实际缓存状态。了解内存消耗。
Spark Context有开发人员api方法getRDDStorageInfo() 偶尔你可以使用它。
返回有关缓存哪些RDD的信息,如果它们在mem或中 在磁盘上,他们占用了多少空间等等。
例如:
scala> sc.getRDDStorageInfo res3: Array[org.apache.spark.storage.RDDInfo] = Array(RDD "HiveTableScan [name#0], (MetastoreRelation sparkdb, firsttable, None), None " (3) StorageLevel: StorageLevel(false, true, false, true, 1); CachedPartitions: 1;
TotalPartitions:1; MemorySize:256.0 B; ExternalBlockStoreSize:0.0 B; DiskSize:0.0 B)
<强> 描述 强>
通过SPARK-13992,Spark支持持久化数据 堆外内存,但目前没有暴露堆外的使用, 用户监控和配置文件并不方便,所以这里 建议公开堆外内存以及堆内存使用情况 各地:
- Spark UI的执行程序页面将显示堆上和堆外内存使用情况。
- REST请求返回堆内和堆外内存。
- 这两个内存使用也可以通过SparkListener以编程方式获得。
醇>