Hadoop и повторно используемые изменяемые поля для записи - PullRequest
1 голос
/ 06 ноября 2019

Вот фрагмент из реализации задания по подсчету слов, опубликованного из учебника Apache

public static class TokenizerMapper  extends Mapper<Object, Text, Text, IntWritable>{
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
    ) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(word, one);
        }
    }
}

Есть ли какая-либо польза от повторного использования поля Text word?

Я видел, как это делается во многих программах Hadoop, создание такого класса настолько тяжело, что повторное использование приводит к повышению производительности. Если нет, то почему люди это делают, а не что-то вроде context.write(new Text(itr.nextToken()), one);

1 Ответ

1 голос
/ 07 ноября 2019

Вы правы в том, что создание экземпляра объекта Text не является тяжелым. Однако, если вы обрабатываете миллиарды записей, вам нужно сбрасывать каждую возможную наносекунду за запись. Каждый раз, когда вы создаете новый объект Text, Java должна выделить для него память, отслеживать его, а затем собирать мусор в какой-то момент. Это время действительно может сложиться в большую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...