嗨,我是新来的火花,我对一件事情有疑问:e
我将一个4.2 gb的CSV文件读取到一个火花数据框并按
继续df_spark = spark.read_csv('data.csv',header=True)
df_spark.persist() ###so MEMORY_ONLY
df_spark.count() ### 6722244 which is correct
# my spark conf is
spark.driver.memory 48g
spark.memory.fraction 0.7
spark.driver.maxResultSize 4g
spark.memory.storageFraction 0.3
但是在坚持使用spark localhost:4040后,在存储选项卡中我可以看到Size_in_ Memory是1204.7 Mb。如果我坚持它(MEMORY_ONLY),它不应该是4.2 GB吗? env.sh中的上述设置也显示了所有内存计算的发生方式。如果有可能,任何人都可以解释我有多少运行工作((48 *(1-0.7)我想从上面的设置)。
请帮我澄清我的困惑。
答案 0 :(得分:0)
1)MEMORY_ONLY模式在JVM中存储反序列化的Java对象。现在,反序列化对象的大小与它在csv文件中占用的大小完全不同。例如,csv文件中的浮点数“1.2”需要3个字节,而内存中的“double”需要8个字节,而Double对象需要更多的字节数(由于Java对象的空间开销)。因此,这就解释了为什么我们不能指望磁盘上的CSV大小与您在Spark UI的存储选项卡上看到的数字相匹配。
2)我很好奇你是如何以及在哪里经营这份工作的?你提到“localhost:4040”表示你在本地运行,但你的驱动程序内存为48GB。这很多。您不应该使用本地模式来处理大型数据集,并且在典型的seup中,驱动程序JVM很小并且执行程序内存往往很大(取决于问题的大小和特征)。令我困惑的另一件事是内存1204GB中数据集的大小,即1.2 TB ......与4.2GB的原始数据集相比,这又是非常大的。您在该CSV文件中有哪些数据?