Типы нереляционных БД
1) Key-Value хранилища, они хранят базы данных в виде ключа и значения. В каждой её ячейке хранятся данные произвольного типа, а каждому значению присвоен уникальный ключ, по которому это значение можно найти.
2) Колоночные БД, куда относится и Apache HBase. Данные группируются для хранения не по строкам, а по столбцам. Если строго придерживаться позиционирования, то HBase это БД ориентированная на семейство колонок.
3) Документоориентированные БД, в них данные хранятся в виде иерархических структур (документов) с произвольным набором полей и их значений. Документы объединяются в коллекции. Яркий представитель — MongoDB.
4) Гра́фовые база данных — разновидность баз данных с реализацией сетевой модели в виде графа и его обобщений. Это Neo4j или InfiniteGraph.
Плюсы и минусы Key-Value БД
Наиболее быстрыми и удобными для доступа к записи в БД по ключу являются хранилища типа Key-Value (ключ-значение). Для таких БД характерна сложность алгоритма доступа к элементу равная О(1), т.е. условно-константная.
Но для таких БД неудобно создавать batch-обработки, т.к. они созданы для максимально быстрого доступа к единичным записям. Для таких обработок больше подходят хранилища на HDFS, например, Apache Hive.
Преимущества Apache HBase
RowKey
Каждая запись в таблице проиндексирована при помощи первичного ключа, который называется RowKey.
ColumnFamily
Колонки группируются в группы колонок (ColumnFamily). Это контейнер для полей, который мы можем определять в момент вставки. На момент создания таблицы колонки не определяются, а определяются только ColumnFamily. Они объединены или бизнес-логикой, или близостью данных, которые мы хотим хранить вместе. Например, персональная информация и адреса.
Колонки не определяются схемой и могут быть добавлены «на лету». Внутри ColumnFamily мы можем создавать колонки и указывать их (колонки) только в момент вставки в БД. Это дает гибкость в хранении и использовании данных, избегая дополнительных накладных расходов.
Таблицы являются разреженными. Пустые значения не требуют дополнительного места для хранения.
Типы данных в HBase
В HBase нет такого понятия — “тип данных”, все по умолчанию определяется как массив byte. Мы сами должны знать какие данные и в каком виде мы записываем в таблицу.
Версии атрибутов в HBase
Для каждого атрибута может храниться несколько версий. Каждая версия имеет свой Timestamp. На уровне ColumnFamily мы можем настраивать дополнительную атрибутику по управлению количеством версий полей.
Записанное в Hbase значение не может быть изменено. Вместо этого необходимо добавить новую версию с более свежим timestamp’ом.
TTL
Есть возможность выставлять TTL (диапазон времени), который позволяет нам автоматически удалять устаревшие записи. Стоит использовать с осторожностью.
Удаление записи
Для удаления записи помечаются специальным маркером о совершении данной операции. Удаление данных из таблицы в HBase не происходит физически, а производится на другой стадии.
Краткая модель данных
Иерархия хранения данных
(Table, RowKey, ColumnFamily, Column, Timestamp) -> value
Такая чёткая иерархия позволяет точно производить навигацию по структуре данных без дополнительных накладных расходов на считывание всей строки и отсечения ненужных полей (как это происходит в обычных реляционных БД).
Get
получить все атрибуты для заданного ключа.
Put
добавить новую запись в таблицу (если записи не было) или обновить (если запись была). Timestamp этой записи может быть задан вручную, иначе он будет установлен автоматически, как текущее время.
Scan
позволяет итерироваться по диапазону ключа. Можно указать запись с которой начинается чтение, запись до которой нужно прочитать, количество записей которые необходимо считать, Column Family из которой будет производиться чтение и максимальное количество версий для каждой записи.
Delete
позволяет пометить запись как удаленную. HBase не удаляет данные сразу, а ставит маркер “могильный камень” — tombstone. Физическое удаление произойдет на Major Compaction.
Утилита HBase shell
HBase shell – командная оболочка HBase. Доступна сразу после установки HBase на любой ноде кластера. HBase shell представляет из себя jruby-консоль (синтаксис команд подобен языку ruby) cо встроенной поддержкой всех основных операций по работе с HBase (создание БД, таблиц, добавление данных, сканы и т.д.). Разработчики как правило не используют HBase shell в работе, в отличие от администраторов..
Архитектура HBase (компоненты)
1) HMaster
2) Zookeeper
3) Region Server
4) Region
5) Write Ahead Log (WAL) или HLog
6) MemStore
HMaster
главный сервер, который мониторит, управляет и координирует процессы в кластере. Управляет распределением регионов по Region Server’ам, ведет реестр регионов, управляет запусками регулярных задач. В ранних версиях был один, далее их стало несколько.
Функции:
* Главный процесс в HBase, ведет реестр всех активных регионов.
Zookeeper
инструмент для поддержки информации о конфигурации, системных настройках и обеспечения синхронизации. Хранит информацию о расположении метатаблицы в HBase, в которой описана вся топология кластера, а также настройки подключения к HMaster-у. Является точкой входа для клиента (приложения). Может быть несколько нод Zookeeper-a.
Т.е. клиент сперва обращается к Zookeeper-у, чтобы узнать топологию и как подключаться к кластеру HBase.
Zookeper:
1) Специальный сервис, используемый для координации сервисов. Представляет из себя очень «живучую» key-value базу данных, поддерживающая механизмы Pub/Sub (публикация и подписка на изменения по ключу).
2) Каждый Region Server и HMaster Server периодически отправляют heartbeat в Zookeeper и он проверяется статус. В случае потери инициирует сообщения о необходимости восстановления.
3) Активный HMaster отравляет сообщения в Zookeeper, inactive HMaster следит за активным. В случае падения сам становится активным.
4) Если Region Server не отправляет уведомления HMaster запускает процесс восстановления.
5) Zookeeper обслуживает путь до .META таблицы.
Region Server
Все операции клиент производит не через HMaster, а напрямую с серверами, которые называются Region Server. Region Server представляет из себя либо сервер, либо виртуальную машину, которая управляет данными, которые хранятся в HBase. Обслуживает, хранит и управляет одним или несколькими регионами.
Region
отсортированная часть строк таблицы (диапазон записей в таблице соответствующих определенному диапазону подряд идущих RowKey). Каждый регион содержит:
1) Write Ahead Log (WAL) или HLog
2) MemStore
Write Ahead Log (WAL) или HLog
последовательный append-only лог произведённых операций. Так как данные при записи попадают в Memstore, существует некоторый риск потери данных из-за сбоя. Для того чтобы этого не произошло все операции перед осуществлением манипуляций попадают в специальный лог-файл. Это позволяет восстановить данные после любого сбоя.
MemStore
буфер на запись, хранилище данных, которые поступают в таблицу. Данные в MemStore накапливаются и хранятся некоторое время. При наполнении MemStore до некоторого критического значения данные записываются в новый файл HFile, а MemStore очищается.
HBase не работает с конкретными датанодами на HDFS, но HBase работает с клиентом HDFS, и не управляет тем, где физически хранятся данные.
MemStore:
* кэш на запись. В MemStore хранятся которые еще не были записаны на диск (HFile),
HFile
При наполнении MemStore до некоторого критического значения данные записываются в новый файл HFile: