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