我正在使用Spark在集群中进行一些基准测试。在各种事情中,我希望获得通过序列化和压缩实现的平均大小减少的良好近似。我在客户端部署模式下与本地主机一起运行,对spark 1.6和2.2版的两个shell感到厌倦。
我想这样做是先计算内存大小,然后计算磁盘上的大小,所以分数应该是我的答案。显然,获取磁盘上的大小没有问题,但是我真的在内存中挣扎。
由于我的RDD由双精度构成,并且它们在内存中各自占用8个字节,因此我尝试计算RDD中的元素数量并乘以8,但这没有很多东西。 第二种方法是使用“ SizeEstimator”(https://spark.apache.org/docs/2.3.0/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
答案 0 :(得分:0)
尝试按照您提到的方式缓存rdd并检查spark UI的“存储”标签。
默认情况下,rdd被反序列化并存储在内存中。如果您想对其进行序列化,则可以将持久性与MEMORY_ONLY_SER选项一起使用。内存消耗将更少。在磁盘中,数据总是以序列化方式存储
检查一次Spark UI