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

Ven*_*ive 28 scala apache-spark rdd

我知道如何在scala中找到文件大小.但是如何在spark中找到RDD/dataframe大小?

斯卡拉:

object Main extends App {
  val file = new java.io.File("hdfs://localhost:9000/samplefile.txt").toString()
  println(file.length)
}
Run Code Online (Sandbox Code Playgroud)

火花:

val distFile = sc.textFile(file)
println(distFile.length)
Run Code Online (Sandbox Code Playgroud)

但如果我处理它没有获得文件大小.如何找到RDD大小?

Gle*_*olt 49

如果您只想查看其中的行数rdd,请执行以下操作:

val distFile = sc.textFile(file)
println(distFile.count)
Run Code Online (Sandbox Code Playgroud)

如果您对字节感兴趣,可以使用SizeEstimator:

import org.apache.spark.util.SizeEstimator
println(SizeEstimator.estimate(distFile))
Run Code Online (Sandbox Code Playgroud)

https://spark.apache.org/docs/latest/api/java/org/apache/spark/util/SizeEstimator.html

  • 顺便说一句,如果一切正常,你可以将问题标记为已回答:) (2认同)
  • 哦,我明白了 - 我错过了“总是在 43MB 左右”的部分。但是,如果您对“dataframe”在内存中占用的大小不感兴趣,而只想要磁盘上文件的大小,为什么不只使用常规文件实用程序呢? (2认同)

Ven*_*ive 11

是的,最后我得到了解决方案.包括这些库.

import org.apache.spark.sql.Row
import org.apache.spark.rdd.RDD
import org.apache.spark.rdd
Run Code Online (Sandbox Code Playgroud)

如何找到RDD大小:

def calcRDDSize(rdd: RDD[String]): Long = {
  rdd.map(_.getBytes("UTF-8").length.toLong)
     .reduce(_+_) //add the sizes together
}
Run Code Online (Sandbox Code Playgroud)

查找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)
Run Code Online (Sandbox Code Playgroud)

  • 如果将数据帧转换为RDD,则会大大增加其大小.Dataframe使用项目钨来实现更高效的内存表示.如果您只想获得大小的印象,可以缓存RDD和数据框(例如,确保通过对其进行计数来实现缓存),然后查看UI的存储选项卡.请注意,在任何一种情况下,您都会获得内存中的大小而不是文件大小 (13认同)
  • 这个答案是对的.转换为字符串以计算大小没有任何意义.另外,不使用`import org.apache.spark.util.SizeEstimator` (9认同)

Ram*_*ram 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;
Run Code Online (Sandbox Code Playgroud)

TotalPartitions:1; MemorySize:256.0 B; ExternalBlockStoreSize:0.0 B; DiskSize:0.0 B)

看起来像spark ui也使用了相同的代码

  • 请参阅此源问题 SPARK-17019,其中描述了......

说明
使用SPARK-13​​992,Spark支持将数据保存到堆外内存中,但是当前没有暴露堆外的使用,用户监控和分析不太方便,因此这里建议将堆外内存公开为以及各种地方的堆内存使用情况:

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

  • 我在这里看不到如何从`sc.getRDDStorageInfo`获取`MemorySize:256.0 B`。 (2认同)