Spark应用中的压缩率

时间:2018-08-12 09:28:42

标签: apache-spark serialization compression benchmarking

我正在使用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

webUI

1 个答案:

答案 0 :(得分:0)

尝试按照您提到的方式缓存rdd并检查spark UI的“存储”标签。

默认情况下,rdd被反序列化并存储在内存中。如果您想对其进行序列化,则可以将持久性与MEMORY_ONLY_SER选项一起使用。内存消耗将更少。在磁盘中,数据总是以序列化方式存储

检查一次Spark UI