Apache spark PypSpark从运动中流出杀死堆

Apache spark PypSpark从运动中流出杀死堆,apache-spark,pyspark,spark-streaming,iot,amazon-kinesis,Apache Spark,Pyspark,Spark Streaming,Iot,Amazon Kinesis,运行示例应用程序从kinesis流式传输数据。我不明白为什么这个应用程序使用这么多堆和崩溃 代码如下: from __future__ import print_function import sys from pyspark.streaming import StreamingContext from pyspark.streaming.kinesis import KinesisUtils, InitialPositionInStream from pyspark.sql.session

运行示例应用程序从kinesis流式传输数据。我不明白为什么这个应用程序使用这么多堆和崩溃

代码如下:

from __future__ import print_function
import sys

from pyspark.streaming import StreamingContext
from pyspark.streaming.kinesis import KinesisUtils, InitialPositionInStream
from pyspark.sql.session import SparkSession
from datetime import datetime

# function declaration
def isDfEmpty(df):

    try:
        if not df.take(1) :
            return True

    except Exception as e:
        return True

    return False

# function declaration
def mergeTable(df):
    print("b:mergeTable")
    print(str(datetime.now()))

    try:
        global refDf

        if isDfEmpty(df) :
            print("no record, waiting !")
        else :
            if(isDfEmpty(refDf)) :
                refDf = df
            else :
                print("        before count %s" % refDf.count())
                refDf = df.unionAll(refDf)
                print("        after count %s" % refDf.count())

    except Exception as e:
        print(e)
    print(str(datetime.now()))
    print("e:mergeTable")   

# function declaration
def doWork(df):
    print("b:doWork")
    print(str(datetime.now()))

    try:
        mergeTable(df)
    except Exception as e:
        print(e)
    print(str(datetime.now()))
    print("e:doWork")

# function declaration
def sensorFilter(sensorType, rdd):
    df = spark.read.json(rdd.filter(lambda x : sensorType in x))
    doWork(df)


def printRecord(rdd):
    print("========================================================")
    print("Starting new RDD")
    print("========================================================")
    sensorFilter("SensorData", rdd)

refDf = None    

if __name__ == "__main__":
    reload(sys)  
    # sys.setdefaultencoding('utf-8')



    if len(sys.argv) != 5:
        print( "Usage: dump.py <app-name> <stream-name> <endpoint-url> <region-name>", file=sys.stderr)
        sys.exit(-1)

    spark = SparkSession.builder.master("local[*]").getOrCreate()
    sc = spark.sparkContext

    # sc = SparkContext(appName="PythonStreamingKinesisWordCountAsl")
    ssc = StreamingContext(sc, 10)
    appName, streamName, endpointUrl, regionName = sys.argv[1:]
    dstream = KinesisUtils.createStream(ssc, appName, streamName, endpointUrl, regionName, InitialPositionInStream.LATEST, 10)
    dstream.foreachRDD(printRecord)
    ssc.start()
    ssc.awaitTermination()
我对Pypark非常陌生,我正在努力了解这一切。 数据帧上的连续合并当然可能会导致内存爆炸,但堆的问题从一开始就出现了

编辑
环境:在单一ubuntu和macOS托管的cents VM上进行了尝试,没有任何更改。

操作
count()
将整个数据带到驱动程序节点,并反复执行这些操作。这能告诉你什么吗?看看
refDf
可以获得多大的容量,并与您的驱动器/本地机器的容量进行比较。正如我在最后的说明中提到的那样,我在@Pushkr得到了您的观点。但请确保它不会等到refDf像您预期的那样变大。即使是少量的堆也会爆炸。StreamingContext中的批处理间隔必须以毫秒为单位。如果需要秒,请改为写秒(10)。操作操作
count()
将整个数据带到驱动程序节点,并反复执行。这能告诉你什么吗?看看
refDf
可以获得多大的容量,并与您的驱动器/本地机器的容量进行比较。正如我在最后的说明中提到的那样,我在@Pushkr得到了您的观点。但请确保它不会等到refDf像您预期的那样变大。即使是少量的堆也会爆炸。StreamingContext中的批处理间隔必须以毫秒为单位。如果你想以秒为单位,写秒(10)。
print("        before count %s" % refDf.count())
print("        after count %s" % refDf.count())