asu-cs.donntu.orgasu-cs.donntu.org/sites/default/files/images/doc/hadoop_podrobnoe... · Nutch....

672

Transcript of asu-cs.donntu.orgasu-cs.donntu.org/sites/default/files/images/doc/hadoop_podrobnoe... · Nutch....

  • ББК 32.988.02 УДК 004.438.5 У13

    Уайт Т.У13 Hadoop: Подробное руководство. — СПб.: Питер, 2013. — 672 с.: ил. — (Серия «Бест

    селлеры O’Reilly»).

    ISBN 9785496006620Apache Hadoop — фреймворк с открытым исходным кодом, в котором реализована вычисли

    тельная парадигма, известная как MapReduce, позволившая Google построить свою империю. Эта книга покажет вам, как использовать всю мощь Hadoop, чтобы создавать надежные, масштабируемые, распределенные системы и обрабатывать гигантские наборы данных. Программисты найдут здесь методики анализа, администраторы узнают, как установить и запустить кластеры Hadoop. Если вы работаете с большими массивами данных, гигабайтами или петабайтами информации, то Hadoop — это идеальное решение. «Hadoop: Подробное руководство» — книга, в которой досконально и доступно описаны все возможности Apache Hadoop. Издание охватывает последние изменения Hadoop, в том числе материалы по новой исполнительной среде MapReduce, называемой MapReduce 2, которая реализована на базе системы YARN (Yet Another Resource Negotiator) — общей системы управления ресурсами для распределенных приложений.

    12+ (Для детей старше 12 лет. В соответствии с Федеральным законом от 29 декабря 2010 г. № 436ФЗ.)

    ББК 32.988.02 УДК 004.438.5

    Права на издание получены по соглашению с O’Reilly. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги.

    ISBN 9781449311520 англ. © 2013, Piter Inter Ltd. Authorized Russian translation of the English edition of Hadoop: The Definitive Guide, 3rd Edition (ISBN 9781449311520) © 2012 Tom White. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

    ISBN 9785496006620 © Перевод на русский язык ООО Издательство «Питер», 2013 © Издание на русском языке, оформление ООО Издательство «Питер», 2013

  • Краткое содержание

    Предисловие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19

    Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21

    Глава 1. Знакомство с Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27

    Глава 2. MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

    Глава 3. HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79

    Глава 4. Ввод/вывод в Hadoop .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . ..125

    Глава 5. Разработка приложений MapReduce. . . . . . . . . . . . . . . . . . 202

    Глава 6. Как работает MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

  • 6 Краткое.содержание

    Глава 7. Типы и форматы MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

    Глава 8. Дополнительные возможности MapReduce. . . . . . . . 337

    Глава 9. Создание кластера Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384

    Глава 10. Администрирование Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

    Глава 11. Pig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467

    Глава 12. Hive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523

    Глава 13. HBase. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577

    Глава 14. ZooKeeper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607

    Глава 15. Sqoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647

  • Содержание

    Предисловие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19

    Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21

    Замечания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22

    О.чем.рассказано.в.книге? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

    Что.нового.во.втором.издании?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

    Что.нового.в.третьем.издании? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

    Использование.примеров.кода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24

    Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25

    От.издательства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26

    Глава 1. Знакомство с Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27

    Данные!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27

    Хранение.и.анализ.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29

    Сравнение.с.другими.системами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30

  • 8 Содержание

    Hadoop.и.РСУБД . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31

    Распределенные.вычисления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34

    Добровольные.вычисления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35

    Краткая.история.Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36

    Apache.Hadoop.и.экосистема.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41Выпуски.Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42О.чем.рассказано.в.книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44Имена.конфигураций. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44MapReduce.API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45Совместимость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45

    Глава 2. MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

    Набор.метеорологических.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

    Формат.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48Анализ.данных.средствами.Unix. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49

    Анализ.данных.в.Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51

    Отображение.и.свертка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51Программа.MapReduce.на.языке.Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53Тестовый.запуск . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57

    MapReduce.в.перспективе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63

    Поток.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64Комбинирующие.функции .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .68Определение.комбинирующей.функции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69Выполнение.распределенного.задания.MapReduce . . . . . . . . . . . . . . . . . . . . .70

    Hadoop.Streaming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71

    Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74Hadoop.Pipes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .75Компилирование.и.запуск. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77

    Глава 3. HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79

    Строение.HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80

    Основные.концепции.HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81

    Блоки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81Узлы.имен.и.узлы.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83

  • Содержание. . . 9

    HDFS.Federation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84Высокая.доступность.HDFS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85Преодоление.сбоев.и.изоляция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86

    Интерфейс.командной.строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87

    Основные.операции.файловой.системы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88Файловые.системы.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90Интерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93

    Интерфейс.Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95

    Чтение.данных.Hadoop.по.URL-адресу. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95Чтение.данных.с.использованием.Filesystem.API. . . . . . . . . . . . . . . . . . . . . . . . .97Запись.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100Получение.информации.от.файловой.системы . . . . . . . . . . . . . . . . . . . . . . . . 103Удаление.данных .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . ..109

    Поток.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

    Чтение.файла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109Запись.в.файлы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113Модель.целостности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    Перемещение.данных:.Flume.и.Sqoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

    Параллельное.копирование.с.использованием.distcp . . . . . . . . . . . . . . . . . . . . 118

    Сбалансированность.кластеров.HDFS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    HAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    Использование.HAR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

    Ограничения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    Глава 4. Ввод/вывод в Hadoop .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . ..125

    Целостность.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    Целостность.данных.в.HDFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126LocalFileSystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127ChecksumFileSystem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

    Сжатие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

    Кодеки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130Сжатие.и.разбиение.входных.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Использование.сжатия.в.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

    Сериализация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

    Интерфейс.Writable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

  • 10 Содержание

    Классы.Writable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144Пользовательские.реализации.Writable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Программные.среды.сериализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

    Avro .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . ..161

    Типы.данных.и.схемы.Avro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162Сериализация.и.десериализация.в.памяти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166Файлы.данных.Avro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Совместимость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172Преобразование.схемы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175Порядок.сортировки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Avro.и.MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179Сортировка.с.использованием.Avro.MapReduce . . . . . . . . . . . . . . . . . . . . . . . 183Avro.MapReduce.в.других.языках . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    Файловые.структуры.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    SequenceFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186Запись.SequenceFile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187Чтение.из.SequenceFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189MapFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

    Глава 5. Разработка приложений MapReduce. . . . . . . . . . . . . . . . . . 202

    API.конфигурации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    Объединение.ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204Расширение.переменных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

    Настройка.среды.разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

    Управление.конфигурацией. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

    GenericOptionsParser,.Tool.и.ToolRunner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

    Написание.модульных.тестов.с.MRUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

    Функция.отображения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Функция.свертки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

    Локальное.выполнение.с.тестовыми.данными . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

    Локальный.запуск.задания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219Тестирование.управляющей.программы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

    Запуск.в.кластере. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

    Упаковка.задания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Запуск.задания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

  • Содержание.. . . 11

    Веб-интерфейс.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Получение.результатов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232Отладка.задания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Журналы.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Удаленная.отладка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

    Оптимизация.задания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

    Профилирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

    Модель.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

    Разложение.задачи.на.задания.MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248JobControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249Apache.Oozie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250Определение.потока.операций.Oozie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

    Глава 6. Как работает MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

    Выполнение.задания.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

    Классическая.реализация.MapReduce.(MapReduce.1) . . . . . . . . . . . . . . . . 257Отправка.заданий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258YARN.(MapReduce.2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

    Сбои . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

    Сбои.в.классической.модели.MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Сбои.в.YARN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

    Планирование.заданий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

    Fair.Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Capacity.Scheduler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

    Тасовка.и.сортировка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

    На.стороне.отображения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279На.стороне.свертки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281Настройка.конфигурации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

    Выполнение.задач . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

    Среда.выполнения.задач . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287Спекулятивное.выполнение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288OutputCommitter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Файлы.побочных.эффектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292Повторное.использование.JVM.задач. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292Пропуск.некорректных.записей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

  • 12 Содержание

    Глава 7. Типы и форматы MapReduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

    Типы.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

    Задание.MapReduce.по.умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

    Форматы.входных.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

    Входные.сплиты.и.записи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309FileInputFormat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311Входные.пути.FileInputFormat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311Текстовые.входные.данные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322Двоичные.входные.данные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326Множественные.источники.входных.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Операции.ввода.(и.вывода).с.базами.данных . . . . . . . . . . . . . . . . . . . . . . . . . . 329

    Форматы.выходных.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

    Текстовые.выходные.данные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Двоичные.выходные.данные. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Множественный.вывод. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331Отложенный.вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336Вывод.в.базы.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

    Глава 8. Дополнительные возможности MapReduce. . . . . . . . 337

    Счетчики. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

    Встроенные.счетчики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338Счетчики.Java,.определяемые.пользователем . . . . . . . . . . . . . . . . . . . . . . . . . 344Пользовательские.счетчики.в.Streaming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349

    Сортировка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350

    Подготовка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350Частичная.сортировка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351Полная.сортировка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357Вторичная.сортировка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

    Соединения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368

    Соединения.на.стороне.отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369Соединения.на.стороне.свертки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370

    Распространение.побочных.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

    Использование.конфигурации.задания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375Распределенный.кэш . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

    Библиотечные.классы.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

  • Содержание.. . . 13

    Глава 9. Создание кластера Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384

    Оборудование.кластера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384

    Сетевая.топология. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387

    Настройка.и.установка.кластера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

    Установка.Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389Создание.пользователя.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390Установка.Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390Тестирование.установки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

    Конфигурация.SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

    Конфигурация.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392

    Управление.конфигурацией . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393Настройки.окружения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396Важные.свойства.демонов.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401Адреса.и.порты.демонов.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407Другие.свойства.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408Создание.учетных.записей.пользователей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412

    Конфигурация.YARN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412

    Важные.свойства.демонов.YARN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413Адреса.и.порты.демонов.YARN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417

    Безопасность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419

    Kerberos.и.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420Маркеры.делегирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423Другие.улучшения.в.области.безопасности . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424

    Тестирование.кластера.Hadoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426

    Пользовательские.задания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429

    Hadoop.в.облаке. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429

    Apache.Whirr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430

    Глава 10. Администрирование Hadoop . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

    HDFS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

    Дисковые.структуры.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435Безопасный.режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441Журналы.аудита . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443Инструменты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444

  • 14 Содержание

    Мониторинг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450

    Ведение.журналов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450Метрики. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451

    Сопровождение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458

    Стандартные.административные.процедуры . . . . . . . . . . . . . . . . . . . . . . . . . . 458Включение.и.исключение.узлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459Обновления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463

    Глава 11. Pig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467

    Установка.и.запуск.Pig. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469

    Режимы.исполнения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469Запуск.программ.Pig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471Grunt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471Редакторы.Pig.Latin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472

    Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472

    Генерирование.примеров. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475

    Сравнение.с.базами.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477

    Pig.Latin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478

    Структура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478Инструкции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479Выражение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485Типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487Схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489Функции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494Макросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496

    Пользовательские.функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498

    Фильтрующая.пользовательская.функция. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498Вычисляющая.пользовательская.функция. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502Пользовательская.функция.загрузки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504

    Операторы.обработки.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508

    Загрузка.и.сохранение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508Фильтрация.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508Группировка.и.соединение.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512Сортировка.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518Комбинирование.и.разбиение.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518

    Практическое.использование.Pig. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519

  • Содержание. . . 15

    Параллелизм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Подстановка.параметров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520

    Глава 12. Hive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523

    Установка.Hive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524

    Оболочка.Hive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525

    Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526

    Администрирование.Hive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528

    Настройка.конфигурации.Hive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Сервисные.функции.Hive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530Метахранилище . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

    Сравнение.с.традиционными.базами.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535

    Проверка.схемы.при.чтении.и.записи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536Обновления,.транзакции.и.индексы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536HiveQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537Типы.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539Операторы.и.функции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542

    Таблицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543

    Управляемые.и.внешние.таблицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543Разделы.и.гнезда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545Форматы.хранения.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Импортирование.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557Модификация.таблиц . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559Удаление.таблиц. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560

    Запросы.к.данным . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560

    Сортировка.и.агрегирование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560Сценарии.MapReduce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561Подзапросы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566

    Пользовательские.функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568

    Написание.пользовательской.функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570Написание.UDAF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572

    Глава 13. HBase. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577

    Знакомство.с.HBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577

    История . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578

  • 16 Содержание

    Концепции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578

    Краткий.обзор.модели.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578Реализация .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . ..580

    Установка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583

    Пробный.запуск . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584

    Клиенты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586

    Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586Avro,.REST.и.Thrift. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591

    Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592

    Схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Загрузка.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Веб-запросы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597

    HBase.и.РСУБД. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600

    Масштабирование.успешного.сервиса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601HBase. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603Пример.из.практики:.HBase.в.Streamy .com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603Переход.на.HBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605

    Глава 14. ZooKeeper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607

    Установка.и.запуск.ZooKeeper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609

    Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611

    Реализация.списка.принадлежности.в.ZooKeeper . . . . . . . . . . . . . . . . . . . . . 611Создание.группы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612Присоединение.к.группе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614Вывод.списка.участников.группы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616Удаление.группы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618

    Сервис.ZooKeeper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619

    Модель.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619Операции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622Реализация .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . .. . ..627Согласованность.данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628Сеансы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630Состояния. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632

    Построение.приложений.с.использованием.ZooKeeper . . . . . . . . . . . . . . . . . . 633

    Конфигурация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633Отказоустойчивое.приложение.ZooKeeper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637

  • Содержание. . . 17

    Блокировка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641Другие.распределенные.структуры.данных.и.протоколы. . . . . . . . . . . . . . 643

    Практическое.использование.ZooKeeper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644

    Надежность.и.производительность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644Конфигурация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645

    Глава 15. Sqoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647

    Установка.и.запуск.Sqoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647

    Коннекторы.Sqoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649

    Пример.импортирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649

    Текстовые.и.двоичные.форматы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652

    Сгенерированный.код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653

    Другие.системы.сериализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653

    Подробнее.об.импортировании . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654

    Управление.импортированием. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656Импортирование.и.согласованность.данных . . . . . . . . . . . . . . . . . . . . . . . . . . . 656Прямое.импортирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657

    Работа.с.импортированными.данными . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657

    Импортирование.данных.и.Hive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658Импортирование.больших.объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661

    Экспортирование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663

    Подробнее.об.экспортировании . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665Экспортирование.и.транзакционность. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666Экспортирование.и.SequenceFile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667

  • Предисловие

    Hadoop начинался с проекта Nutch. Группа разработчиков попыталась построить систему вебпоиска с открытым кодом, однако проблемы с обработкой данных стали возникать даже на относительно небольшом множестве компьютеров. После того как компания Google опубликовала статьи о GFS и MapReduce, направление работы прояснилось. Системы Google разрабатывались для решения именно тех проблем, которые у нас возникали с Nutch. И тогда мы — два разработчика — начали в свободное время работать над воссозданием этих систем как составной части Nutch.

    Мы коекак заставили Nutch работать на 20 машинах, но вскоре стало ясно, что в огромных масштабах Web речь идет о выполнении на тысячах компьютеров, и что еще важнее — объем работы был слишком большим для двух программистов с неполным рабочим временем.

    Примерно в это же время компания Yahoo! заинтересовалась проектом и быстро собрала группу, к которой присоединился я. Мы выделили часть Nutch, относящуюся к распределенным вычислениям, в отдельный подпроект, который получил название «Hadoop». При поддержке Yahoo! проект Hadoop вскоре превратился в технологию, действительно способную работать в масштабах Web.

    В 2006 году к работе над Hadoop присоединился Том Уайт. Я уже был знаком с Томом по отличной статье, которую он написал о Nutch, и знал, что он умеет четко и ясно излагать сложные идеи. Вскоре выяснилось, что его программный код читается так же легко, как его тексты.

  • 20 .Предисловие

    С самого начала вклад Тома в Hadoop отражал его заботу о пользователях и проекте. В отличие от многих участников проектов с открытым кодом, Том стремился не подстроить систему под свои собственные потребности, а прежде всего упростить ее использование всеми остальными.

    Сначала Том специализировался на обеспечении нормальной работы Hadoop на серверах Amazon EC2 и S3. В дальнейшем он занимался разнообразными задачами, включая усовершенствование MapReduce API, доработку нашего вебсайта и проектирование инфраструктуры сериализации объектов. При этом Том представлял свои идеи с неизменной точностью. Вскоре Том получил роль ответственного участника (committer), а по прошествии некоторого времени вошел в комитет по управлению проектом Hadoop.

    Сейчас Том является авторитетным руководителем сообщества разработчиков Hadoop. Хотя он превосходно разбирается во многих технических тонкостях проекта, его основная специальность — делать Hadoop простым для понимания и использования.

    Поэтому я очень обрадовался, когда узнал, что Том собирается написать книгу о Hadoop. Разве ктонибудь справится с этим делом лучше него? Теперь вы можете узнать о Hadoop от настоящего мастера — блестяще владеющего не только технологией, но и здравым смыслом и умением объяснять.

    Дуг Каттинг Калифорния

  • Введение

    Мартин Гарднер, автор многих книг по математике и популярной науке, однажды сказал в интервью:

    «Я не чувствую себя уверенно ни в чем, кроме вычислений. И в этом кроется секрет успеха моей рубрики. Я так долго разбирался в том, о чем пишу, что в итоге я понимаю, как сделать свои тексты понятными для большинства читателей»1.

    Во многих отношениях я точно так же отношусь к Hadoop. Внутренние механизмы Hadoop сложны; они основываются на сочетании теории распределенных систем, инженерной практике и здравом смысле. И непосвященному Hadoop кажется чемто недоступным для понимания.

    Но это совершенно необязательно. В сущности, инструменты, предоставляемые Hadoop для построения распределенных систем (хранение данных, анализ данных и координация), достаточно просты. Причем если между ними и существует сходство, то это повышение уровня абстракции с целью создания структурных элементов для программистов, которым требуется хранить или анализировать большие объемы данных или координировать работу множества машин, но которые не имеют времени, квалификации или желания становиться экспертами в области

    1 «The science of fun», Alex Bellos, The Guardian, May 31, 2008, http://www.guardian.co.uk/science/2008/may/31/maths.science.

  • 22 Введение

    распределенных систем для самостоятельного построения инфраструктуры, решающей эти задачи.

    Когда я только начал использовать Hadoop, мне казалось совершенно очевидным, что с такими простыми и универсальными возможностями Hadoop заслуживает широкого применения. Однако в то время (в начале 2006 года) настройка и написание программ, использующих Hadoop, оставались искусством. Бесспорно, ситуация с того времени улучшилась: стало больше документации, стало больше примеров, появились рассылки, в которые можно обратиться с вопросами. И все же самая большая проблема у новичков — понять, на что способна эта технология, каковы ее преимущества и как ее использовать. Вот почему я написал эту книгу.

    Сообщество Apache Hadoop прошло долгий путь. За три года проект Hadoop расцвел и породил с полдюжины подпроектов. В это время были достигнуты качественные улучшения производительности, надежности, масштабируемости и управляемости продукта. Тем не менее я считаю, что для еще более широкого распространения Hadoop необходимо сделать еще проще в использовании. Для этого придется написать новые инструменты, обеспечить интеграцию с новыми системами и разработать новые, улучшенные API. Я с нетерпением жду возможности поучаствовать в этой работе и надеюсь, что эта книга поможет подключиться к ней другим разработчикам.

    Замечания

    При обсуждении конкретного класса Java я часто опускаю имя пакета, чтобы не загромождать текст. Если вам потребуется узнать, в каком пакете находится класс, обратитесь к документации Hadoop по Java API для соответствующего проекта; ссылка на нее находится на домашней странице Apache Hadoop по адресу http://hadoop.apache.org/. Если вы работаете в интегрированной среде разработки (IDE), воспользуйтесь механизмом автозаполнения.

    Хотя это и не соответствует обычным стилевым рекомендациям, в листингах программ, импортирующих несколько классов из одного пакета, для экономии места может использоваться универсальный символ * (например, import org.apache.hadoop.io.*).

    Примеры программ, приведенные в книге, можно загрузить на вебсайте книги по адресу http://www.hadoopbook.com/. Там же находятся инструкции по получению наборов данных, используемых в примерах, дополнительные комментарии по поводу запуска приведенных программ, ссылки на обновления, дополнительные ресурсы и мой блог.

  • О.чем.рассказано.в.книге?. . . 23

    О чем рассказано в книге?

    В главе 1 объясняется необходимость создания Hadoop и описывается история проекта. Глава 2 знакомит читателя с MapReduce. В главе 3 подробно рассматриваются файловые системы Hadoop (прежде всего HDFS). В главе 4 изложены основные принципы ввода/вывода в Hadoop: целостность данных, сжатие, сериализация и структуры данных на базе файлов.

    Следующие четыре главы содержат подробное описание MapReduce. В главе 5 перечислены практические действия, необходимые для разработки приложений MapReduce. В главе 6 рассматривается реализация MapReduce в Hadoop с точки зрения пользователя. Глава 7 посвящена модели программирования MapReduce и различным форматам данных, с которыми может работать MapReduce. В главе 8 рассматриваются нетривиальные аспекты MapReduce, включая сортировку и объединение данных.

    Главы 9 и 10 предназначены для администраторов Hadoop. В них читатель узнает, как организуется настройка и сопровождение кластеров Hadoop с HDFS и MapReduce.

    Дальнейшие главы посвящены проектам, построенным на базе Hadoop или связанным с этой технологией. В главах 11 и 12 представлены Pig и Hive — аналитические платформы на базе HDFS и MapReduce, тогда как в главах 13, 14 и 15 описаны HBase, ZooKeeper и Sqoop соответственно.

    Что нового во втором издании?

    Во второе издание вошли две новые главы, посвященные Hive и Sqoop (главы 12 и 15), новый раздел с описанием Avro (в главе 4) и вводное описание новых средств безопасности Hadoop (в главе 9).

    В этом издании также описывается серия версий Apache Hadoop 0.20, потому что это были последние стабильные версии на момент написания книги. В тексте периодически упоминаются новые возможности из последующих выпусков (с указанием версии, в которой они появились).

    Что нового в третьем издании?

    В третьем издании рассматривается серия версий Apache Hadoop 1.x (бывшая 0.20), а также более новые серии — 0.22 и 2.x (бывшая 0.23). За некоторыми исключениями, упоминаемыми в тексте, все примеры в книге работают в этих версиях.

  • 24 Введение

    Общее описание возможностей каждой серии версий приведено в разделе «Выпуски Hadoop», с. 42.

    В большинстве примеров этого издания используется новый MapReduce API. Так как старый API продолжает широко использоваться, он описывается в тексте вместе с новым API; эквивалентный код, использующий старый API, доступен на вебсайте книги.

    Главным новшеством Hadoop 2.0 стала новая исполнительная среда MapReduce — MapReduce 2, построенная на основе новой системы управления распределенными ресурсами YARN. В это издание вошли новые разделы, посвященные реализации MapReduce на базе YARN: как работает эта технология (глава 6) и как организовать ее выполнение (глава 9).

    Также в книге рассмотрены и другие аспекты MapReduce: практические вопросы разработки (например, упаковка заданий MapReduce с использованием Maven, настройка пользовательских путей классов Java, написание тестов с использованием MRUnit — все эти темы рассматриваются в главе 5); дополнительные сведения о таких возможностях, как OutputCommitter и распределенный кэш (глава 8) и анализ памяти задач (глава 9). В новом разделе описана подготовка заданий MapReduce для обработки данных Avro (глава 4), а в другом — организация выполнения простой рабочей схемы MapReduce в Oozie (глава 5).

    В главу, посвященную HDFS (глава 3), были включены вводные описания высокой доступности, федеративности и новых файловых систем, WebHDFS и HttpFS.

    Главы, посвященные Pig, Hive, Sqoop и ZooKeeper, были расширены: в них вошли описания новых возможностей и изменений последних выпусков.

    Кроме того, в книгу были внесены многочисленные исправления и усовершенствования.

    Использование примеров кода

    Эта книга написана для того, чтобы помочь вам в решении конкретных задач. В общем случае вы можете использовать приводимые примеры кода в своих программах и документации. Связываться с авторами для получения разрешения не нужно, если только вы не воспроизводите значительный объем кода. Например, если ваша программа использует несколько фрагментов кода из книги, обращаться за разрешением не нужно. Вместе с тем для продажи или распространения дисков CDROM с примерами из книг O’Reilly потребуется разрешение. Если вы отвечаете на вопрос на форуме, приводя цитату из книги с примерами кода, обращаться за разрешением не нужно. Если значительный объем кода из примеров книги включается в документацию по вашему продукту, разрешение необходимо.

  • Благодарности. . . 25

    Мы будем признательны за ссылку на источник информации, хотя и не требуем ее. Обычно в ссылке указывается название, автор, издательство и код ISBN. Если вы полагаете, что ваши потребности выходят за рамки оправданного использования примеров кода или разрешений, приведенных выше, свяжитесь с нами по адресу [email protected].

    Благодарности

    В работе над книгой мне (прямо или косвенно) помогало множество людей. Благодарю сообщество Hadoop, в котором я многому научился — и продолжаю учиться.

    Хочу особо поблагодарить Майкла Стека (Michael Stack) и Джонатана Грея (Jonathan Gray) за главу о HBase. Спасибо Эдриану Вудхеду (Adrian Woodhead), Марку де Палолу (Marc de Palol), Джойдипу Сен Сарме (Joydeep Sen Sarma), Ашишу Тусу (Ashish Thusoo), Анджею Бялецки (Andrzej Białecki), Стью Худу (Stu Hood), Крису К. Уэнзелу (Chris K. Wensel) и Оуэну О’Малли (Owen O’Malley).

    Я благодарен всем рецензентам, внесшим немало полезных предложений и улучшений в мои черновики: Рагу Ангади (Raghu Angadi), Мэтту Биддалфу (Matt Biddulph), Кристофу Бисилье (Christophe Bisciglia), Райану Коксу (Ryan Cox), Девараджу Дасу (Devaraj Das), Алексу Дорману (Alex Dorman), Крису Дугласу (Chris Douglas), Алану Гейтсу (Alan Gates), Ларсу Джорджу (Lars George), Патрику Ханту (Patrick Hunt), Аарону Кимболлу (Aaron Kimball), Питеру Крейю (Peter Krey), Хайрону Куану (Hairong Kuang), Саймону Максену (Simon Maxen), Ольге Наткович (Olga Natkovich), Бенджамину Риду (Benjamin Reed), Константину Швачко (Konstantin Shvachko), Аллену Уиттенауэру (Allen Wittenauer), Матею Захарии (Matei Zaharia) и Филиппу Зейлигеру (Philip Zeyliger). Аджай Ананд (Ajay Anand) помог нормально организовать процесс рецензирования. Филипп «флип» Кромер (Philip «flip» Kromer) любезно помог мне с примерами наборов метеорологических данных NCDC, использованных в примерах книги. Особого упоминания заслуживают Оуэн О’Малли (Owen O’Malley) и Арун С. Марти (Arun C. Murthy), объяснившие мне многие нюансы MapReduce. Конечно, ответственность за все оставшиеся ошибки лежит исключительно на мне.

    Также я благодарен всем участникам, предоставившим подробные рецензии и обратную связь ко второму изданию книги: Джеффу Бину (Jeff Bean), Дугу Каттингу (Doug Cutting), Глинну Дархэму (Glynn Durham), Алану Гейтсу (Alan Gates), Джеффу Хаммербахеру (Jeff Hammerbacher), Алексу Козлову (Alex Kozlov), Кену Круглеру (Ken Krugler), Джимми Лину (Jimmy Lin), Тодду Липкону (Todd Lipcon), Саре Спронле (Sarah Sproehnle), Винитре Варадхараджан (Vinithra Varadharajan) и Иэну Ригли (Ian Wrigley) — и всем читателям, сообщившим об ошибках в первом издании.

  • 26 Введение

    Спасибо Аарону Кимболлу за главу о Sqoop, а Филиппу «флипу» Кромеру — за примеры.

    Что касается третьего издания, я выражаю благодарность Алехандро Абдельнуру (Alejandro Abdelnur), Еве Андреассон (Eva Andreasson), Эли Коллинзу (Eli Collins), Дугу Каттингу, Патрику Ханту, Аарону Кимболлу, Аарону Т. Майерсу (Aaron T. Myers), Броку Ноланду (Brock Noland), Арвинду Прабхакару (Arvind Prabhakar), Ахмеду Радвану (Ahmed Radwan) и Тому Уилеру (Tom Wheeler) за отзывы и предложения. Роб Уэлтман (Rob Weltman) любезно предоставил очень подробную обратную связь по всей книге, которая значительно улучшила окончательный вариант рукописи. Спасибо всем читателям, сообщившим об ошибках во втором издании.

    Я особенно благодарен Дугу Каттингу за моральную поддержку и дружбу, а также за