簡體   English   中英

為什么我的火花流工作變慢了

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM