Оптимизация производительности в HBase

Эта статья содержит рекомендации по улучшению производительности кластера HBase. Некоторые из описанных приемов нельзя точно сформулировать для всех случаев — их нужно подстраивать под каждую конкретную конфигурацию.

Настройки HDFS

Параметры HDFS
Параметр Значение по умолчанию и описание Рекомендация

dfs.datanode.max.transfer.threads

Значение по умолчанию: 4096.

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

Установите для этого параметра значение 8192.

Этот параметр нужно добавить вручную в секции Custom hdfs-site.xml на конфигурационной странице сервиса HDFS

Настройки HBase

Настройки RegionServer
Параметр Значение по умолчанию и описание Рекомендация

zookeeper.session.timeout

Значение по умолчанию: 90000 (в миллисекундах).

Этот параметр определяет тайм-аут, после которого Master-сервер считает сервер регионов неактивным. Значение по умолчанию не влияет на работу системы, если в конфигурации ZooKeeper остается значение по умолчанию для tick time (2 секунды). Сервис ZooKeeper имеет собственные тайм-ауты для неактивных сервисов: от двух до двадцати tick time. По умолчанию это означает, что сервис ZooKeeper будет ожидать не более 40 секунд до удаления эфемерного znode неактивного сервера регионов, пока Master-сервер все еще будет ожидать ответ от сервера регионов

Понизьте значение параметра тайм-аута HBase или увеличьте значение tick time в ZooKeeper: будет использовано наименьшее значение. Учитывайте следующее:

  • Не понижайте значение параметра zookeeper.session.timeout слишком сильно — всегда существуют задержки и паузы из-за сетевого трафика, работы сборщика мусора и других временных проблем. Серверы регионов должны выдерживать эти колебания, не отключаясь по тайм-ауту.

  • Не увеличивайте значение tick time в ZooKeeper до более чем 4 или 5 секунд — это может плохо повлиять на состояние кворума ZooKeeper.

Параметр zookeeper.session.timeout расположен в секции hbase-site.xml на конфигурационной странице сервиса HBase, значение tick time задается параметром tickTime в секции zoo.cfg на конфигурационной странице сервиса ZooKeeper. Оба параметра указываются в миллисекундах

hbase.regionserver.handler.count

Значение по умолчанию: 30.

Этот параметр определяет количество открытых потоков для ответов на входящие запросы к пользовательским таблицам

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

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.master.wait.on.regionservers.mintostart

Значение по умолчанию: 1.

Этот параметр определяет минимальное количество серверов регионов, которые должны быть зарегистрированы в Master-сервере до распределения им регионов по серверам. Значение по умолчанию 1 означает, что Master-сервер начнет распределять регионы на первом зарегистрированном сервере регионов

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

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

Настройки Heap memory
Параметр Значение по умолчанию и описание Рекомендация

HBASE_MASTER_OPTS

Значение по умолчанию: -Xms700m -Xmx9G.

Этот параметр определяет количество оперативной памяти, выделяемой для Master-сервера

Значения по умолчанию достаточно в большинстве случаев, так как Master-сервер не требует большого количества памяти для работы. Тем не менее, если ваш кластер достаточно большой и имеет огромное количество таблиц и/или регионов, может понадобиться увеличить верхний предел памяти, поскольку Master-сервер хранит состояния регионов в своей памяти.

Этот параметр находится в секции hbase-env.sh на конфигурационной странице сервиса HBase

HBASE_REGIONSERVER_OPTS

Значение по умолчанию: -Xms700m -Xmx9G.

Этот параметр определяет размер heap-памяти сервера регионов, в которой хранятся MemStore и Block cache

В общем случае, чем больше значение этого параметра — тем лучше. Придерживайтесь следующих соображений:

  • Размер heap-памяти сервера регионов должен быть пропорционален количеству регионов на узле.

  • Если пиковое потребление памяти достигает 60 или 70 процентов — увеличьте объем heap-памяти.

  • Если JVM используют алгоритм сборщика мусора CMS, который предоставляется по умолчанию в Arenadata HBase, heap-память сервера регионов не должна превышать 36 ГБ. В противном случае паузы сборщика мусора "stop-the-world" могут сделать HBase непригодным для использования и сильно осложнить сохранение данных. Если JVM используют алгоритм сборщика мусора G1 (garbage first), то ограничений на размер heap-памяти сервера регионов нет.

Этот параметр находится в секции hbase-regionserver-env.sh на конфигурационной странице сервиса HBase

Настройки Block cache
Параметр Значение по умолчанию и описание Рекомендация

hfile.block.cache.size

Значение по умолчанию: 0.4.

Этот параметр определяет долю Block cache в heap-памяти сервера регионов

Значение по умолчанию подходит для ситуации, когда из таблиц постоянно читается большое количество примерно одних и тех же данных. Если ситуация отличается (например, запрашиваемые данные все время разные, или размер запрашиваемых данных в среднем достаточно невелик), то стоит уменьшить значение этого параметра до 0.2 или даже до 0.1. Общее правило таково: этот параметр не должен быть больше, чем действительно необходимо. Точное значение следует подбирать по производительности, методом проб и ошибок. Также оно должно быть сбалансировано со значением параметра hbase.regionserver.global.memstore.size.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

Настройки MemStore и записи в HFile
Параметр Значение по умолчанию и описание Рекомендация

hbase.regionserver.global.memstore.size

Значение по умолчанию: 0.4.

Этот параметр определяет долю MemStore в heap-памяти сервера регионов

Нужно задать такое значение, чтобы оно в сумме со значением параметра hfile.block.cache.size было равным 0.7 или 0.75.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.regionserver.global.memstore.size.lower.limit

Значение по умолчанию: 0.95.

Этот параметр задает пороговую долю размера MemStore региона. Когда размер данных в MemStore достигает этого порога, запись в них блокируется и выполняется принудительная запись MemStore в HFile

Менять значение параметра не рекомендуется

hbase.hregion.memstore.flush.size

Значение по умолчанию: 134217728 (128 МБ).

Этот параметр определяет размер данных в MemStore перед тем, как они будут записаны в HFile. Когда выполняется операция записи в HFile из одного MemStore, она выполняется и для всех остальных MemStore в том же регионе. Чем меньше это значение, тем чаще происходит запись в HFile, тем больше операций чтения и записи, тем больше количество создаваемых HFile и тем чаще запускается процесс сжатия

Рекомендуется увеличить значение этого параметра вдвое (до 268435456, то есть 256 МБ). Если в вашем кластере HBase большая загрузка операциями записи, можно увеличить это значение до 536870912 (512 МБ), но это не всегда возможно, особенно если у вас достаточно небольшой размер heap-памяти сервера регионов и большое количество регионов и семейств столбцов.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase. Возможные значения: 134217728, 268435456, 536870912

hbase.hstore.flusher.count

Значение по умолчанию: 2.

Этот параметр определяет количество потоков операции записи MemStore в HFile. Чем больше это значение, тем эффективнее процесс записи, но в то же время больше нагрузка на HDFS и, потенциально, больше количество операций сжатия

Можно начать с увеличения значения этого параметра до 4, а затем увеличивать его понемногу, проверяя влияние на производительность.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hregion.memstore.block.multiplier

Значение по умолчанию: 4.

Этот параметр определяет множитель для возможного увеличения размера MemStore (определяемого параметром hbase.hregion.memstore.flush.size) в ситуациях интенсивного трафика записи в него

Рекомендуется увеличить его до 8, если размер оперативной памяти позволяет. Когда размер MemStore достигает максимального значения, определямого произведением значения этого параметра и параметра hbase.hregion.memstore.flush.size, соответствующее семейство столбцов блокируется для операций записи до тех пор, пока содержимое MemStore не будет полностью записано в HFile.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

Настройки разделения регионов
Параметр Значение по умолчанию и описание Рекомендация

hbase.regionserver.regionSplitLimit

Значение по умолчанию: 1000.

Этот параметр определяет максимальное количество регионов на узле, после которого разделение регионов больше не выполняется. Значение параметра не является ограничением на количество регионов самих по себе, но скорее точкой прекращения создания новых регионов

Значение по умолчанию, равное 1000, на практике означает отсутствие ограничений, поскольку в подавляющем большинстве случаев на серверах регионов в кластерах HBase гораздо меньше регионов, чем 1000. Можно самостоятельно рассчитать это ограничение для конкретной ситуации. Например, ваш кластер имеет следующие характеристики:

  • HBASE_REGIONSERVER_OPTS — -Xms700m -Xmx32G;

  • hbase.regionserver.global.memstore.size — 0.55;

  • hbase.hregion.memstore.flush.size — 268435456 (256 МБ);

  • 2 семейства столбцов в таблице.

Чтобы найти количество регионов, нужно умножить размер heap-памяти сервера регионов на долю MemStore в нем (первые два параметра), а затем последовательно разделить результат на значение параметра hbase.hregion.memstore.flush.size и на количество семейств столбцов. В данном случае получается следующая формула:

 
Округлите результат в большую сторону, если он дробный, и полученное значение будет оптимальным количеством регионов на узле.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hregion.max.filesize

Значение по умолчанию: 10737418240 (10 ГБ).

Этот параметр определяет максимальный общий размер HFile в регионе перед его разделением

Значение по умолчанию подходит в большинстве случаев. Его можно увеличить, если производительность позволяет (например, до 20 ГБ), но не сильно: более высокие значения могут плохо повлиять на процесс сжатия.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

Настройки сжатия
Параметр Значение по умолчанию и описание Рекомендация

hbase.hstore.compactionThreshold

Значение по умолчанию: 3.

Этот параметр определяет количество HFile в регионе перед тем, как они будут подвергнуты частичному сжатию

Рекомендуется увеличить значение до 5.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hstore.blockingStoreFiles

Значение по умолчанию: 16.

Этот параметр определяет максимальное количество HFile в регионе перед блокировкой обновлений для этого региона. Блокировка сохраняется, пока не будет принудительно выполнено частичное сжатие или пока не пройдет тайм-аут, заданный параметром hbase.hstore.blockingWaitTime

Если кластер имеет высокую нагрузку на запись и из-за слишком большого количества HFile не происходит запись новых HFile из MemStore, то увеличьте это значение.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hstore.blockingWaitTime

Значение по умолчанию: 90000 (в миллисекундах).

Этот параметр определяет тайм-аут блокировки обновлений для региона из-за слишком большого количества HFile (см. предыдущий параметр). После истечения этого времени блокировка снимается независимо от того, было ли выполнено частичное сжатие

Этот параметр нужно настраивать в зависимости от требований кластера.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hstore.compaction.min

Значение по умолчанию: 3.

Этот параметр определяет минимальное количество HFile, предназначенных для сжатия, прежде чем это сжатие будет выполнено

Рекомендуется увеличить это значение до 5.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hstore.compaction.max

Значение по умолчанию: 10.

Этот параметр определяет максимальное количество HFile, которые могут участвовать в одной операции частичного сжатия

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

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.regionserver.thread.compaction.small

Значение по умолчанию: 1.

Этот параметр определяет количество потоков, используемых для процесса частичного сжатия

Если кластер имеет высокую нагрузку на запись, а операции частичного сжатия выполняются слишком часто и занимают слишком много времени, увеличьте это значение. При этом оно не должно превышать половины количества дисков, доступных для HBase.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.regionserver.thread.compaction.large

Значение по умолчанию: 1.

Этот параметр определяет количество потоков, используемых для процесса полного сжатия

Если кластер имеет высокую нагрузку на запись, можно увеличить это значение, но не рекомендуется делать его выше значения параметра hbase.regionserver.thread.compaction.small.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hstore.compaction.min.size

Значение по умолчанию: 134217728 (128 МБ).

Этот параметр определяет максимальный размер HFile, которые автоматически предназначаются для сжатия

Если кластер имеет высокую нагрузку на запись, в нем может оказаться много HFile небольших размеров, которые после частичного сжатия образуют HFile, чей размер все еще меньше указанного значения (особенно в случае небольшого значения параметра hbase.hstore.compaction.max) и который вновь потребует сжатия. Понижение значения этого параметра исправляет эту проблему: следует задать значение чуть меньше, чем результат произведения среднего объема MemStore перед выгрузкой в HFile и значения параметра hbase.hstore.compaction.max.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.hstore.compaction.ratio

Значение по умолчанию: 1.2F.

Этот параметр определяет коэффициент, применяемый к предыдущему параметру (hbase.hstore.compaction.min.size). Произведение значений этих двух параметров определяет верхний предел размера HFile, который может быть предназначен для сжатия

Чем выше это значение, тем чаще выполняется сжатие, но тем меньше HFile при этом будет прочитано, и наоборот. Более низкие значения предпочтительны для кластеров с высокой нагрузкой на запись, а более высокие — для кластеров с высокой нагрузкой на чтение. Значение по умолчанию подходит для большинства случаев; если вы захотите его изменить — рекомендуется выбирать значение в пределах 1.0F — 1.4F.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

Настройки WAL
Параметр Значение по умолчанию и описание Рекомендация

hbase.regionserver.logroll.multiplier

Значение по умолчанию: 0.95.

Этот параметр определяет размер файла WAL относительно размера блока HDFS (который задается параметром dfs.blocksize в секции hdfs-site.xml на конфигурационной странице сервиса HDFS). Например, если размер блока HDFS равен 134217728 (128 МБ), то размер файла WAL будет равен 127506842 (приблизительно 121.6 МБ)

Рекомендуется оставить значение этого параметра неизменным во всех случаях.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.regionserver.maxlogs

Значение по умолчанию: 32.

Этот параметр определяет максимальное количество файлов WAL на сервере регионов

Значение этого параметра нужно рассчитать самостоятельно, выполнив следующее:

  1. Возьмите значение верхнего предела из параметра HBASE_REGIONSERVER_OPTS и умножьте его на значение параметра hbase.regionserver.global.memstore.size. В результате получится размер MemStore.

  2. Вычислите размер файла WAL, как описано выше для параметра hbase.regionserver.logroll.multiplier.

  3. Разделите размер MemStore на размер файла 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

Настройки MSLAB
Параметр Значение по умолчанию и описание Рекомендация

hbase.hregion.memstore.mslab.chunksize

Значение по умолчанию: 2097152 (2 МБ).

Этот параметр определяет размер чанка в MemStore Allocation Buffer

При использовании записей большого размера следует увеличить значение этого параметра в два или в четыре раза.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

Настройки клиента
Параметр Значение по умолчанию и описание Рекомендация

hbase.client.write.buffer

Значение по умолчанию: 2097152 (2 МБ).

Этот параметр определяет размер буфера на запись. Чем больше это значение, тем больше памяти используется как на стороне сервера, так и на стороне клиента, но тем меньше количество RPC

Рекомендуется задать для этого параметра значение 8388608 (8 МБ). Для оценки размера используемой памяти сервера следует умножить значение этого параметра на значение параметра hbase.regionserver.handler.count.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.client.pause

Значение по умолчанию: 100.

Этот параметр определяет длительность паузы клиента. Она используется в качестве тайм-аута перед повторным выполнением операции после отказа её выполнения

Рекомендуется значительно уменьшить это значение (например, до 3 или 5) во избежание потери данных.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.client.retries.number

Значение по умолчанию: 15.

Этот параметр определяет максимальное количество повторных выполнений операции после отказа её выполнения

Рекомендуется уменьшить это значение до 3 или 5 во избежание потери данных.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.rpc.timeout

Значение по умолчанию: 300000 (в миллисекундах; 5 минут).

Этот параметр определяет тайм-аут для всех RPC, отправляемых клиентом в HBase

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

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.client.scanner.timeout.period

Значение по умолчанию: 60000 (в миллисекундах; 1 минута).

Этот параметр определяет тайм-аут для RPC, связанных с операциями сканирования

Этот параметр становится бесполезен, если его значение выше значения параметра hbase.rpc.timeout, поскольку операция будет отменена после первого истекшего тайм-аута.

Этот параметр находится в секции hbase-site.xml на конфигурационной странице сервиса HBase

hbase.client.scanner.caching

Значение по умолчанию: 2147483647.

Этот параметр определяет максимальное количество строк, которое клиентский сканер может извлечь из HBase за один раз

Если это значение слишком велико, сканер может оказаться перегруженным операциями извлечения и передачи слишком большого количества данных клиенту или даже превысить тайм-аут, в результате чего операция будет безуспешна. Также это приведет к слишком большому потреблению heap memory даже в случае успеха. Слишком низкое значение приведет к неэффективному использованию ресурсов кластера из-за простоев. Значение этого параметра следует тщательно подбирать в зависимости от характеристик дисков, памяти, процессоров и средней нагрузки на чтение.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

hbase.client.scanner.max.result.size

Значение по умолчанию: 2097152 (2 МБ).

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

Это значение подходит для сетей 1G Ethernet. Если пропускная способность сети в вашем кластере выше, можно увеличить это значение, но учитывайте следующее:

  • Проверьте значение параметра HBASE_MASTER_OPTS. Рекомендуется задавать значение параметра hbase.client.scanner.max.result.size в восемь раз меньше нижнего предела.

  • Установленное значение, умноженное на значение параметра hbase.regionserver.handler.count, не должно превышать верхний предел.

Этот параметр нужно добавлять вручную в секции Custom hbase-site.xml на конфигурационной странице сервиса HBase

Прочее

Схема таблиц

Рекомендуется использовать не более двух семейств столбцов в одной таблице.

Дизайн ключей строк

Рекомендуется использовать технологии salting/hashing для более равномерного распределения строк в регионах.

Распределение полного сжатия

Для более равномерной нагрузки на кластер имеет смысл распределить процедуры полного сжатия для различных таблиц и семейств столбцов по расписанию с использованием планировщика cron или других подобных утилит.

Компрессия

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

Фильтры Блума

Рекомендуется использовать фильтры Блума для ускорения операций поиска в HFile. Фильтры Блума позволяют определить наличие в HFile определенного ключа после прочтения небольшого объема данных из этого HFile. В противном случае выполняется поиск в следующем HFile.

Массовая загрузка

Рекомендуется использовать массовую загрузку при наличии такой возможности, поскольку это самый быстрый способ загрузки данных в HBase. Если массовая загрузка невозможна, рекомендуется объединять одиночные запросы (такие как GET, PUT или DELETE) в списки, поскольку эти операции весьма ресурсоемки при выполнении их по отдельности.

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