HBase — это распределенная колонная база данных, разработанная для работы с HDFS, и она особенно подходит для случайного доступа к огромным наборам данных. Традиционные РДБМС оказываются неэффективными при работе с огромными и сверхмасштабными наборами данных. Хотя некоторые реляционные базы данных могут использовать репликацию и партиционирование для распределения базы данных на несколько узлов, эти технологии сложны в установке и обслуживании, и они часто требуют жертв в отношении важных функций РДБМС. Например, в расширенной РДБМС такие функции, как соединения, сложные запросы, триггеры, представления и ограничения внешних ключей, либо имеют высокую стоимость выполнения, либо просто недоступны.
HBase решает эту проблему с другой стороны. Он построен снизу вверх и может легко масштабироваться линейно путем добавления или удаления узлов. HBase не является реляционной базой данных и не поддерживает SQL. Однако в определенных пространствах проблем он может выполнять задачи, которые РДБМС не могут выполнить: управление сверхмасштабными редкими таблицами на кластерах из дешевых аппаратных средств.### Обзор модели данных HBase В HBase таблицы состоят из строк и столбцов, приложения хранят данные в таблицах с метками. "Клетки" таблицы определяются координатами строк и столбцов и имеют версию. По умолчанию, версия определяется меткой времени вставки данных в ячейку. Содержимое ячейки представляет собой необработанный массив байтов.Ключи таблиц также представляют собой массивы байтов. Теоретически, любое значение может быть представлено в виде строки, преобразовано в целое число или сериализовано как структура данных для использования в качестве ключа. Строки таблиц сортируются по ключам строк (то есть по первичным ключам таблицы). Сортировка происходит в порядке байтов, и все доступы к таблице осуществляются через первичный ключ.
Столбцы в строке группируются в "столбцовые семьи" (column families). Все члены одной семьи столбцов имеют одинаковый префикс. Таким образом, столбцы temperature:air и temperature:dew_point являются членами семьи столбцов temperature, а station:identifier относится к семье station. Префиксы семейств столбцов должны состоять из распечатываемых символов. Модификаторы семейств столбцов, то есть конечные символы, могут быть любыми байтами.
Семейства столбцов таблицы должны быть предварительно определены как часть схемы таблицы, но новые члены семейств столбцов могут быть добавлены по мере необходимости.Физически все члены семейств столбцов хранятся вместе в файловой системе, то есть HBase является хранилищем, ориентированным на семейства столбцов. Поскольку оптимизация и хранение выполняются на уровне семейств столбцов, лучше всего, чтобы все члены семейств столбцов имели одинаковый образец доступа (access pattern) и характеристики размера. Кратко говоря, таблицы HBase и таблицы в РДБМС схожи, однако ячейки HBase имеют версию, строки сортируются, а столбцы могут добавляться в семейства столбцов в любое время, если семейство столбцов уже существует.
HBase автоматически разделяет таблицы на горизонтальные области (regions), каждая из которых состоит из подмножества строк таблицы. Каждая область определяется таблицей, к которой она принадлежит, первой строкой, которая входит в неё, и последней строкой, которая не входит в неё. Вначале таблица состоит из одной области, но по мере увеличения размера области, когда они превышают заданный порог, они делятся на две области примерно одинакового размера по границе строки. Перед первым делением все загруженные данные находятся на сервере, где находится первоначальная область. По мере увеличения размера таблицы количество областей также увеличивается. Область является наименьшей единицей распределения данных в кластере HBase.Таким образом, таблица, которая слишком большая для хранения на одном сервере, может быть распределена по кластеру серверов, где каждый узел отвечает за управление подмножеством областей всей таблицы. Загрузка таблицы также осуществляется таким образом, чтобы распределить данные по узлам. Все активные области упорядочены по порядку, что образует всю таблицу.
В HBase концепция запирания заключается в том, что обновление строки является атомарным, независимо от того, сколько столбцов затрагивает транзакция. Это позволяет модели запирания оставаться простой и эффективной.
HBase использует мастер-узел для координации управления одним или несколькими зависимыми регион-серверами (как показано на рисунке). Мастер HBase имеет небольшую нагрузку и в основном отвечает за запуск нового развертывания, распределение областей регион-серверам, восстановление сбоев регион-серверов. Регион-серверы отвечают за управление нулем или несколькими областями и за обработку запросов чтения и записи от клиентов. Регион-серверы также отвечают за деление областей и уведомление мастера о новых подобластях (дочерних областях), чтобы мастер мог вывести родительскую область из строя и заменить её подобластью.
png) HBase зависит от ZooKeeper, который по умолчанию управляет экземпляром ZooKeeper в качестве "авторитетного органа" (authoritative authority) для кластера. ZooKeeper отвечает за управление важной информацией, такой как местоположение таблицы корневого каталога (root catalog table) и адрес главного узла кластера. В случае, если серверы выключаются во время распределения областей, можно использовать ZooKeeper для координации распределения. Управление состоянием транзакций распределения в ZooKeeper позволяет легко продолжить распределение с состояния, оставленного вышедшим из строя сервером при восстановлении. В этой архитектуре клиенты, желающие узнать свойства кластера, должны получить местоположение сборки ZooKeeper (ensemble), переданное кластером, при запуске соединения с HBase. Только так клиенты смогут получить доступ к иерархии ZooKeeper и узнать свойства кластера. Службы HBase, зависящие от HBase, перечислены в файле conf/regionservers. Скрипты запуска и остановки HBase используют SSH для выполнения удалённых команд. Сайт-специфическая конфигурация кластера находится в файлах conf/hbase-site.xml и conf/hbase-env.sh.
HBase использует API файловой системы Hadoop для сохранения данных. Эта API предоставляет интерфейсы для различных файловых систем, таких как KFS, Amazon S3 и HDFS. В большинстве случаев используется HDFS для хранения данных при работе с HBase. Однако по умолчанию HBase записывает данные в локальную файловую систему. ##### Механизм работы HBase Внутри HBase хранятся специальные каталоговые таблицы (-ROOT- и .META.), которые используются для поддержания списка всех областей, их состояния и местоположения на текущем кластере. Таблица -ROOT- содержит список областей таблицы .META.. Таблица .META. содержит список используемых областей пользовательского пространства (user-space region). Элементы таблицы используют имя области в качестве ключа. Имя области состоит из имени таблицы, номера начальной строки области, времени создания области и общего MD5-хэша. Поскольку ключи строк отсортированы по возрастанию, для поиска области, содержащей конкретную строку, достаточно найти в каталоге таблицу первый элемент с ключом, большим или равным данному ключу строки. При разделении области, отключении/включении, удалении области, перераспределении области для балансировки нагрузки или перераспределении области после сбоя регионального сервера (region server), каталоговая таблица обновляется соответствующим образом. Это позволяет поддерживать актуальную информацию о состоянии всех областей в кластере.Новые клиенты, подключающиеся к кластеру ZooKeeper, сначала ищут положение области -ROOT-. Затем клиент использует -ROOT- для получения положения области .META., содержащей запрошенную строку. Затем клиент ищет область .META. для получения узла, содержащего информацию о положении областей пользовательского пространства. После этого клиент может непосредственно взаимодействовать с региональным сервером, управляющим данной областью. Каждое действие с строкой может требовать до трех обращений к удаленным узлам. Чтобы сэкономить на этих обращениях, клиенты сохраняют информацию, полученную при прохождении по -ROOT-, положение .META. и начальную и конечную строки областей пользовательского пространства. Клиент будет использовать сохраненные элементы до тех пор, пока не произойдет ошибка. При возникновении ошибки клиент будет искать новое положение области .META.. Если .META. также перемещена, клиент будет искать -ROOT-.Записи, достигающие регионального сервера, сначала добавляются в "журнал подтверждений" (commit log), а затем добавляются в память в memstore. Если memstore заполнена, её содержимое записывается (flush) в файловую систему. Сообщения о коммитах хранятся в HDFS, поэтому даже если один regionserver выходит из строя, сообщения о коммитах остаются доступными. Они не могут быть доступны (обычно из-за истечения срока действия узла znode в ZooKeeper), но мастер HBase использует эти сообщения о коммитах для разделения регионов, принадлежащих упавшему regionserver. После перераспределения регионы, принадлежащие упавшему regionserver, будут открыты и использованы. Эти регионы будут искать файлы, которые были созданы из разделённых сообщений о коммитах, содержащие ещё не сохранённые изменения. Эти изменения будут воспроизведены (replayed), чтобы восстановить регионы до состояния, которое они имели до сбоя.При чтении сначала проверяется memstore региона. Если нужная версия найдена в memstore, запрос завершается. В противном случае, необходимо последовательно проверять "файлы сброса" (flush files) от новейшего к самому старому, пока не будет найдена подходящая версия или пока не будут проверены все файлы сброса.
Есть фоновый процесс, который отвечает за сжатие файлов сброса, когда их количество достигает определённого порога. Он объединяет несколько файлов в один. Это делается потому, что проверка меньшего количества файлов повышает производительность операций чтения. При сжатии (compaction) процесс удаляет версии, превышающие максимальное значение, установленное в конфигурации, а также удаляет ячейки или помечает их как устаревшие. На regionserver существует другой независимый процесс, который отслеживает размер файлов сброса, и если размер файла превышает предустановленное максимальное значение, регион будет разделён.
Для запуска HBase в распределённой среде сначала необходимо запустить Hadoop, чтобы HBase мог работать поверх HDFS. Как уже упоминалось, распределённая HBase требует координации ZooKeeper. Поэтому сначала нужно установить ZooKeeper. Конфигурационный файл ZooKeeper выглядит следующим образом:```conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper/data dataLogDir=/tmp/zookeeper/log
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
Убедитесь, что конфигурационный файл `conf/zoo.cfg` для трех серверов настроены в соответствии с вышеуказанными параметрами. Обратите внимание, что директории `dataDir` и `dataLogDir`, указанные в конфигурационном файле, должны быть созданы вручную. В конфигурационном параметре `server.1=master:2888:3888`, `server.1` представляет собой сервер с номером 1, а `master` — это имя хоста или IP-адрес хоста. Порт 2888 используется для обмена сообщениями между сервером и лидером кластера, а порт 3888 используется для выбора лидера.
Затем вам нужно создать файл `myid` в директории `${dataDir}`, содержащий номер текущего сервера. Например, для сервера `server.1` в файле `${dataDir}/myid` следует указать число `1`. После этого выполните скрипт `${zookeeper}/bin/zkServer.sh` для запуска ZooKeeper.
root@master:/usr/lib/apache/zookeeper-3.4.9# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/lib/apache/zookeeper-3.4.9/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
Для проверки состояния запущенных Java-приложений выполните команду `jps`.
root@master:/usr/lib/apache/zookeeper-3.4.9# jps 1410 SecondaryNameNode 1877 Jps 1829 QuorumPeerMain 1195 NameNode 381 ResourceManager
`1829 QuorumPeerMain` означает, что для этого экземпляра ZooKeeper используется процесс с номером 1829. Далее переходим в директорию установки HBase ${hbase} для конфигурации HBase. 1. Конфигурация файла conf/hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/tmp/zookeeper/data</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
</configuration> `hbase.rootdir` — это директория в HDFS, используемая в качестве корневого пути для HBase. `hbase.zookeeper.quorum` используется для указания серверов Zookeeper, несколько серверов разделены запятой. `hbase.zookeeper.property.clientPort` используется для указания порта клиента Zookeeper. 2. conf/hbase-env.sh
```sh
# Используемая реализация Java. Требуется Java 1.7+.
# export JAVA_HOME=/usr/java/jdk1.6.0/
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_111
# Дополнительные элементы Java CLASSPATH. Необязательно.
# export HBASE_CLASSPATH=
# Дополнительные опции времени выполнения Java.
# Ниже приведены значения по умолчанию. Может работать только с JDK Sun.
# Для получения дополнительной информации о том, почему это так, а также других возможных настройках,
# посетите http://wiki.apache.org/hadoop/PerformanceTuning
export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
# Настройка PermSize. Необходима только для JDK7. Вы можете безопасно удалить её для JDK8+.
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
``` export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_111
— это путь к системному JDK, export HBASE_MANAGES_ZK=false
означает, что HBase использует пользовательский Zookeeper вместо встроенного Zookeeper. Когда используется пользовательский Zookeeper, этот параметр обязателен. Затем запустите ${hbase}/bin/start-hbase.sh
.
root@master:/usr/lib/apache/hbase-1.2.4# start-hbase.sh
starting master, logging to /usr/lib/apache/hbase-1.2.4/logs/hbase--master-master.out
slave1: starting regionserver, logging to /usr/lib/apache/hbase-1.2.4/bin/../logs/hbase-root-regionserver-slave1.out
slave2: starting regionserver, logging to /usr/lib/apache/hbase-1.2.4/bin/../logs/hbase-root-regionserver-slave2.out
master: starting regionserver, logging to /usr/lib/apache/hbase-1.2.4/bin/../logs/hbase-root-regionserver-master.out
На этом HBase успешно запущен на распределённом кластере. Используйте команду jps
для проверки.
root@master:/usr/lib/apache/zookeeper-3.4.9# jps
1410 SecondaryNameNode
1829 QuorumPeerMain
2198 HRegionServer
1195 NameNode
2043 HMaster
381 ResourceManager
2255 Jps
Процесс с идентификатором 2043 является экземпляром узла master HBase. Для управления экземпляром HBase введите следующую команду для запуска оболочки HBase:
hbase shell
Это запустит JRuby IRB интерпретатор, расширенный специфическими командами HBase. Введите help
, чтобы просмотреть группированный список команд оболочки. Введите help COMMAND_GROUP
, чтобы получить справку по определенной группе команд, и help COMMAND
, чтобы получить справку по конкретной команде и примеры использования.Команды используют формат Ruby для указания списков и каталогов.
Чтобы создать новую таблицу, сначала дайте ей имя и определите её схему. Схема таблицы включает в себя атрибуты таблицы и список колонок. Каждая колонка также имеет атрибуты, которые можно определить последовательно при создании схемы. Например, атрибуты колонки включают, должна ли колонка быть сжата в файловой системе, сколько версий ячеек нужно сохранять и т. д. Схема может быть изменена, отключив таблицу с помощью команды disable, выполнив необходимые изменения с помощью команды alter, а затем снова активировав таблицу с помощью команды enable.
Чтобы создать новую таблицу с именем test, содержащую одну колонку data с атрибутами по умолчанию, введите следующую команду:
hbase(main):001:0> create 'test','data'
0 row(s) in 2.6780 seconds
Чтобы проверить, была ли таблица успешно создана, выполните команду list. Она выведет все таблицы в пользовательском пространстве:
hbase(main):002:0> list
TABLE
test
1 row(s) in 0.0370 seconds
Чтобы вставить данные в три различных строки и столбца в колонке data, а затем вывести содержимое таблицы, выполните следующие команды:
hbase(main):003:0> put 'test', 'row1', 'data:1', 'value1'
0 row(s) in 0.1320 seconds
```hbase(main):004:0> put 'test', 'row2', 'data:1', 'value2'
0 строк(и) в 0.0060 секунд
hbase(main):005:0> put 'test', 'row1', 'data:3', 'value3'
0 строк(и) в 0.0380 секунд
hbase(main):006:0> scan 'test'
ROW COLUMN+CELL
row1 column=data:1, timestamp=1490367514104, value=value1
row1 column=data:3, timestamp=1490367554494, value=value3
row2 column=data:1, timestamp=1490367528373, value=value2
2 строк(и) в 0.0360 секунд
hbase(main):007:0> put 'test', 'row3', 'data:3', 'value3'
0 строк(и) в 0.0040 секунд
hbase(main):008:0> put 'test', 'row4', 'data:4', 'value4'
0 строк(и) в 0.0050 секунд
hbase(main):009:0> scan 'test'
ROW COLUMN+CELL
row1 column=data:1, timestamp=1490367514104, value=value1
row1 column=data:3, timestamp=1490367554494, value=value3
row2 column=data:1, timestamp=1490367528373, value=value2
row3 column=data:3, timestamp=1490367628850, value=value3
row4 column=data:4, timestamp=1490367642886, value=value4
4 строк(и) в 0.0150 секунд
Чтобы удалить эту таблицу, сначала следует отключить её, а затем удалить:
hbase(main):011:0> disable 'test'
0 строк(и) в 4.3680 секунд
hbase(main):012:0> drop 'test'
0 строк(и) в 8.3250 секунд
hbase(main):013:0> list
TABLE
0 строк(и) в 0.0050 секунд
Закрыть экземпляр HBase можно, выполнив следующую команду:Текст для перевода не предоставлен. Пожалуйста, укажите текст, который требуется перевести.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )