[英]why my spark streaming job getting slower
我有一份工作,每隔10秒從Kafka接收數據,然后我格式化數據並插入到cassandra中,但是我的工作越來越慢,這讓我很困惑。
根據我的統計數據,每10秒消息少於100條,第一次處理時間最多只需1秒,但是幾天后處理速度變慢,現在處理10秒數據需要14秒。
如果有一些因素會讓工作變慢,我感到很困惑。
而且我注意到處理python -m pyspark.daemon
也會花費越來越多的內存,是否有一些方法可以降低內存成本。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24527 yao.yu 20 0 10.334g 9.823g 3580 R 96.8 66.9 3424:56 python
代碼如下:
if __name__ == "__main__":
conf = SparkConf().setAppName("Kafka_To_Cassandra").set("spark.streaming.kafka.maxRatePerPartition", "1000")
sc = SparkContext(conf = conf)
ssc = StreamingContext(sc, 10)
brokers, topic = sys.argv[1:]
kvs = KafkaUtils.createDirectStream(ssc, [topic], {"metadata.broker.list": brokers, "auto.offset.reset": "smallest"})
lines = kvs.map(lambda x: x[1]) \
.filter(lambda s: 'identifier' in s) \
.filter(lambda s: 'app_name' in s) \
.filter(lambda s: 'app_version' in s)
map_lines = lines.map(mapper).filter(lambda s: 'JsonLoadException' not in s)
#map_lines.pprint()
map_lines.foreachRDD(lambda rdd: rdd.foreachPartition(save_to_cassandra))
ssc.start()
ssc.awaitTermination()
這個配置可能對你有幫助。
spark.cleaner.ttl
Spark將記住任何元數據(生成的階段,生成的任務等)的持續時間(秒)。 定期清理將確保忘記超過此持續時間的元數據。 這對於運行Spark很多小時/天非常有用(例如,在Spark Streaming應用程序中運行24/7)。 請注意,在內存中持續時間超過此持續時間的任何RDD也將被清除。
最后,我使用Scala再次編寫我的代碼,使用Spark-Cassandra-Connector 。
我確信Cassandra的連接花費了大量內存,因此使用foreachRDD的官方Doc of Spark Streaming Design Patterns建議您創建一個連接池,這樣您就不必每次為每個RDD或foreachPartition構建連接。 但我不知道如何使python-cassandra-driver支持它。
我使用Scala重構我的代碼,Spark-Cassandra-Connector非常好地支持Spark Streaming。 然后我的工作穩定工作了幾個星期甚至幾個月而沒有內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.