[英]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列imei
和timestamp
DataFrames。 然后在imei
上使用外部imei
將兩者imei
並使用when
選擇適當的時間戳。 該代碼將在工作程序上執行,並使其並行化,因此您不會遇到內存問題。 如果您打算真正在驅動程序上執行此操作,請按照Jarek給出的說明進行操作,並增加spark.driver.memory
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.