4.4 HBase. Масштабируемая колоночная база данных Flashcards
Типы нереляционных БД
1) Key-Value хранилища, они хранят базы данных в виде ключа и значения. В каждой её ячейке хранятся данные произвольного типа, а каждому значению присвоен уникальный ключ, по которому это значение можно найти.
2) Колоночные БД, куда относится и Apache HBase. Данные группируются для хранения не по строкам, а по столбцам. Если строго придерживаться позиционирования, то HBase это БД ориентированная на семейство колонок.
3) Документоориентированные БД, в них данные хранятся в виде иерархических структур (документов) с произвольным набором полей и их значений. Документы объединяются в коллекции. Яркий представитель — MongoDB.
4) Гра́фовые база данных — разновидность баз данных с реализацией сетевой модели в виде графа и его обобщений. Это Neo4j или InfiniteGraph.
Плюсы и минусы Key-Value БД
Наиболее быстрыми и удобными для доступа к записи в БД по ключу являются хранилища типа Key-Value (ключ-значение). Для таких БД характерна сложность алгоритма доступа к элементу равная О(1), т.е. условно-константная.
Но для таких БД неудобно создавать batch-обработки, т.к. они созданы для максимально быстрого доступа к единичным записям. Для таких обработок больше подходят хранилища на HDFS, например, Apache Hive.
Преимущества Apache HBase
- эффективный способ доступа по ключу (быстрый доступ к единичным записям);
- поддерживает Scan (доступ к диапазонам ключей, batch-обработки).
RowKey
Каждая запись в таблице проиндексирована при помощи первичного ключа, который называется RowKey.
ColumnFamily
Колонки группируются в группы колонок (ColumnFamily). Это контейнер для полей, который мы можем определять в момент вставки. На момент создания таблицы колонки не определяются, а определяются только ColumnFamily. Они объединены или бизнес-логикой, или близостью данных, которые мы хотим хранить вместе. Например, персональная информация и адреса.
Колонки не определяются схемой и могут быть добавлены «на лету». Внутри ColumnFamily мы можем создавать колонки и указывать их (колонки) только в момент вставки в БД. Это дает гибкость в хранении и использовании данных, избегая дополнительных накладных расходов.
Таблицы являются разреженными. Пустые значения не требуют дополнительного места для хранения.
Типы данных в HBase
В HBase нет такого понятия — “тип данных”, все по умолчанию определяется как массив byte. Мы сами должны знать какие данные и в каком виде мы записываем в таблицу.
Версии атрибутов в HBase
Для каждого атрибута может храниться несколько версий. Каждая версия имеет свой Timestamp. На уровне ColumnFamily мы можем настраивать дополнительную атрибутику по управлению количеством версий полей.
Записанное в Hbase значение не может быть изменено. Вместо этого необходимо добавить новую версию с более свежим timestamp’ом.
TTL
Есть возможность выставлять TTL (диапазон времени), который позволяет нам автоматически удалять устаревшие записи. Стоит использовать с осторожностью.
Удаление записи
Для удаления записи помечаются специальным маркером о совершении данной операции. Удаление данных из таблицы в HBase не происходит физически, а производится на другой стадии.
Краткая модель данных
- Распределенное, многомерное, разреженное, сортированное отображение
- (Table, RowKey, ColumnFamily, Column, Timestamp) -> value
Иерархия хранения данных
(Table, RowKey, ColumnFamily, Column, Timestamp) -> value
- Table - SortedMap<RowKey, Row> Таблица представляет из себя сортированный массив, который состоит из ключа (RowKey) и значения (Row - сама строка)
- Row - List<ColumnFamily> Строка является списком контейнеров под колонки (ColumnFamily)</ColumnFamily>
- ColumnFamily - SortedMap<Column, List<Entry>> Семейство колонок представляет из себя сортированный массив, состоящий из ключа (колонки) и значения (список значений колонки).</Entry>
- Entry - Tuple<Timestamp, Value> Значения поля является парой timestamp-а и самого значения
Такая чёткая иерархия позволяет точно производить навигацию по структуре данных без дополнительных накладных расходов на считывание всей строки и отсечения ненужных полей (как это происходит в обычных реляционных БД).
Get
получить все атрибуты для заданного ключа.
Put
добавить новую запись в таблицу (если записи не было) или обновить (если запись была). Timestamp этой записи может быть задан вручную, иначе он будет установлен автоматически, как текущее время.
Scan
позволяет итерироваться по диапазону ключа. Можно указать запись с которой начинается чтение, запись до которой нужно прочитать, количество записей которые необходимо считать, Column Family из которой будет производиться чтение и максимальное количество версий для каждой записи.
Delete
позволяет пометить запись как удаленную. HBase не удаляет данные сразу, а ставит маркер “могильный камень” — tombstone. Физическое удаление произойдет на Major Compaction.