Оптимизация производительности в HBase
Эта статья содержит рекомендации по улучшению производительности кластера HBase. Некоторые из описанных приемов нельзя точно сформулировать для всех случаев — их нужно подстраивать под каждую конкретную конфигурацию.
Настройки HDFS
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
dfs.datanode.max.transfer.threads |
Значение по умолчанию: Этот параметр определяет верхний предел количества файлов, которые узел HDFS DataNode может обслуживать одновременно |
Установите для этого параметра значение Этот параметр нужно добавить вручную в секции Custom hdfs-site.xml на конфигурационной странице сервиса HDFS |
Настройки HBase
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
zookeeper.session.timeout |
Значение по умолчанию: Этот параметр определяет тайм-аут, после которого Master-сервер считает сервер регионов неактивным. Значение по умолчанию не влияет на работу системы, если в конфигурации ZooKeeper остается значение по умолчанию для tick time (2 секунды). Сервис ZooKeeper имеет собственные тайм-ауты для неактивных сервисов: от двух до двадцати tick time. По умолчанию это означает, что сервис ZooKeeper будет ожидать не более 40 секунд до удаления эфемерного znode неактивного сервера регионов, пока Master-сервер все еще будет ожидать ответ от сервера регионов |
Понизьте значение параметра тайм-аута HBase или увеличьте значение tick time в ZooKeeper: будет использовано наименьшее значение. Учитывайте следующее:
Параметр |
hbase.regionserver.handler.count |
Значение по умолчанию: Этот параметр определяет количество открытых потоков для ответов на входящие запросы к пользовательским таблицам |
Каждый поток потребляет процессорное время и оперативную память, поэтому перед изменением значения этого параметра следует оценить среднюю величину нагрузки запросов. Если запросы имеют тяжелую нагрузку, то для этого параметра лучше задать небольшое значение. Но если запросы в основном имеют легкую нагрузку, то можно увеличить значение этого параметра: стоит начать с удвоенного количества процессорных ядер на узле и затем увеличивать его до достижения наилучшей производительности. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.master.wait.on.regionservers.mintostart |
Значение по умолчанию: Этот параметр определяет минимальное количество серверов регионов, которые должны быть зарегистрированы в Master-сервере до распределения им регионов по серверам. Значение по умолчанию |
Если в вашем кластере много регионов (например, несколько тысяч), то рекомендуется увеличить значение этого параметра, чтобы назначение регионов начиналось не сразу для их более равномерного распределения. В противном случае первый зарегистрированный сервер регионов может стать узким местом, замедлить запуск кластера и даже привести к потере доступа к серверу регионов. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
HBASE_MASTER_OPTS |
Значение по умолчанию: Этот параметр определяет количество оперативной памяти, выделяемой для Master-сервера |
Значения по умолчанию достаточно в большинстве случаев, так как Master-сервер не требует большого количества памяти для работы. Тем не менее, если ваш кластер достаточно большой и имеет огромное количество таблиц и/или регионов, может понадобиться увеличить верхний предел памяти, поскольку Master-сервер хранит состояния регионов в своей памяти. Этот параметр находится в секции hbase-env.sh на конфигурационной странице сервиса HBase |
HBASE_REGIONSERVER_OPTS |
Значение по умолчанию: Этот параметр определяет размер heap-памяти сервера регионов, в которой хранятся MemStore и Block cache |
В общем случае, чем больше значение этого параметра — тем лучше. Придерживайтесь следующих соображений:
Этот параметр находится в секции hbase-regionserver-env.sh на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hfile.block.cache.size |
Значение по умолчанию: Этот параметр определяет долю Block cache в heap-памяти сервера регионов |
Значение по умолчанию подходит для ситуации, когда из таблиц постоянно читается большое количество примерно одних и тех же данных. Если ситуация отличается (например, запрашиваемые данные все время разные, или размер запрашиваемых данных в среднем достаточно невелик), то стоит уменьшить значение этого параметра до Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hbase.regionserver.global.memstore.size |
Значение по умолчанию: Этот параметр определяет долю MemStore в heap-памяти сервера регионов |
Нужно задать такое значение, чтобы оно в сумме со значением параметра Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.regionserver.global.memstore.size.lower.limit |
Значение по умолчанию: Этот параметр задает пороговую долю размера MemStore региона. Когда размер данных в MemStore достигает этого порога, запись в них блокируется и выполняется принудительная запись MemStore в HFile |
Менять значение параметра не рекомендуется |
hbase.hregion.memstore.flush.size |
Значение по умолчанию: Этот параметр определяет размер данных в MemStore перед тем, как они будут записаны в HFile. Когда выполняется операция записи в HFile из одного MemStore, она выполняется и для всех остальных MemStore в том же регионе. Чем меньше это значение, тем чаще происходит запись в HFile, тем больше операций чтения и записи, тем больше количество создаваемых HFile и тем чаще запускается процесс сжатия |
Рекомендуется увеличить значение этого параметра вдвое (до Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase. Возможные значения: |
hbase.hstore.flusher.count |
Значение по умолчанию: Этот параметр определяет количество потоков операции записи MemStore в HFile. Чем больше это значение, тем эффективнее процесс записи, но в то же время больше нагрузка на HDFS и, потенциально, больше количество операций сжатия |
Можно начать с увеличения значения этого параметра до Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hregion.memstore.block.multiplier |
Значение по умолчанию: Этот параметр определяет множитель для возможного увеличения размера MemStore (определяемого параметром |
Рекомендуется увеличить его до Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hbase.regionserver.regionSplitLimit |
Значение по умолчанию: Этот параметр определяет максимальное количество регионов на узле, после которого разделение регионов больше не выполняется. Значение параметра не является ограничением на количество регионов самих по себе, но скорее точкой прекращения создания новых регионов |
Значение по умолчанию, равное
Чтобы найти количество регионов, нужно умножить размер heap-памяти сервера регионов на долю MemStore в нем (первые два параметра), а затем последовательно разделить результат на значение параметра Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hregion.max.filesize |
Значение по умолчанию: Этот параметр определяет максимальный общий размер HFile в регионе перед его разделением |
Значение по умолчанию подходит в большинстве случаев. Его можно увеличить, если производительность позволяет (например, до 20 ГБ), но не сильно: более высокие значения могут плохо повлиять на процесс сжатия. Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hbase.hstore.compactionThreshold |
Значение по умолчанию: Этот параметр определяет количество HFile в регионе перед тем, как они будут подвергнуты частичному сжатию |
Рекомендуется увеличить значение до Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hstore.blockingStoreFiles |
Значение по умолчанию: Этот параметр определяет максимальное количество HFile в регионе перед блокировкой обновлений для этого региона. Блокировка сохраняется, пока не будет принудительно выполнено частичное сжатие или пока не пройдет тайм-аут, заданный параметром |
Если кластер имеет высокую нагрузку на запись и из-за слишком большого количества HFile не происходит запись новых HFile из MemStore, то увеличьте это значение. Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hstore.blockingWaitTime |
Значение по умолчанию: Этот параметр определяет тайм-аут блокировки обновлений для региона из-за слишком большого количества HFile (см. предыдущий параметр). После истечения этого времени блокировка снимается независимо от того, было ли выполнено частичное сжатие |
Этот параметр нужно настраивать в зависимости от требований кластера. Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hstore.compaction.min |
Значение по умолчанию: Этот параметр определяет минимальное количество HFile, предназначенных для сжатия, прежде чем это сжатие будет выполнено |
Рекомендуется увеличить это значение до Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hstore.compaction.max |
Значение по умолчанию: Этот параметр определяет максимальное количество HFile, которые могут участвовать в одной операции частичного сжатия |
Значение по умолчанию подходит для большинства случаев, но если кластер имеет высокую нагрузку на запись, увеличьте это значение. Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.regionserver.thread.compaction.small |
Значение по умолчанию: Этот параметр определяет количество потоков, используемых для процесса частичного сжатия |
Если кластер имеет высокую нагрузку на запись, а операции частичного сжатия выполняются слишком часто и занимают слишком много времени, увеличьте это значение. При этом оно не должно превышать половины количества дисков, доступных для HBase. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.regionserver.thread.compaction.large |
Значение по умолчанию: Этот параметр определяет количество потоков, используемых для процесса полного сжатия |
Если кластер имеет высокую нагрузку на запись, можно увеличить это значение, но не рекомендуется делать его выше значения параметра Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hstore.compaction.min.size |
Значение по умолчанию: Этот параметр определяет максимальный размер HFile, которые автоматически предназначаются для сжатия |
Если кластер имеет высокую нагрузку на запись, в нем может оказаться много HFile небольших размеров, которые после частичного сжатия образуют HFile, чей размер все еще меньше указанного значения (особенно в случае небольшого значения параметра Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.hstore.compaction.ratio |
Значение по умолчанию: Этот параметр определяет коэффициент, применяемый к предыдущему параметру ( |
Чем выше это значение, тем чаще выполняется сжатие, но тем меньше HFile при этом будет прочитано, и наоборот. Более низкие значения предпочтительны для кластеров с высокой нагрузкой на запись, а более высокие — для кластеров с высокой нагрузкой на чтение. Значение по умолчанию подходит для большинства случаев; если вы захотите его изменить — рекомендуется выбирать значение в пределах Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hbase.regionserver.logroll.multiplier |
Значение по умолчанию: Этот параметр определяет размер файла WAL относительно размера блока HDFS (который задается параметром |
Рекомендуется оставить значение этого параметра неизменным во всех случаях. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.regionserver.maxlogs |
Значение по умолчанию: Этот параметр определяет максимальное количество файлов WAL на сервере регионов |
Значение этого параметра нужно рассчитать самостоятельно, выполнив следующее:
Если кластер имеет высокую нагрузку на запись, когда количество файлов WAL достигает предела, серверу регионов может потребоваться выгрузить все MemStore в HFile, пока все файлы WAL не перейдут в архив и не появится достаточно пространства для операций записи. Это явление называется flush storm и может быть определено по следующим строкам в логе: INFO[regionserver//10.22.100.5:16020.logRoller] wal.FSHLog:Too many wals: logs=35, maxlogs=32; forcing flush of 20 regions(s): d4kjnfnkf34335666d03cb1f В этом случае следует увеличить значение этого параметра. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hbase.hregion.memstore.mslab.chunksize |
Значение по умолчанию: Этот параметр определяет размер чанка в MemStore Allocation Buffer |
При использовании записей большого размера следует увеличить значение этого параметра в два или в четыре раза. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
Параметр | Значение по умолчанию и описание | Рекомендация |
---|---|---|
hbase.client.write.buffer |
Значение по умолчанию: Этот параметр определяет размер буфера на запись. Чем больше это значение, тем больше памяти используется как на стороне сервера, так и на стороне клиента, но тем меньше количество RPC |
Рекомендуется задать для этого параметра значение Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.client.pause |
Значение по умолчанию: Этот параметр определяет длительность паузы клиента. Она используется в качестве тайм-аута перед повторным выполнением операции после отказа её выполнения |
Рекомендуется значительно уменьшить это значение (например, до Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.client.retries.number |
Значение по умолчанию: Этот параметр определяет максимальное количество повторных выполнений операции после отказа её выполнения |
Рекомендуется уменьшить это значение до Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.rpc.timeout |
Значение по умолчанию: Этот параметр определяет тайм-аут для всех RPC, отправляемых клиентом в HBase |
Если клиентские запросы часто вызывают высокую нагрузку на память, увеличьте это значение. Однако не стоит увеличивать его слишком сильно, поскольку ожидание ответа клиентом может занять много времени и в конечном счете клиент получит отказ. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.client.scanner.timeout.period |
Значение по умолчанию: Этот параметр определяет тайм-аут для RPC, связанных с операциями сканирования |
Этот параметр становится бесполезен, если его значение выше значения параметра Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.client.scanner.caching |
Значение по умолчанию: Этот параметр определяет максимальное количество строк, которое клиентский сканер может извлечь из HBase за один раз |
Если это значение слишком велико, сканер может оказаться перегруженным операциями извлечения и передачи слишком большого количества данных клиенту или даже превысить тайм-аут, в результате чего операция будет безуспешна. Также это приведет к слишком большому потреблению heap memory даже в случае успеха. Слишком низкое значение приведет к неэффективному использованию ресурсов кластера из-за простоев. Значение этого параметра следует тщательно подбирать в зависимости от характеристик дисков, памяти, процессоров и средней нагрузки на чтение. Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
hbase.client.scanner.max.result.size |
Значение по умолчанию: Этот параметр определяет максимальное количество байт, возвращаемых при вызове следующего метода сканера. Если размер одного ряда превышает это значение, он все равно будет возвращен полностью |
Это значение подходит для сетей 1G Ethernet. Если пропускная способность сети в вашем кластере выше, можно увеличить это значение, но учитывайте следующее:
Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase |
Прочее
Дизайн ключей строк
Рекомендуется использовать технологии salting/hashing для более равномерного распределения строк в регионах.
Распределение полного сжатия
Для более равномерной нагрузки на кластер имеет смысл распределить процедуры полного сжатия для различных таблиц и семейств столбцов по расписанию с использованием планировщика cron
или других подобных утилит.
Компрессия
В некоторых случаях использование компрессии может улучшить производительность за счет уменьшения размера HFile, что в свою очередь уменьшит количество операций ввода-вывода.
Фильтры Блума
Рекомендуется использовать фильтры Блума для ускорения операций поиска в HFile. Фильтры Блума позволяют определить наличие в HFile определенного ключа после прочтения небольшого объема данных из этого HFile. В противном случае выполняется поиск в следующем HFile.
Массовая загрузка
Рекомендуется использовать массовую загрузку при наличии такой возможности, поскольку это самый быстрый способ загрузки данных в HBase. Если массовая загрузка невозможна, рекомендуется объединять одиночные запросы (такие как GET
, PUT
или DELETE
) в списки, поскольку эти операции весьма ресурсоемки при выполнении их по отдельности.