Hashmap Over Large数据集在spark中提供OutOfMemory

时间:2016-12-08 10:01:53

标签: java apache-spark rdd

我要求更新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个节点)。请帮我找一些解决方案。

感谢。

2 个答案:

答案 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列imeitimestamp的DataFrame。然后使用imei上的外部联接加入并使用when选择适当的时间戳。 此代码将在工作程序上执行,并且不会遇到内存问题。如果您计划在驱动程序上执行此操作,请按照Jarek提供的说明进行操作并增加spark.driver.memory