你好,
我想知道如果任何人都可以給我任何的見解關於內存使用和我怎麼能改變我的代碼“釋放”一些內存運行的代碼。我用一個磚筆記本。
基本上,我們需要做的是執行一個查詢,創建一個sql dataframe火花並轉換為熊貓(是的,我知道熊貓並不是最好的,但現在要做)。代碼的方法是設置一個循環的形式調用一個函數來執行每個查詢的步驟是根據用戶請求。查詢的數量可能有所不同。
我的問題是,每一次的函數被調用時,我看到內存使用量的增加。我期望的內存會下降一個循環完成後,但它沒有。它不會隻漲不跌,釋放。似乎當它達到約100 - 120 gb,然後它開始峰回到100 gb的基線。這是一個很小的例子:
熊貓作為pd def create_query導入(查詢):query_spark_df = spark.sql(查詢)query_df_pd = query_spark_df.toPandas () query_df_pd [' col1 '] = query_df_pd [' col1 '] .astype (Int16) query_df_pd [' col2 '] = query_df_pd [' col2 '] .astype (Int16) query_df_pd [' col3 '] = query_df_pd [' col3 '] .astype (int32) #其他預處理步驟# #返回query_df_pd query_list = [query_1, query_2]在query_list查詢:測試= create_query(查詢)
我試著:
問題是,經過一天的用戶,我們使用集群,我們看起來像這樣:
在下圖中,黑色的箭頭演示開始新工作時:
唯一的選擇似乎使使用內存下降spark.stop()但是我不能使用這個循環的中間或最後的代碼可能會有其他工作同時運行。
有什麼火花選項,我可以添加到我的“循環”(或者至少到最後我的代碼),清理內存使用?正如我提到的,GC收集沒有影響。我應該使用不同的功能?任何Python最佳實踐,我錯過什麼?任何幫助都是感激。
@Juliana Negrini——你能多次調用以下方法直到你看到內存讓減少清除內存嗎?
def NukeAllCaching(表名:選項[String] = None):單位={表名。= > com.databricks.sql.transaction.tahoe.DeltaValidation地圖{路徑。在validateCache(spark, path) } spark.conf.set("spark.databricks.io.cache.enabled", "false") spark.conf.set("spark.databricks.delta.smallTable.cache.enabled", "false") spark.conf.set("spark.databricks.delta.stats.localCache.maxNumFiles", "1") spark.conf.set("spark.databricks.delta.fastQueryPath.dataskipping.checkpointCache.enabled", "false") com.databricks.sql.transaction.tahoe.DeltaLog.clearCache() spark.sql("CLEAR CACHE") sqlContext.clearCache() } NukeAllCaching()
上麵的解決方案是一種補丁,需要多次調用。最理想的方法是分析你的代碼是否寫的高效性能,內存使用情況和可用性。