Apache spark PypSpark从运动中流出杀死堆
运行示例应用程序从kinesis流式传输数据。我不明白为什么这个应用程序使用这么多堆和崩溃 代码如下: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
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())