我要求更新hashmap。在Spark作业中我有JavaPairRDD,在这个包装器中有9个不同的hashmap。每个散列映射都有大约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种不同的hashmap都使用相同的方法。我搜索了增加堆内存,但不知道如何在群集中使用它来增加火花。我的群集大小也很大(nr.300个节点)。请帮我找一些解决方案。
感谢。
答案 0 :(得分:0)
首先,我将重点关注3个参数:spark.driver.memory=45g
spark.executor.memory=6g
spark.dirver.maxResultSize=8g
不要将配置视为理所当然,这可以在我的设置中运行而不会出现OOM错误。检查UI中可用的内存量。您希望尽可能多地为执行程序提供内存。顺便说一句。 spark.driver.memory可以增加堆空间。
答案 1 :(得分:0)
据我所知,此代码在spark驱动程序上执行。我建议将这两个Hashmaps转换为包含2列imei
和timestamp
的DataFrame。然后使用imei
上的外部联接加入并使用when
选择适当的时间戳。
此代码将在工作程序上执行,并且不会遇到内存问题。如果您计划在驱动程序上执行此操作,请按照Jarek提供的说明进行操作并增加spark.driver.memory
。