How to find spark RDD/Dataframe size?
我知道如何在Scala中找到文件大小,但是如何在Spark中找到RDD /数据帧大小?
Scala:
1 2 3 4
| object Main extends App {
val file = new java. io. File("hdfs://localhost:9000/samplefile.txt"). toString()
println (file. length)
} |
火花:
1 2
| val distFile = sc. textFile(file )
println (distFile. length) |
但是,如果我处理它没有得到文件的大小。 如何找到RDD大小?
-
您是指rdd中的行数还是以MB(或GB)为单位的实际大小?
-
您也可以为:P提供答案。
-
举个例子,输入了50 MB的文件,我想将其拆分为5。要首先输入rdd,我需要找到rdd的大小,但没有成功。
如果您只是想计算rdd中的行数,请执行以下操作:
1 2
| val distFile = sc. textFile(file )
println (distFile. count) |
如果您对字节感兴趣,可以使用SizeEstimator:
1 2
| import org. apache. spark. util. SizeEstimator
println (SizeEstimator. estimate(distFile )) |
https://spark.apache.org/docs/latest/api/java/org/apache/spark/util/SizeEstimator.html
-
感谢它的工作,当我导入此导入org.apache.spark.util.SizeEstimator但未获得确切的值。总是在43MB左右
-
顺便说一句,如果一切正常,那么您能否将问题标记为已回答:)
-
请在这里找到我的问题。 sparkdeveloper.blogspot.in/2016/01/spark-solution-please.html
-
哦,我明白了-我错过了"大约43MB"部分。但是,如果您对dataframe占用内存的大小不感兴趣,而只想要磁盘上文件的大小,为什么不只使用常规文件工具呢?
-
@GlennieHellesSindholt常规文件实用程序如何处理镶木地板,因为它不能给我正确的大小?
-
常规文件实用程序会告诉您任何给定文件在磁盘上的物理大小-无论是拼花木地板,以压缩方式打包还是以任何其他方式打包都无所谓。您使用的是哪个文件实用程序,大小不正确?
-
如果将SizeEstimator用于高速缓存消耗估计,请注意它将以反序列化形式为对象提供字节。这与对象的序列化大小不同,后者通常要小得多。
是的,最后我找到了解决方案。
包括这些库。
1 2 3
| import org. apache. spark. sql. Row
import org. apache. spark. rdd. RDD
import org. apache. spark. rdd |
如何找到RDD大小:
1 2 3 4
| def calcRDDSize (rdd : RDD [String ]): Long = {
rdd. map(_. getBytes("UTF-8"). length. toLong)
. reduce(_+ _) //add the sizes together
} |
查找DataFrame大小的函数:
(此函数仅在内部将DataFrame转换为RDD)
1 2 3 4 5
| 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 ) |
-
如果将数据帧转换为RDD,则会大大增加其大小。 Dataframe使用钨钨项目来实现更有效的内存表示。如果只想看一下大小,则可以缓存RDD和数据帧(例如,确保对缓存进行计数),然后在UI的存储选项卡下查看。请注意,无论哪种情况,您获取的都是内存大小,而不是文件大小
-
这个答案是错误的。转换为字符串以计算大小没有任何意义。此外,不使用import org.apache.spark.util.SizeEstimator
-
如果您要在其中存储数据框,实际上将获得平面文本文件的大小。几乎就是我要寻找的东西。
-
@Venu A肯定的是,即使在导入所有导入后,我仍在使用spark-sql 2.4.1v,在这里显示我没有_.getBytes方法,我还需要导入什么? pom.xml是否有变化?请建议
以下是与SizeEstimator分开的一种方法。我经常使用
要从代码中了解有关RDD的信息是否已缓存,更确切地说,它的多少个分区缓存在内存中,多少个分区缓存在磁盘上?要获取存储级别,还想知道当前的实际缓存状态。要了解内存消耗。
Spark Context具有开发人员api方法getRDDStorageInfo()
有时您可以使用此功能。
Return information about what RDDs are cached, if they are in mem or
on disk, how much space they take, etc.
For Example :
1 2 3 4
| 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也从此代码中使用了相同的内容
-
请参阅此源问题SPARK-17019,其中描述了...
Description
With SPARK-13992, Spark supports persisting data into
off-heap memory, but the usage of off-heap is not exposed currently,
it is not so convenient for user to monitor and profile, so here
propose to expose off-heap memory as well as on-heap memory usage in
various places:
Spark UI's executor page will display both on-heap and off-heap memory usage.
REST request returns both on-heap and off-heap memory.
Also these two memory usage can be obtained programmatically from SparkListener.
-
我在这里看不到您如何从sc.getRDDStorageInfo获取MemorySize: 256.0 B