如何找到火花RDD /数据帧大小?

时间:2016-01-26 06:28:31

标签: scala apache-spark rdd

我知道如何在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大小?

3 个答案:

答案 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 ui也使用了code

中的相同内容
  • 请参阅此来源问题SPARK-17019,其中介绍了......
  

<强> 描述
  通过SPARK-13​​992,Spark支持持久化数据   堆外内存,但目前没有暴露堆外的使用,   用户监控和配置文件并不方便,所以这里   建议公开堆外内存以及堆内存使用情况   各地:

     
      
  1. Spark UI的执行程序页面将显示堆上和堆外内存使用情况。
  2.   
  3. REST请求返回堆内和堆外内存。
  4.   
  5. 这两个内存使用也可以通过SparkListener以编程方式获得。
  6.