Hadoop - WordCount работает нормально, но другой пример застревает - PullRequest
0 голосов
/ 05 января 2019

Я запустил WordCount на одном узле на моем Mac, и это сработало, поэтому я создал другое приложение MapReduce и запустил его, но оно застряло на map 10% reduce 0%, а иногда на map 0% reduce 0%. Код приложения, которое я сделал:

public class TemperatureMaximale {

    public static class TemperatureMapper extends Mapper<Object, Text, Text, IntWritable>{

        private Text city = new Text();
        private IntWritable temperature = new IntWritable();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                String line = itr.nextToken();
                String cityStr = line.split(",")[0];
                int temperatureInt = Integer.parseInt(line.split(",")[1].replaceAll("\\s+", ""));
                city.set(cityStr);
                temperature.set(temperatureInt);
                context.write(city, temperature);

            }
        }

    }

    public static class TemperatureReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int maxValue = Integer.MIN_VALUE; 
            for (IntWritable value : values) {
                maxValue = Math.max(maxValue, value.get());
            }
            result.set(maxValue);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "temperature");
        job.setJarByClass(TemperatureMaximale.class);
        job.setMapperClass(TemperatureMapper.class);
        job.setCombinerClass(TemperatureReducer.class);
        job.setReducerClass(TemperatureReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[1]));
        FileOutputFormat.setOutputPath(job, new Path(args[2]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
} 

Я понятия не имею, почему это не работает, так как это в основном копия WordCount, я просто делаю несколько различных операций над картой и сокращаю методы.

Пример файлов, которые я использую в качестве ввода:

Toronto, 20
Whitby, 25
New York, 22
Rome, 32

1 Ответ

0 голосов
/ 05 января 2019

Я понял, что это просто нехватка памяти для выполнения задания. Если вы выполните hadoop job -list, вы увидите необходимую память для выполнения задания. В моем случае это было 4096M. Поэтому я закрыл все остальные приложения, и все задания работали нормально.

Вы также можете решить эту настройку YARN в mapred-site.xml, чтобы выделить меньше памяти для работы следующим образом:

<property>
  <name>mapreduce.map.memory.mb</name>
  <value>1024</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>1024</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx1638m</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx3278m</value>
</property>

mapreduce.map.memory.mb и mapreduce.reduce.memory.mb устанавливают пределы физической памяти контейнера YARN для вашей карты и сокращают процессы соответственно.

mapreduce.map.java.opts и mapreduce.reduce.java.opts устанавливают размер кучи JVM для вашей карты и сокращают процессы соответственно. Как правило, они должны составлять 80% от размера настроек физической памяти YARN.

...