此代码是否存在沿袭问题?

时间:2016-04-11 13:47:03

标签: apache-spark pyspark apache-spark-sql spark-streaming

我写了一些火花程序来做计算。逻辑非常简单,但一段时间后它总会报告OutOfMemory问题。逻辑太简单了,没有内存泄漏。而且我很确定我的记忆力已经足够了。所以我想知道它是否是血统成本。请帮忙提一些建议......这真让我疯狂..

首先,这不是流计算,尽管它看起来像是一个。

伪代码:

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 overlimit ...

我不确定的一件事是血统问题。我读了火花流文档,它说使用reduceByKey和Windows等操作的流计算需要检查点来截断谱系。我没有使用我的代码模式的流计算与reduceByKeyandWindow有一些共同点。但我仍然不确定它是否是血统或其他东西。

请帮忙提出一些建议..

0 个答案:

没有答案