Python Spark中的记忆相关变量

Python Spark中的记忆相关变量,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,嗨,我是spark的新手,我对一件事有疑问,那就是 我将一个4.2 gb的CSV文件读取到spark数据帧,并通过 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.m

嗨,我是spark的新手,我对一件事有疑问,那就是

我将一个4.2 gb的CSV文件读取到spark数据帧,并通过

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 UI localhost:4040中持久化之后,在存储选项卡中,我可以看到内存中的大小是1204.7 Mb。如果我坚持使用它(仅限内存),它不应该是4.2 gb吗?此外,env.sh中的上述设置显示了所有内存计算是如何进行的。如果可能,任何人都可以解释我必须运行一个作业的次数((48*(1-0.7)我从上述设置中猜测)

请帮我澄清我的困惑。

1)仅内存模式在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文件中有哪些数据?

1)仅内存模式在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文件中有什么数据?

@Shirish有一个输入错误,,,是1204 Mb。我编辑了那个。。我在一台64Gb RAM.4cpu的机器上运行我的工作。如果我认为你的点为1,那么使用的RAM应该保持在4.2 GB以上。所以内存中的大小??我们不能完美地说内存中的大小大于或小于硬盘上的CSV大小。与前面给出的示例相反,考虑双值1.2345678923456789在CSV中占用18字节,在JVM中只有8字节(带有代码> double < /代码>类型)。因此,与CSV相比,您可以拥有更小或更大的JVM占用空间。如果数据中有很多数字/整数,您可以“通常”期望JVM的大小更大,但不一定总是这样。。。。这完全取决于数据。@Shirish Plz confirm“根据我的数据,4.2 gb csv文件作为内存保存时仅占用1204.7 Mb的RAM空间(从48Gb*(1-0.7))”。忽略我在csv中的数据类型以及JVM如何存储它…:)正如您在文档中可以找到的那样,
MEMORY\u ONLY
反序列化
格式存储数据,即以实际Java对象的形式。这些对象的类型控制JVM占用空间。@Shirish有一个输入错误,,,它是1204 Mb。我编辑了那个。。我在一台64Gb RAM.4cpu的机器上运行我的工作。如果我认为你的点为1,那么使用的RAM应该保持在4.2 GB以上。所以内存中的大小??我们不能完美地说内存中的大小大于或小于硬盘上的CSV大小。与前面给出的示例相反,考虑双值1.2345678923456789在CSV中占用18字节,在JVM中只有8字节(带有代码> double < /代码>类型)。因此,与CSV相比,您可以拥有更小或更大的JVM占用空间。如果数据中有很多数字/整数,您可以“通常”期望JVM的大小更大,但不一定总是这样。。。。这完全取决于数据。@Shirish Plz confirm“根据我的数据,4.2 gb csv文件作为内存保存时仅占用1204.7 Mb的RAM空间(从48Gb*(1-0.7))”。忽略我在csv中的数据类型以及JVM如何存储它…:)正如您在文档中可以找到的那样,
MEMORY\u ONLY
反序列化
格式存储数据,即以实际Java对象的形式。这些对象的类型控制JVM占用空间。