Управление кешем
Обзор
В 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
.
По умолчанию централизованный кеш недоступен в ADH, но его можно настроить с помощью пользовательского параметра конфигурации в ADCM.
Прежде чем включать управление кешем, убедитесь, что нативная библиотека libhadoop.so доступна для DataNodes. Более подробную информацию об установке библиотеки libhadoop.so можно получить в статье Native Libraries Guide .
Чтобы включить централизованный кеш через ADCM:
-
На странице Clusters выберите нужный кластер.
-
Перейдите на вкладку Services.
-
Выберите сервис HDFS.
-
Включите опцию Show advanced и найдите Custom hdfs-site.xml.
-
Откройте раскрывающийся список и выберите Add property.
-
Введите имя параметра
dfs.datanode.max.locked.memory
и желаемое значение в байтах. -
Нажмите Apply.
Таким же образом можно настроить опциональные параметры кеша из таблицы ниже.
Параметр | Описание | Значение по умолчанию |
---|---|---|
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.
Чтобы создать новую директиву в новом пуле кеша:
-
Создайте новый пул кеша:
$ 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
, ограничений на устанавливаемое время жизни нет. По умолчанию максимум не установлен.
-
-
Добавьте новую директиву:
$ 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
.
-