Apache spark 数据帧大小保持增长,尽管其计数没有增长

Apache spark 数据帧大小保持增长,尽管其计数没有增长,apache-spark,spark-dataframe,Apache Spark,Spark Dataframe,我需要一些帮助 当我使用for循环更新数据帧时,apache spark出现了问题。尽管它的数量没有增长,但它的规模一直在无限增长 你能建议我如何修复它或者指导我为什么我的数据帧大小一直在增长吗?(T^T)/ 我的程序使用spark2.0.1在本地[6]上运行 @这是我的密码 def main(args: Array[String]): Unit = { val df1 = initial dataframe(read from db) while(){ val

我需要一些帮助
当我使用for循环更新数据帧时,apache spark出现了问题。尽管它的数量没有增长,但它的规模一直在无限增长

你能建议我如何修复它或者指导我为什么我的数据帧大小一直在增长吗?(T^T)/
我的程序使用spark2.0.1在本地[6]上运行

@这是我的密码

def main(args: Array[String]): Unit = {
    val df1 = initial dataframe(read from db)
    while(){
        val word_count_df = processAndCountText() // query data from database and do word count
        val temp_df1 = update(df1,word_count_df )
        temp_df1.persist(StorageLevel.MEMORY_AND_DISK)
        df1.unpersist()
        df1 = temp_df1

        println(temp_df1.count())
        println(s"${SizeEstimator.estimate(temp_df1) / 1073741824.0} GB")
    }
}
//已编辑
这是一个更新函数,用于更新具有关键字的某行。\u count\u df。
我尝试将其拆分为2个数据帧,分别计算,然后返回2个数据帧的并集,但这需要花费太多时间,因为它需要启用“spark.sql.crossJoin.enabled”

@这是我写入文件时的日志

I save df1 as CSV in the file system. below is the size of dataframe in file system, count and size(track by org.apache.spark.util.SizeEstimator).     



csv size 84.2 MB     
u_stateful_df : 1408665     
size of dataframe size : 0.4460855945944786 GB     



csv size 15.2 MB     
u_stateful_df : 183315     
size of dataframe size : 0.522 GB     



csv size 9.96 MB     
u_stateful_df : 123381     
size of dataframe size : 0.630GB     



csv size 4.63 MB     
u_stateful_df : 56896     
size of dataframe size : 0.999 GB

...
...
...

csv size 3.47 MB
u_stateful_df : 43104
size of dataframe size : 3.1956922858953476 GB

看起来里面有火花。通常,当您在数据帧上调用
persist
cache
,然后
count
时,Spark生成结果并将其存储在分布式内存或磁盘中,但也知道整个执行计划,以便在执行器丢失或其他情况下重建该数据帧。但它不应该占用这么多空间


据我所知,除了简单地向存储器写入数据,然后从存储器读取数据外,没有“折叠”数据帧(告诉Spark忘记整个执行计划)的选项。

看起来Spark内部有泄漏。通常,当您在数据帧上调用
persist
cache
,然后
count
时,Spark生成结果并将其存储在分布式内存或磁盘中,但也知道整个执行计划,以便在执行器丢失或其他情况下重建该数据帧。但它不应该占用这么多空间


据我所知,除了简单地向存储器写入数据,然后从存储器中读取数据外,没有“折叠”数据帧(告诉Spark忘记整个执行计划)的选项。

我想解决方案在
update
函数中,您能将其代码发布到Mariusz,thx以引起您的注意吗。我添加了更新功能来发布u请求>谢谢。我在
update
中找不到bug,我希望找到一些使行变大或内存泄漏的东西。。。请尝试另一个实验-不要使用
SizeEstimator
只需将此数据以行格式(csv/json)写入文件系统,并检查其大小是否在增长。我还跟踪计算机内存,其内存消耗与数据帧大小相同。对于Mariusz,我将显示文件系统中CSV大小的日志粘贴到帖子中:)我假设解决方案在
update
函数中,您能将其代码发布到Mariusz吗?谢谢。我添加了更新功能来发布u请求>谢谢。我在
update
中找不到bug,我希望找到一些使行变大或内存泄漏的东西。。。请尝试另一个实验-不要使用
SizeEstimator
只需将此数据以行格式(csv/json)写入文件系统,并检查其大小是否在增长。我还跟踪计算机内存,其内存消耗与数据帧大小相同。对于Mariusz,我将显示CSV文件系统大小的日志粘贴在帖子中:)谢谢,先生。(^0^)//是否有解决方案?我需要在while循环中使用spark运行这个算法来验证sparkstreaming的结果(我还编写了sparkstreaming代码,它共享相同的API)将数据写入临时目录并在循环中读取它们(而不是在缓存中持久化),我想这是唯一的方法…谢谢先生。(^0^)//是否有解决方案?我需要在while循环中使用spark运行这个算法来验证sparkstreaming的结果(我还编写了sparkstreaming代码,它共享相同的API)将数据写入临时目录并在循环中读取它们(而不是在缓存中持久化),我想这是唯一的方法。。。
u_stateful_df : 1408665
size of dataframe size : 0.8601360470056534 GB

u_stateful_df : 1408665
size of dataframe size : 1.3347024470567703 GB

u_stateful_df : 268498
size of dataframe size : 1.5012029185891151 GB

u_stateful_df : 147232
size of dataframe size : 3.287795402109623 GB

u_stateful_df : 111950
size of dataframe size : 4.761911824345589 GB

....
....

u_stateful_df : 72067
size of dataframe size : 14.510709017515182 GB
I save df1 as CSV in the file system. below is the size of dataframe in file system, count and size(track by org.apache.spark.util.SizeEstimator).     



csv size 84.2 MB     
u_stateful_df : 1408665     
size of dataframe size : 0.4460855945944786 GB     



csv size 15.2 MB     
u_stateful_df : 183315     
size of dataframe size : 0.522 GB     



csv size 9.96 MB     
u_stateful_df : 123381     
size of dataframe size : 0.630GB     



csv size 4.63 MB     
u_stateful_df : 56896     
size of dataframe size : 0.999 GB

...
...
...

csv size 3.47 MB
u_stateful_df : 43104
size of dataframe size : 3.1956922858953476 GB