Apache spark 此代码是否存在沿袭问题?
我写了一些spark程序来做计算。逻辑非常简单,但它总是会在一段时间后报告OutOfMemory问题。逻辑太简单,内存不会泄漏。。我确信我的记忆力已经足够了。所以我想知道这是否是血统成本。请帮忙给我一些建议。。。这真让我发疯 首先,这不是一个流计算,尽管它看起来像一个流计算 伪代码:Apache spark 此代码是否存在沿袭问题?,apache-spark,pyspark,apache-spark-sql,spark-streaming,Apache Spark,Pyspark,Apache Spark Sql,Spark Streaming,我写了一些spark程序来做计算。逻辑非常简单,但它总是会在一段时间后报告OutOfMemory问题。逻辑太简单,内存不会泄漏。。我确信我的记忆力已经足够了。所以我想知道这是否是血统成本。请帮忙给我一些建议。。。这真让我发疯 首先,这不是一个流计算,尽管它看起来像一个流计算 伪代码: for file_name in file_list: data_frame = get_data_frame(file_name) # The file_name is timestamp
for file_name in file_list:
data_frame = get_data_frame(file_name)
# The file_name is timestamp
timestamp = file_name
my_dict[ timestamp ] = data_frame
for the_timestamp in my_dict.keys():
if timestamp - the_timestamp > 24 hours:
# not only unpersist, but also delete to make sure the memory is released
my_dict[the_timestamp].unpersist
del my_dict[the_timestamp ]
# pop one data frame from the dict
big_data_frame = my_dict.popitem()
for timestamp in my_dict.keys():
df = my_dict.get( timestamp )
big_data_frame = big_data_frame.unionAll(df)
# Then we run SQL on the big_data_frame to get report
如果仍然不清楚,请再次解释代码。我有一份文件清单。每个文件都有一个时间戳作为其名称。我将逐一读取这些文件,以获得一批数据帧。(我不能一次读取它们,因为文件是随时间生成的。不能一次读取)
但是我需要得到最近288个文件的报告(这些文件每5分钟生成一次,所以最近288个文件代表最近1天)。所以每次我读一个文件并生成一个数据帧时,我都会维护一个dict。我把它放进字典里,去掉那些旧的(只有那些超过1天的)。然后,我将把dict中的数据帧合并成一个大的数据帧,并运行SQL以获得一些报告
我在一个独立的集群上运行这个程序。只有一个节点。驱动程序有4G内存,执行器有6G内存。文件大小非常小,因为我正在进行测试(4KB),所以即使288文件的总大小也只有4KB*288~1200KB。远离4GB
所以我不知道为什么它报告OutOfMemory或GC超限
有一件事我不确定,那就是血统问题。我读了spark stream文档,它说使用reduceByKeyandWindow等操作的流计算需要检查点来截断沿袭。我没有使用流计算,我的代码模式与ReduceByAndWindow有一些共同点。。我仍然不确定这是血统还是别的什么
请帮我提些建议 由于StackOverflow而不是GC或OOM而导致沿袭问题。@非常感谢CafeFeed