Управление кешем

Обзор

В HDFS можно настроить централизованное управление кешем, которое позволит сохранять выбранную директорию или файл в кеше. Это обеспечит быстрый доступ к данным и ускорит выполнение задач, связанных с кешированными данными.

Когда эта опция отключена, у пользователей и приложений нет контроля над тем, какие данные кешируются. Рабочие нагрузки с низким приоритетом могут вытеснить из кеша задания с высоким приоритетом, а приложения, принимающие решения о размещении задач (например, MapReduce или Impala), не смогут учитывать кешированные данные при создании задач.

Управление кешем разрешает использовать кеш кластера планировщикам задач и позволяет клиентам закреплять свои данные в памяти кластера. Кроме того, приложения потенциально могут выполнять эффективное zero-copy чтение и пропускать проверку контрольных сумм, поскольку целостность кешированных данных уже проверена.

Настройка централизованного кеша повышает производительность нескольких сервисов Hadoop, включая HBase, Impala и Hive.

Директивы и пулы кеша

Существует две основные концепции, используемые для управления кешем: директивы кеша и пулы кеша.

Директива кеша — это путь, который пользователь или приложение запрашивает для сохранения в кеше. Это может быть как файл, так и директория.

Кеширование нерекурсивно. Это означает, что если указан файл, все его блоки будут сохранены в кеше. Но если указана директория, кешироваться будут только файлы первого уровня этой директории.

Если директива содержит символическую ссылку, содержимое, на которое она указывает, не будет кешироваться.

При создании директивы кеша необходимо указать два параметра:

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

  • Время жизни (time-to-live, TTL) — срок действия директивы. После истечения срока действия она больше не учитывается при принятии решений о кешировании.

После получения директивы NameNode будет периодически проверять, были ли изменены файлы в каталоге директивы. Если файлы изменились, NameNode даст указание кешировать новые блоки.

Пул кеша — это инструмент администрирования и управления ресурсами кеша. Каждая директива принадлежит определенному пулу кеша.

Для каждого пула кеша можно настроить следующее:

  • Разрешения (как в UNIX-системах) — определяют какие пользователи и группы имеют доступ к пулу. Разрешения на запись позволяют пользователям добавлять и удалять директивы кеша, разрешения на чтение позволяют видеть список директив в пуле и метаданные.

  • Максимальный размер — суммарное ограничение размера в байтах для всех директив в пуле. Нежелательно, чтобы сумма ограничений всех пулов превышала объем совокупной памяти, зарезервированной для кеширования HDFS в кластере.

  • Максимальный TTL — максимальное время жизни директив кеша в пуле.

Конфигурация

Чтобы включить управление кешем, необходимо установить значение, отличное от нуля, для параметра dfs.datanode.max.locked.memory в hdfs-site.xml. Этот параметр описывает, какой объем памяти DataNode может быть зарезервирован для кеширования.

При настройке параметра dfs.datanode.max.locked.memory учитывайте:

  • В Unix-подобных системах размер locked-in-memory пользователя DataNode (ulimit -l) необходимо увеличить, чтобы он соответствовал этому параметру (подробнее о возможных ошибках ниже).

  • DataNode, JVM heap приложений, а также страничный кеш операционной системы также требуют места.

  • Lazy Persist Writes также использует значение параметра dfs.datanode.max.locked.memory.

Возможные ошибки: конфигурация ulimit в Linux

 
Одна из возможных ошибок при настройке централизованного кеша:

Cannot start datanode because the configured max locked memory size… is more than the datanode’s available RLIMIT_MEMLOCK ulimit.

Это означает, что ограничение использования памяти, настроенное на уровне ОС, ниже лимита, установленного для DataNode. Чтобы это исправить, измените значение ulimit -l для DataNode.

Чтобы убедиться, что ulimit правильно настроен, выполните команду:

$ ulimit -l

Если команда выводит unlimited или значение большее, чем в параметре dfs.datanode.max.locked.memory, конфигурация настроена верно.

Обратите внимание, что эта команда выводит значение в килобайтах, а значение dfs.datanode.max.locked.memory в байтах.

По умолчанию централизованный кеш недоступен в ADH, но его можно настроить с помощью пользовательского параметра конфигурации в ADCM.

Прежде чем включать управление кешем, убедитесь, что нативная библиотека libhadoop.so доступна для DataNodes. Более подробную информацию об установке библиотеки libhadoop.so можно получить в статье Native Libraries Guide .

Чтобы включить централизованный кеш через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services.

  3. Выберите сервис HDFS.

  4. Включите опцию Show advanced и найдите Custom hdfs-site.xml.

  5. Откройте раскрывающийся список и выберите Add property.

  6. Введите имя параметра dfs.datanode.max.locked.memory и желаемое значение в байтах.

  7. Нажмите Apply.

Custom hdfs-site.xml parameter
Параметр Custom hdfs-site.xml в ADCM

Таким же образом можно настроить опциональные параметры кеша из таблицы ниже.

Дополнительные настройки кеширования
Параметр Описание Значение по умолчанию

dfs.namenode.path.based.cache.refresh.interval.ms

Параметр описывает, как часто NameNode проверяет есть ли на DataNodes новые блоки, которые нужно кешировать. Указывается в миллисекундах

30000

dfs.datanode.fsdatasetcache.max.threads.per.volume

Максимальное количество потоков на DataNode, которое можно использовать для кеширования новых данных. Эти потоки потребляют вычислительные ресурсы, что может повлиять на работу DataNode

4

dfs.cachereport.intervalMsec

Параметр описывает, как часто DataNode отправляет отчеты о кеше в NameNode. Указывается в миллисекундах

10000

dfs.namenode.path.based.cache.block.map.allocation.percent

Процент Java heap, который будет зарезервирован для карты кешированных блоков. Доступ к картам меньшего размера может осуществляться медленнее, если количество кешированных блоков большое. Большие карты потребляют больше памяти. Указывается в виде десятичной дроби

0.25

Поток данных

Диаграмма последовательности запроса на кеширование
Диаграмма последовательности запроса на кеширование
Диаграмма последовательности запроса на кеширование
Диаграмма последовательности запроса на кеширование

Централизованное кеширование в HDFS работает аналогично хранению обычных блоков данных: кеш управляется NameNode и хранится на DataNodes.

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

В то же время NameNode делает запись о новой директиве в журнале изменений. Это позволяет NameNode повторно кешировать данные при перезапуске.

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

Команды CLI

Администратор может управлять директивами и пулами кеша с помощью команды cacheadmin.

Чтобы создать новую директиву в новом пуле кеша:

  1. Создайте новый пул кеша:

    $ hdfs cacheadmin -addPool <name> -owner <owner> -group <group> -mode <mode> -limit <limit> -maxTtl <maxTtl>

    Здесь:

    • <name> — имя нового пула кеша.

    • <owner> — имя нового владельца пула. Владельцем по умолчанию является текущий пользователь.

    • <group> — группа пользователей пула. Группа по умолчанию — это основная группа текущего пользователя.

    • <mode> — UNIX-разрешения для пула. Указываются в восьмеричном формате. По умолчанию установлено значение 0755.

    • <limit> — максимальный размер пула в байтах. По умолчанию пул не имеет ограничений.

    • <maxTtl> — максимально допустимое время жизни директив в пуле. Может быть указано в секундах, минутах, часах или днях, например: 120s, 30m, 4h, 2d. Если установлено значение never, ограничений на устанавливаемое время жизни нет. По умолчанию максимум не установлен.

  2. Добавьте новую директиву:

    $ hdfs cacheadmin -addDirective -path <path> -pool <pool-name> -force -replication <replication> -ttl <time-to-live>

    Здесь:

    • <path> — путь к каталогу или файлу, который необходимо кешировать.

    • <pool-name> — пул, в который нужно добавить директиву. Для добавления новых директив необходимо разрешение на запись в пул кеша.

    • -force — если указана эта опция, директива будет добавлена без проверки на превышение ограничений ресурсов пула кеша.

    • <replication> — используемый коэффициент репликации кеша. Значение по умолчанию — 1.

    • <time-to-live> — срок действия директивы. Значение может быть указано в секундах, минутах, часах и днях, например: 120s, 30m, 4h, 2d. Если установлено значение never, директива будет действовать бесконечно. Значение по умолчанию — never.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней