繁体   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