Spark应用中的压缩率

dw1jzc5e  于 2023-03-03  发布在  Apache
关注(0)|答案(1)|浏览(151)

我正在使用Spark在集群中做一些基准测试。在各种各样的事情中,我想得到一个很好的近似值,通过序列化和压缩实现平均大小的减少。我在客户端部署模式下运行,使用本地主机,厌倦了Spark 1.6和2.2版本的shell。
我想先计算内存中的大小,然后计算磁盘上的大小,所以分数应该是我的答案。显然,我在获得磁盘上的大小方面没有问题,但我真的很难计算内存中的大小。
因为我的RDD是由双精度数组成的,它们在内存中各占8个字节,我试着计算RDD中元素的数量,然后乘以8,但这遗漏了很多东西。第二种方法是使用"SizeEstimator"(https://spark.apache.org/docs/230/api/scala/index.html#org.apache.spark.util.SizeEstimator $),但这给了我疯狂的结果!在Spark 1.6中,它是随机的30、130或230(磁盘上47 MB),在Spark 2.2中,它从30开始,每次我执行它,它都会增加0或1。我知道它说它不是超级准确,但我甚至找不到一点一致性!我甚至试着只在内存中设置持久化级别rdd.persist(StorageLevel.MEMORY_ONLY),但仍然没有任何变化。
是否有其他方法可以获得RDD的内存大小?或者我应该尝试其他方法?我使用rdd.SaveAsTextFile写入磁盘,并通过RandomRDDs.uniformRDD生成rdd。

    • 编辑**

样本代码:

val rdd = RandomRDDs.uniformRDD(sc, nBlocks, nThreads)
rdd.persist(StorageLevel.MEMORY_ONLY_SER)
println("RDD count: " + rdd.count)
rdd.saveAsObjectFile("file:///path/to/folder")

读出

val rdd = sc.wholeTextFiles(name,nThreads)
rdd.count() //action so I'm sure the file is actually read

webUI

hgb9j2n6

hgb9j2n61#

尝试像您提到的那样缓存rdd,并检查spark UI的存储选项卡。
默认情况下,rdd被反序列化并存储在内存中。如果要序列化它,请专门使用带有选项MEMORY_ONLY_SER的persist。内存消耗会更少。在磁盘中,数据将始终以序列化方式存储
检查一次spark UI

相关问题