簡體   English   中英

Hashmap Over Large數據集,在火花中提供OutOfMemory

[英]Hashmap Over Large dataset giving OutOfMemory in spark

我需要更新哈希圖。 在Spark作業中,我具有JavaPairRDD,並且在此包裝器中具有9個不同的哈希圖。 每個哈希圖的密鑰接近40-50 cr。 合並兩個映射(spark中的ReduceByKey)時,我收到Java堆內存OutOfMemory異常。 下面是代碼片段。

 private HashMap<String, Long> getMergedMapNew(HashMap<String, Long> oldMap, 
    HashMap<String, Long> newMap)  {
    for (Entry<String, Long> entry : newMap.entrySet()) {
        try {
            String imei = entry.getKey();
            Long oldTimeStamp = oldMap.get(imei);
            Long newTimeStamp = entry.getValue();

            if (oldTimeStamp != null && newTimeStamp != null) {
                if (oldTimeStamp < newTimeStamp) {
                    oldMap.put(imei, newTimeStamp);
                } else {
                    oldMap.put(imei, oldTimeStamp);
                }

            } else if (oldTimeStamp == null) {
                oldMap.put(imei, newTimeStamp);
            } else if (newTimeStamp == null) {
                oldMap.put(imei, oldTimeStamp);
            }
        } catch (Exception e) {
            logger.error("{}", Utils.getStackTrace(e));
        }
    }
    return oldMap;
}  

此方法適用於小型數據集,但不適用於大型數據集。 所有9個不同的哈希圖都使用相同的方法。 我搜索了增加的堆內存,但不知道如何在堆中工作時增加火花。 我的群集大小也很大(300個節點)。 請幫助我找出一些解決方案。

謝謝。

首先,我將重點放在3個參數上: spark.driver.memory=45g spark.executor.memory=6g spark.dirver.maxResultSize=8g不要將配置spark.dirver.maxResultSize=8g理所當然,這是我在沒有OOM的情況下所做的工作錯誤。 檢查UI中有多少可用內存。 您想給執行者更多的記憶。 順便說一句 spark.driver.memory啟用更多堆空間。

據我所知,此代碼在spark驅動程序上執行。 我建議將這兩個Hashmap轉換為具有2列imeitimestamp DataFrames。 然后在imei上使用外部imei 兩者imei並使用when選擇適當的時間戳。 該代碼將在工作程序上執行,並使其並行化,因此您不會遇到內存問題。 如果您打算真正在驅動程序上執行此操作,請按照Jarek給出的說明進行操作,並增加spark.driver.memory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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