Почему Hadoop нужно вводить эти новые классы? Они просто усложняют интерфейс
Почему Hadoop нуждается в таких классах, как Text или IntWritable, вместо String или Integer?
Ответ 1
Для обработки объектов в режиме Hadoop. Например, hasoop использует Text
вместо java String
. Класс Text
в hadoop похож на java String
, однако Text
реализует такие интерфейсы, как Comparable
, Writable
и WritableComparable
.
Эти интерфейсы необходимы для MapReduce; интерфейс Comparable
используется для сравнения, когда редуктор сортирует ключи, а Writable
может записать результат на локальный диск. Он не использует java Serializable
, потому что java Serializable
слишком большой или слишком тяжелый для hadoop, Writable
может сериализовать объект hadoop очень простым способом.
Ответ 2
Поскольку в большом мире данных структурированные объекты должны быть сериализованы в потоке байтов для перемещения по сети или сохранения на диске в кластере... и затем десериализоваться обратно по мере необходимости. Когда вы храните и перемещаете огромные объемы данных на такой же шкале Facebook, ваши данные должны быть эффективными и занимать как можно меньше места для хранения и времени для перемещения, насколько это возможно.
String
и Integer
просто слишком "жирные". Text
и IntWritable
, соответственно, обеспечивают намного более легкую абстракцию поверх байт-массивов, представляющих один и тот же тип информации.
Ответ 3
Дополнительная информация:
у них есть две функции, релевантные
у них есть "Writable" интерфейс - они знают, как писать в поток DataOutput и читать из потока DataInput - неявно.
у них есть обновления содержимого через операцию set(). Это позволяет повторно использовать одно и то же значение, многократно, без создания новых экземпляров. Его гораздо эффективнее, если один и тот же картограф или редуктор вызывается многократно: вы просто создаете экземпляры записываемых объектов в конструкторе и повторно используете их
В сравнении, Javas Serializable framework "волшебным образом" сериализует объекты, но делает это так, чтобы он был немного хрупким и, как правило, невозможно читать в значениях, генерируемых более старыми версиями класса. поток объектов Java предназначен для отправки графика объектов назад - он должен помнить, что все ссылки на объекты уже вытеснены, и делайте то же самое на обратном пути. Записи предназначены для самостоятельного использования.
Это от: http://hortonworks.com/community/forums/topic/why-hadoop-uses-default-longwritable-or-intwritable/
Ответ 4
Из документации Apache страница:
Интерфейс Writable
описывается как
Сериализуемый объект, который реализует простой, эффективный протокол сериализации на основе
DataInput
иDataOutput
.
С помощью этого нового API у вас нет осложнений. Процесс сериализации с этими новыми классами - crisp
и compact
.
Для эффективности Hadoop процесс сериализации/де-сериализации должен быть оптимизирован, поскольку между узлами кластера происходит огромное количество удаленных вызовов. Поэтому формат сериализации должен быть быстрым, компактным, расширяемым и совместимым. По этой причине инфраструктура Hadoop придумала один класс ввода-вывода для замены примитивных типов данных Java. например IntWritbale
для int
, LongWritable
для long
, Text
для String
и т.д.
Более подробную информацию об этой теме вы можете найти в Hadoop. Окончательное руководство: 4-е издание