В Chain
классы добавляют дополнительные Mapper
преобразования до или после Mapper
или Reducer
. Это происходит в рамках локальных вычислений на рабочем месте. В этом нет ничего, что требует, чтобы ключи и значения были сериализованы, отправлены на другую машину и снова обработаны. Это просто происходит в режиме онлайн.
Вот почему это может сбивать с толку, так как мы не привыкли к Mapper
, видя в буквальном смысле тот же вывод объекта другой операцией. Это было бы более эффективным, чтобы пройти по ссылке. Но возможно, что код предполагает, что он по стоимости, так как Hadoop работает иначе. Например, вы можете предположить, что вы можете изменить состояние ключа или объекта значения в цепочке Mapper
и очень удивляться тому, что Reducer
, прежде чем он примет это изменение. (Я думаю, что это плохой дизайн, хотя.)
Итак, этот аргумент управляет тем, что Hadoop просто сериализует и десериализует объект в любом случае - в принципе, создает клон через сериализацию. Это дополнительная работа.
Аргумент byValue
отсутствует в новых API Hadoop. По умолчанию true
, и вы можете придерживаться этого, если не знаете лучше. Если вы уверены, что не изменяете состояние объекта key/value, вы можете безопасно использовать false
и получить небольшую скорость при прохождении по ссылке.
Конечно, все это немного запутывает, так как Java всегда является языком с переходом. Но объекты никогда не передаются по значению, вместо этого ссылки на объекты передаются по значению. Конечно, в этом отношении Java не меняется.
Для меня большая честь, что г-н Оуэн нашел время ответить на мой вопрос. Это отличный ответ. Не могли бы вы также поделиться некоторыми указателями, где я могу найти более подробную информацию? –