2016-12-08 3 views
0

У меня есть требование обновления hashmap. В работе Spark у меня есть JavaPairRDD, и в этой оболочке имеется 9 разных хэш-карт. Каждый хэш-файл имеет ключ около 40-50 ключей cr. При слиянии двух карт (ReduceByKey in spark) я получаю исключение OutOfMemory памяти кучи Java. Ниже приведен фрагмент кода.Hashmap Over Большой набор данных, дающий 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 узлов). Пожалуйста, помогите мне найти некоторые решения.

Спасибо.

ответ

0

Во-первых, я бы сосредоточиться на 3-х параметров: spark.driver.memory=45gspark.executor.memory=6gspark.dirver.maxResultSize=8g Не берите конфиг само собой разумеющееся, это то, что работает на моем установить без ошибок OOM. Проверьте, сколько доступной памяти вы используете в пользовательском интерфейсе. Вы хотите предоставить исполнителям столько памяти, сколько сможете. Кстати. spark.driver.memory позволяет больше места для кучи.

0

Насколько я вижу, этот код выполнен на искровом драйвере. Я бы рекомендовал преобразовать эти два Hashmaps в DataFrames с 2 столбцами imei и timestamp. Затем присоедините, используя внешнее соединение на imei и выберите подходящие временные метки, используя when. Этот код будет выполняться на рабочих, быть парализованным и, следовательно, вы не столкнетесь с проблемами памяти. Если вы планируете действительно сделать это на драйвере, следуйте инструкциям, данным Jarek, и увеличьте spark.driver.memory.

 Смежные вопросы

  • Нет связанных вопросов^_^