Открыть сервис

Apache HBase

Apache HBase — это распределённая, масштабируемая, нереляционная база данных с открытым исходным кодом, работающая поверх распределённой файловой системы Hadoop (HDFS). Она спроектирована для хранения и обработки больших объёмов структурированных и полуструктурированных данных (петабайтного масштаба) в режиме реального времени, обеспечивая произвольный доступ на чтение и запись. HBase реализует модель данных, основанную на Bigtable — распределённой системе хранения, разработанной в Google. Проект является частью экосистемы Apache Hadoop и написан на языке Java.

История

Разработка HBase началась в 2006 году в компании Powerset (позднее приобретена Microsoft) как внутренняя реализация идей, изложенных в статье Google о Bigtable. В 2007 году проект был передан в инкубатор Apache Software Foundation, а в 2010 году получил статус подпроекта верхнего уровня Apache Hadoop. Первый стабильный релиз (0.20.0) состоялся в 2010 году. В 2012 году HBase стала самостоятельным проектом верхнего уровня Apache.

Ключевыми фигурами в развитии проекта были Майкл Стокер (Michael Stack), Ларс Джордж (Lars George) и Эндрю Путт (Andrew Purtell). Версия 1.0.0 вышла в 2015 году, версия 2.0.0 — в 2017 году, версия 3.0.0 — в 2023 году. Проект активно развивается сообществом, выпускаются регулярные обновления и исправления.

Архитектура и устройство

Модель данных

HBase представляет собой разреженную, распределённую, многомерную отсортированную карту. Данные организованы в таблицы, которые состоят из строк и столбцов. Ключевыми элементами модели являются:

  • Таблица (Table): Набор строк, идентифицируемых уникальным ключом строки (Row Key).
  • Строка (Row): Идентифицируется ключом строки (Row Key). Все операции с данными (чтение, запись, сканирование) выполняются по ключу строки.
  • Семейство столбцов (Column Family): Группа столбцов, объединённых по смыслу. Семейства столбцов задаются при создании таблицы и не могут быть изменены динамически. Все столбцы в семействе имеют общий префикс (например, cf:col1, cf:col2). Физически данные одного семейства столбцов хранятся вместе в файлах HFile.
  • Столбец (Column): Идентифицируется квалификатором (qualifier) внутри семейства столбцов. Квалификаторы могут быть добавлены динамически, без предварительного определения схемы.
  • Ячейка (Cell): Единица хранения, определяемая комбинацией (ключ строки, семейство столбцов, квалификатор, временная метка). Ячейка хранит значение (value) и имеет временную метку (timestamp), которая позволяет версионировать данные.
  • Версия (Version): Каждая ячейка может хранить несколько версий данных, идентифицируемых временной меткой. По умолчанию HBase хранит три последние версии.

Ключ строки

Ключ строки (Row Key) является первичным ключом и единственным индексом в HBase. Данные физически сортируются и хранятся в лексикографическом порядке по ключу строки. Правильный выбор ключа строки критически важен для производительности, так как позволяет эффективно выполнять сканирование диапазонов строк. Ключи строки могут быть произвольными байтовыми массивами (до 64 КБ).

Регионы

Таблицы HBase автоматически разбиваются на горизонтальные фрагменты, называемые регионами (Regions). Каждый регион содержит непрерывный диапазон ключей строк. Регионы являются единицей распределения и балансировки нагрузки. Когда регион становится слишком большим, он автоматически разделяется (split) на два дочерних региона. Регионы могут быть также объединены (merge) при необходимости.

HMaster

HMaster — это главный сервер (master server) в кластере HBase. Он отвечает за:

  • Управление метаданными таблиц и регионов.
  • Мониторинг состояния RegionServer.
  • Балансировку нагрузки между RegionServer (перемещение регионов).
  • Обработку сбоев RegionServer (перераспределение регионов с упавшего сервера).
  • Выполнение административных операций (создание, удаление, изменение таблиц).

В кластере может быть несколько HMaster, один из которых является активным, а остальные — резервными (standby). При отказе активного HMaster один из резервных берёт на себя его функции.

RegionServer

RegionServer — это рабочий сервер (worker server), который обслуживает регионы. Каждый RegionServer отвечает за:

  • Обработку запросов на чтение и запись данных от клиентов.
  • Управление кэшами (MemStore) и постоянным хранилищем (HFile).
  • Выполнение операций сжатия (compaction) данных.
  • Участие в процессе репликации и восстановления после сбоев.

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

ZooKeeper

Apache ZooKeeper является критически важным компонентом для координации и управления кластером HBase. Он используется для:

  • Выбора активного HMaster.
  • Хранения метаданных о расположении регионов (каталог -ROOT- и hbase:meta).
  • Отслеживания состояния RegionServer (эпидемия).
  • Синхронизации конфигурации между узлами кластера.

ZooKeeper обеспечивает согласованность и отказоустойчивость кластера HBase.

HDFS

Hadoop Distributed File System (HDFS) является основным хранилищем для данных HBase. HBase использует HDFS для хранения файлов данных (HFile) и файлов журнала (Write-Ahead Log, WAL). HDFS обеспечивает репликацию данных (по умолчанию 3 копии) и отказоустойчивость. HBase не зависит от HDFS и может работать поверх других файловых систем (например, Amazon S3, Azure Blob Storage), но HDFS — наиболее распространённый вариант.

Процесс записи и чтения

Запись данных

  1. Клиент отправляет запрос на запись (Put) в RegionServer, который обслуживает соответствующий регион.
  2. RegionServer сначала записывает данные в журнал Write-Ahead Log (WAL) на HDFS. Это обеспечивает долговечность и возможность восстановления после сбоя.
  3. Затем данные записываются в MemStore — изменяемую структуру данных в оперативной памяти RegionServer.
  4. Когда MemStore достигает определённого размера (по умолчанию 128 МБ), его содержимое сбрасывается (flush) на диск в виде файла HFile. HFile — это неизменяемый, отсортированный файл, хранящийся в HDFS.
  5. После сброса MemStore очищается, и процесс повторяется.

Чтение данных

  1. Клиент отправляет запрос на чтение (Get или Scan) в RegionServer, который обслуживает соответствующий регион.
  2. RegionServer сначала проверяет MemStore на наличие запрошенных данных.
  3. Если данные не найдены в MemStore, RegionServer проверяет файлы HFile в порядке их создания (от самого нового к самому старому).
  4. Для ускорения поиска в HFile используются блочные индексы и фильтры Блума (Bloom Filters).
  5. Найденные данные собираются и возвращаются клиенту.

Классификация и виды

HBase классифицируется как:

  • NoSQL база данных: Не использует реляционную модель и SQL.
  • Столбцовая база данных (Column-oriented): Данные хранятся по семействам столбцов, а не по строкам. Это позволяет эффективно читать только необходимые столбцы.
  • Распределённая база данных: Данные распределены по нескольким узлам кластера.
  • Масштабируемая база данных: Горизонтально масштабируется путём добавления новых узлов.
  • Отказоустойчивая база данных: Обеспечивает высокую доступность за счёт репликации и автоматического восстановления.

Существуют различные дистрибутивы и версии HBase, включая:

  • Apache HBase: Официальная версия с открытым исходным кодом.
  • Cloudera HBase: Версия, входящая в состав дистрибутива Cloudera Distribution Including Apache Hadoop (CDH).
  • Hortonworks HBase: Версия, входящая в состав дистрибутива Hortonworks Data Platform (HDP).
  • Google Cloud Bigtable: Управляемый сервис, совместимый с API HBase, но не являющийся прямым форком.
  • Amazon DynamoDB: Сервис, который также имеет API, совместимый с HBase (через DynamoDB Accelerator).

Применение

HBase используется в сценариях, где требуется:

  • Хранение и обработка больших объёмов данных (Big Data): Например, логи веб-серверов, данные сенсоров, временные ряды.
  • Произвольный доступ к данным в реальном времени: Например, для поиска по ключу, обновления профилей пользователей, отображения ленты новостей.
  • Аналитика в реальном времени: Совместно с Apache Spark, Apache Flink или Apache Storm.
  • Хранение временных рядов: Например, метрики мониторинга, данные IoT.
  • Хранение графовых данных: В сочетании с Apache TinkerPop или JanusGraph.
  • Хранение метаданных: Например, для каталогов данных, систем управления конфигурациями.

Примеры использования

  • **Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ) Messenger:** Использует HBase для хранения сообщений и метаданных.
  • Twitter: Использует HBase для хранения данных о пользователях и твитах.
  • Yahoo!: Использует HBase для хранения данных аналитики и поиска.
  • Adobe: Использует HBase для хранения данных о поведении пользователей.
  • Alibaba: Использует HBase для хранения данных логистики и электронной коммерции.

Критика и ограничения

  • Сложность администрирования: Требует глубоких знаний экосистемы Hadoop, ZooKeeper, HDFS и настройки JVM.
  • Отсутствие встроенных индексов: Единственный индекс — это ключ строки. Для поиска по другим столбцам требуется сканирование всей таблицы или использование внешних индексов (например, Solr, Elasticsearch).
  • Отсутствие поддержки транзакций: HBase поддерживает только атомарные операции на уровне одной строки (через механизм версий). Многострочные транзакции не поддерживаются.
  • Ограниченная поддержка SQL: HBase не имеет встроенного SQL-движка. Для выполнения SQL-запросов используются надстройки, такие как Apache Phoenix или Presto.
  • Проблемы с производительностью при частых обновлениях: Из-за неизменяемости HFile обновления приводят к созданию новых версий, что может вызвать фрагментацию и необходимость частых сжатий (compaction).
  • Зависимость от ZooKeeper: Отказ ZooKeeper может привести к недоступности всего кластера.

Интересные факты

  • HBase была названа в честь базы данных Hadoop (Hadoop Database).
  • Внутреннее представление данных в HBase (HFile) основано на формате SSTable, используемом в Google Bigtable.
  • HBase поддерживает репликацию данных между кластерами (cross-cluster replication), что позволяет создавать географически распределённые системы.
  • Существует проект Apache Phoenix, который предоставляет SQL-интерфейс поверх HBase, позволяя выполнять SQL-запросы к таблицам HBase.
  • HBase активно используется в проектах, связанных с Интернетом вещей (IoT) и машинным обучением, где требуется обработка больших потоков данных в реальном времени.

Источники

  • Apache HBase Reference Guide. Apache Software Foundation.
  • George, L. (2011). HBase: The Definitive Guide. O'Reilly Media.
  • White, T. (2015). Hadoop: The Definitive Guide. O'Reilly Media.
  • Документация Apache HBase на официальном сайте (hbase.apache.org).
  • Статья «Bigtable: A Distributed Storage System for Structured Data» (Google, 2006).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →