2016-02-21 3 views
2

Я пытаюсь читать несколько строк в mapper. Для этого я начал использовать класс NLineInputFormat. При использовании этого я получаю GC предельную ошибку. Для справки, код ошибки:Верхний предел GC превышен с использованием NLineInputFormat

16/02/21 01:37:13 INFO mapreduce.Job: map 0% reduce 0% 
16/02/21 01:37:38 WARN mapred.LocalJobRunner: job_local726191039_0001 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1019) 
at java.util.concurrent.ConcurrentHashMap.putAll(ConcurrentHashMap.java:1084) 
at java.util.concurrent.ConcurrentHashMap.<init>(ConcurrentHashMap.java:852) 
at org.apache.hadoop.conf.Configuration.<init>(Configuration.java:713) 
at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:442) 
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.<init>(LocalJobRunner.java:217) 
at org.apache.hadoop.mapred.LocalJobRunner$Job.getMapTaskRunnables(LocalJobRunner.java:272) 
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:517) 
16/02/21 01:37:39 INFO mapreduce.Job: Job job_local726191039_0001 failed with state FAILED due to: NA 

Для справки, пожалуйста, найдите фрагмент кода ниже.

public class JobLauncher { 
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 
     Configuration conf = new Configuration(); 
     Job job = Job.getInstance(conf, "TestDemo"); 
     job.setJarByClass(JobLauncher.class); 

     job.setMapperClass(CSVMapper.class); 
     job.setMapOutputKeyClass(NullWritable.class); 
     job.setMapOutputValueClass(NullWritable.class); 

     conf.setInt(NLineInputFormat.LINES_PER_MAP, 3); 
     job.setInputFormatClass(NLineInputFormat.class); 
     NLineInputFormat.addInputPath(job, new Path(args[0])); 

     job.setNumReduceTasks(0); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 
     System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
} 

У меня просто простой CSVMapper картограф. Почему я получаю эту ошибку? Пожалуйста, помогите мне решить эту ошибку.

Заранее спасибо.

+0

Насколько велик ваш файл? –

ответ

1

Why I am getting this error?

В целом, наиболее вероятные объяснения в OOME, что вы исчерпали памяти, потому что

  • ваш код имеет утечку памяти, или
  • вы не достаточно памяти для того, что вы пытаетесь сделать/, как вы пытаетесь это сделать.

(С этой конкретной «аромат» из OOME, вы не полностью запустить из памяти. Однако, по всей вероятности, вы близки к исчерпанию, и что стало причиной использования GC процессора пронзать , превышая пороговое значение «GC overhead». Эта деталь не изменяет способ, которым вы должны попытаться решить вашу проблему.)

В вашем случае это похоже на ошибку, возникающую при загрузке ввода из файла в отображение (или набор карт). Следовательно, вывод состоит в том, что вы сказали Hadoop, чтобы загружать больше данных, чем собирался вписываться в память за один раз.

Please help me resolve this error.

Решения:

  • Снизить размер входного файла; например перерыв вашей проблемы в меньшие проблемы
  • Увеличьте объем памяти (в частности, размер кучи Java) для затронутых JVM (ов).
  • Измените приложение, чтобы задание передавало данные из файла (или из HFS) самостоятельно ... вместо того, чтобы загружать CSV в карту.

Если вам нужен более конкретный ответ, вам необходимо предоставить более подробную информацию.

+0

Спасибо @stephen. Но я хочу знать, почему я получаю эту ошибку в этой ситуации. Я уже предоставил фрагмент кода и т. Д. Пожалуйста, дайте мне знать, какие детали вы хотите знать. –

+0

1) Это объяснено; см. выше. Я думаю, что ваш входной файл слишком велик, ваша куча слишком мала или вы не должны предварительно загружать весь CSV. 2) Скажите мне/нам, насколько велик входной файл, и дайте подробную информацию, чтобы мы могли понять, почему вам нужно предварительно загрузить весь CSV. –

+0

Размер входного файла составляет 30 МБ. Я увеличил размер кучи до 4 ГБ. Тем не менее, я получаю эту ошибку. –

0

Добавление к Stephen C ответ, в котором перечислены возможные решения

От оракула документации link,

Исключение в нити THREAD_NAME: java.lang.OutOfMemoryError: GC Верхний предел превышен

Cause: The detail message "GC overhead limit exceeded" indicates that the garbage collector is running all the time and Java program is making very slow progress. After a garbage collection, if the Java process is spending more than approximately 98% of its time doing garbage collection and if it is recovering less than 2% of the heap and has been doing so far the last 5 (compile time constant) consecutive garbage collections, then a java.lang.OutOfMemoryError is thrown.

This exception is typically thrown because the amount of live data barely fits into the Java heap having little free space for new allocations.

Action: Increase the heap size. The java.lang.OutOfMemoryError exception for GC Overhead limit exceeded can be turned off with the command line flag -XX:-UseGCOverheadLimit.

Посмотрите на этот вопрос SE для лучшей обработки этой ошибки:

java.lang.OutOfMemoryError: GC overhead limit exceeded

+0

Это общее описание ошибки. Но я хочу знать, почему эта ошибка возникла в случае работы Hadoop MR. –

+0

Вы должны указать 1) параметры JVM 2) размер входных данных для определения проблемы. –

+0

Размер входного файла составляет 30 МБ. Я увеличил размер кучи до 4 ГБ. Тем не менее, я получаю эту ошибку –

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