Доступ к статическим c HashMap внешним классам картографа / редуктора в mapreduce - PullRequest
0 голосов
/ 31 января 2020

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

public class MyClass {
    static HashMap<String, Integer> temp = new HashMap<String, Integer>();

    public static class Map1 extends Mapper<LongWritable, Text, Text, IntWritable> {
        public void map(LongWritable key, Text value, Context context) {
            temp.put("1", 1);
        }
    }

    public static class Reduce1 extends Reducer<Text, IntWritable, Text, Text> {

        @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context) {
            Iterator it = temp.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>)it.next();
                String key = pair.getKey();
                String val = Integer.toString(pair.getValue());
                context.write(new Text(key), new Text(val));
            }
        }
    }

Компилируется нормально, но выход редуктора пустой. Я не очень хорош в Java, поэтому я не совсем уверен, что здесь происходит.

1 Ответ

0 голосов
/ 02 февраля 2020

Вы неправильно понимаете, что MapReduce - это распределенный алгоритм, работающий среди множества процессов и, возможно, машин.

Каждый новый экземпляр MyClass, созданный в ходе этого процесса, будет пустым и не будет использоваться как часть жизненного цикла приложения.

Плюс, ваш картограф ничего не делает. Чтобы отправить данные в редуктор, используйте context.write.

. См. Официальную документацию Had oop для кода WordCount.

...