Я наконец-то понимаю HBase, это непросто...

задняя часть HBase

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мою избранную статью на GitHub, Welcome Star.:GitHub.com/Zhongf UC очень…

Я слышал о распределенных и больших данных, когда не знал об этомHBaseДа, но я всегда был полупонятен в этом вопросе, давайте поговорим об этом в этой статье.

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

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

Я ответил на план проектирования реляционной базы данных, он примерно сказал:Этот сценарий более сложный и изменчивый, почему бы не рассмотреть базу данных NoSQL, например HBase, для хранения??

Я сказал: "да да да да" (правда, я тогда не знал, что такое HBase, ноДолжен иметь импульса вы говорите нет)

В итоге интервьюер все-таки прислал мне предложение, но я не пошел, потому что был слишком далеко от дома.

1. Введение в HBase

ApacheHBase™ — этоHadoop database, a distributed, scalable, big data store.

HBase is a type of "NoSQL" database.

Apache HBase — это база данных Hadoop, распределенная, масштабируемаяхранилище больших данных.

HBase зависит от Hadoop. Почему HBase может хранить огромные объемы данных?Поскольку HBase построена поверх HDFS, которая является распределенной файловой системой..

2. Зачем использовать HBase

К настоящему времени Sanwai изучил множество компонентов, таких как распределенная поисковая система «Elasticsearch», распределенная файловая система «HDFS», распределенная очередь сообщений «Kafka», кэш-база данных «Redis» и т. д.

Промежуточное программное обеспечение (система), которое может обрабатывать данные, это промежуточное программное обеспечение в основном будет иметь функцию сохранения.. Зачем? Если зависает в какой-то момент, тоДанные все еще находятся в памяти, но еще не обработаныРазве не холодно?

Redis имеет AOF и RDB, Elasticsearch записывает данные в транслог, а затем объединяется с FileSystemCache для сброса данных на диск, Kafka сама записывает данные на диск последовательно....

Это промежуточное ПО будет реализовывать постоянство (например, HDFS и MySQL, которые мы используем для хранения данных). Почему мы все еще используем HBase?

Хотя нет никакого сравнения, но всегда возникает вопрос при обучении: "Раз изученные системы имеют схожие функции, то зачем мне изучать этот материал?"

Три мошенника понимают это так:

  • MySQL? Являемся ли мы самой используемой базой данных MySQL? Но, как мы все знаем, MySQLавтономныйиз. Сколько данных может хранить MySQL, зависит от размера жесткого диска на этом сервере. С текущим объемом данных в Интернете MySQL часто не может хранить такой объем данных.
    • Например, у меня есть система, которая может генерировать 1 ТБ данных в день, и хранить эти данные в MySQL невозможно. (Для такого большого объема данных наша текущая практика заключается в том, чтобы сначала писать в Kafka, а затем в Hive)
  • Кафка? Кафку мы в основном используем для обработки сообщений (развязка асинхронного пикового отсечения). Данные в Kafka, Kafka сохранит данные на жесткий диск, а Kafka распределена (очень удобное расширение), теоретически Kafka может хранить большие данные. Но данные Кафки мыне вывезут "в одиночку". Чаще всего постоянные данные используются для сброса смещения и выполнения операции «обратного отслеживания».
  • Редис? Redis — это кешированная база данных, все операции чтения и записи выполняются в памяти, и скорость очень высокая. Данные, хранящиеся в AOF/RDB, будут загружены в память, Redis не подходит для хранения большого объема данных (потому что память слишком дорогая!).
  • Эластичный поиск? Elasticsearch — это распределенная поисковая система, в основном используемая для поиска. Теоретически Elasticsearch также может хранить огромные объемы данных (в конце концов, распределенных), и мы также можем использовать «индекс» для извлечения данных, что кажется идеальным промежуточным программным обеспечением.
    • Но если наши данныеНет необходимости часто «извлекать», На самом деле его не нужно размещать в Elasticsearch.Запись данных в Elasticsearch требует сегментации по словам, что несомненно приведет к трате ресурсов.
  • HDFS? Очевидно, что HDFS может хранить массивные данные, и она создана для массивных данных. У него также есть очевидные недостатки: он не поддерживает случайную модификацию, низкая эффективность запросов и не дружит с поддержкой небольших файлов.

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

Как упоминалось в начале статьи, HBase построен на распределенной файловой системе HDFS. Другими словами, данные HBase фактически хранятся в HDFS. Тогда должны быть любопытные младенцы, которые будут спрашивать:В чем разница между HDFS и HBase??

HDFS — это файловая система, а HBase — это база данных, по сути, никакого сравнения. "Вы можете думать о HBase как о MySQL, а о HDFS — как о жестких дисках. HBase — это просто база данных NoSQL, которая хранит данные в HDFS.".

База данных – этоНабор данных, хранящихся в организованном порядке.

После стольких разговоров, почему мы используем HBase? HBase предоставляет поверх HDFSВысокая одновременная случайная запись и поддержка запросов в реальном времени, который недоступен в HDFS.

Я всегда говорю, что прежде чем изучать технологию, вы должны сначала понять, что она делает. Если мы просто посмотрим на «сравнение» выше, мы обнаружим, что HBase можетбюджетныйПриходитьВместительное хранилищеданных и поддерживает большое количество одновременных случайных операций записи и запросов в реальном времени.

Но еще одна особенность HBase:«Структура», в которой хранятся данные, может быть очень гибкой.(Об этом будет упомянуто ниже, если вы не коснулись HBase здесь, вы можете не знать, что это значит).

3. Начало работы с HBase

Студенты, которые слышали о HBase, возможно, слышали слово «хранилище столбцов». Вначале я думал, что HBase сложно понять только из-за его «хранилища столбцов», я никогда не понимал, почему это «столбец».

В Интернете также есть много блогов, объясняющих, что такое «столбцовое» хранилище, и они ссылаются на наши существующие базы данных, такие как MySQL. Структуру хранилища легко понять, просто ряд за рядом данных.

Как выглядит преобразование в так называемое столбчатое хранилище?

Можно легко обнаружить, чтоИзвлеките каждый столбец и свяжите его с идентификатором. Это называется столбцовым хранилищем?у меня тут вопросительный знак.

преобразованные данныеС моей точки зрения, данные по-прежнему построчно.

Есть ли польза от этого? Очевидно, раньше мы записывали несколько атрибутов (столбцов) в одну строку, и часть столбцов была свободна, но нам все еще требовалось место для их хранения. Теперь разбираем все эти колонки, будем хранить то, что есть, так чтопространство может быть полностью использовано нами.

На что больше похожа эта форма данных? очевидноKey-ValueЧто ж. Итак, как мы понимаем так называемое столбцовое хранилище HBase иKey-ValueЧто насчет структуры? Зайдите в маленькую голову Санвэя и узнайте.

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

При взгляде на модель данных HBase на самом деле лучше не использовать знание «реляционной базы данных», чтобы понять ее.

In HBase, data is stored in tables, which have rows and columns. This is a terminology overlap withrelational databases (RDBMSs), but this is not a helpful analogy.

HBase также имеет концепцию таблицы, строки и столбца.

  • Про стол и говорить нечего, это просто стол
  • Строка данных состоит изключ строкииодин или несколько связанных столбцов и их значениясоставленный

Ну, а теперь немного более абстрактно. В HBase поиск строки данных будет иметь уникальное значение, которое называется ключом строки (RowKey). И столбцы в HBase — это не те столбцы, которые мы себе представляли в реляционных базах данных.

Столбцы HBase (Column) должен быть назначен семейству столбцов (Column Family)середина. В HBase с модификаторами столбцов (Column Qualifier) для идентификации каждого столбца.

В HBase сначала идут семейства столбцов, за которыми следуют столбцы..

Что такое семейство столбцов? Его можно просто понять как: атрибут столбцакатегория

Что такое модификаторы столбцов?За семейством столбцов следует столбец, а модификатор столбца используется для идентификации столбца в семействе столбцов..

Это довольно абстрактно, не так ли? Три криво нарисовать картинку:

Давайте поставим какие-то конкретные значения, чтобы было легче понять:

В этой таблице у нас есть два семейства столбцов, а именноUserInfoиOrderInfo. В разделе UserInfo есть два столбца, ониUserInfo:nameиUserInfo:age,существуетOrderInfoНиже есть две колонки, которыеOrderInfo:orderIdиOrderInfo:money.

UserInfo:nameЗначение: три кривых.UserInfo:age24.OrderInfo:orderIdэто 23333.OrderInfo:money30. Первичный ключ (RowKey) этих данных равен 1.

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

В каждой строке таблицы HBase столбцы состоят изгибкийиз,Столбцы не обязательно должны быть одинаковыми от строки к строке. Как показано ниже:

другими словами:Столбцы могут быть добавлены произвольно в семейство столбцов без каких-либо ограничений.

Когда данные записываются в HBase, они будут записаныотметка времени, эта метка времени принимается заВерсия. Например, мыизменить или удалитьВ определенное время он по сути собирается внутрьновыйДля фрагмента данных версия записи увеличивается на единицу.

Например, теперь у нас есть запись:

Теперь нам нужно изменить значение этой записи на 40, что на самом деле означает добавить еще одну запись и прочитать ее в соответствии с отметкой времени.читать последниезапись о. Во внешнем мире «выглядит», что эта запись была изменена.

3.2 Ключ-значение HBase

HBase по существуKey-Valueбазу данных, в последний раз, когда мы училисьKey-ValueБаза данных по-прежнему Redis. Тогда что такое Key в HBase? Что такое ценность?

Давайте посмотрим на HBase нижеKey-ValueСтруктурная схема:

Ключ состоит из RowKey (ключ строки) + ColumnFamily (семейство столбцов) + Column Qualifier (модификатор столбца) + TimeStamp (отметка времени — версия) + KeyType (тип), а Value — фактическое значение.

Сравнивая приведенный выше пример, на самом деле легко понять, потому что, когда мы модифицируем часть данных, мы фактически добавляем версию на исходной основе, тогда нам нужноТочное позиционированиеЗатем часть данных (RowKey+Column+Timestamp).

Что такое KeyType? Выше мы упомянули только случай «модификации».Вы когда-нибудь задумывались о том, что делать, если вы хотите удалить часть данных? На самом деле запись тоже добавляется, но мы можем установить для нее значение «Удалить» в KeyType.

3.3 Архитектура HBase

После стольких разговоров, мы уже поговорили о модели данных и Key-Value HBase, у нас остался вопрос: «Почему люди часто говорят, что HBase — это столбцовое хранилище?»

На самом деле HBase больше "хранилище семейства столбцов», чтобы говорить о хранилище семейства столбцов, вы должны сначала понять, на что похожа архитектура HBase.

Давайте сначала посмотрим на архитектурную схему HBase:

1,ClientClient, он предоставляет интерфейс для доступа к HBase и поддерживает соответствующий кэш для ускорения доступа к HBase.

2,ZookeeperСохраните метаданные (метатаблицу) HBase, будь то чтение или запись данных, перейдите в Zookeeper, чтобы получить метаданные.Сообщите клиенту, на какую машину читать и записывать данные

3.HRegionServerОн обрабатывает запросы клиента на чтение и запись, отвечает за взаимодействие с нижним уровнем HDFS и является реальным рабочим узлом.

Общий процесс выглядит следующим образом: клиент запрашивает Zookeeper, затем Zookeeper возвращает клиенту адрес HRegionServer, клиент получает адрес, возвращенный Zookeeper для запроса HRegionServer, а HRRegionServer считывает и записывает данные и возвращает их клиенту.

3.4 Внутри HRegionServer

Давайте посмотрим на картинку ниже:

Как упоминалось ранее, HBase может хранить огромные объемы данных, а HBase является распределенным. Таким образом, мы можем сделать вывод, что:Данные таблицы в HBase будут распределены по нескольким машинам.. Так как же HBase вырезает данные из таблицы? используетсяRowKeyДля сегментации, по сути, это таблицагоризонтальныйрезать.

Грубо говоря, этоHRegion, который хранит часть данных в таблице HBase.

HRegion имеет нижеStore, что такое Магазин? Мы также говорили ранее, что таблица HBase должна быть сначала определена.семейство столбцов, а затем столбцы находятся в семействе столбцов, и столбцы можно добавлять по желанию.

Семейство столбцов данных хранитсявместе, поэтому данные семейства столбцов хранятся в хранилище.

Видя это, мы действительно можем подумать, что HBase основан на хранилище семейства столбцов (в конце концов, физическое хранилище, семейство столбцов хранится в том же Store).

Что есть в магазине? имеютMem Store、Store File、HFile, давайте посмотрим, что это значит.

Когда HBase записывает данные, он сначала записывает вMem Store,когдаMemStoreЕсли он превышает определенный порог, данные в памяти будут сброшены на жесткий диск, образуяStoreFileStoreFileНижний слойHFileформат сохранен,HFileнаходится в HBaseKeyValueФормат хранения данных.

так:Mem StoreМы можем понять это как буфер памяти,HFileформат данных, который фактически хранится в HBase, иStoreFileПросто имя в HBase.

Возвращаясь к HRegionServer, мы также упустили часть, а именноHLog.

Тут на самом деле очень легко понять.Когда мы пишем данные, мы сначала записываем их в память.Чтобы машина не зависла,данные в памяти зависают до того,как они будут сброшены на диск. мы пишемMem storeтакже напишетHLog.

этоHLogЗаписывается на диск последовательно, так что скорость все равно довольно высокая (похоже ли это на дежавю)...

Подводя итог:

  • HRegionServer — настоящая рабочая машина (для взаимодействия с hdfs), наша таблица HBase использует RowKey для горизонтального разделения таблицы
  • В HRegion будет несколько хранилищ, и каждое хранилище на самом деле представляет собой данные семейства столбцов (поэтому мы можем сказать, что HBase основан на хранилище семейства столбцов).
  • В Store есть Men Store и StoreFile (HFile), по сути, это структура обхода сначала слоя памяти, а потом его браширования на диск.

3.5 Забытый HMaster

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

Итак, какую роль HMaster играет в HBase? ?

HMaster is the implementation of the Master Server. The Master server is responsible for monitoring all RegionServer instances in the cluster, and is the interface for all metadata changes.

HMaster обрабатывает назначение или передачу HRegion. Если объем данных в нашем HRRegion слишком велик, HMasterПереназначить региональный сервер. (Если будет найден недопустимый HRegion, недопустимый HRRegion также будет выделен обычному HRRegionServer)

HMaster обрабатывает изменения метаданных и отслеживает состояние RegionServer.

В-четвертых, дизайн RowKey

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

В HBase есть три метода запроса:

  1. глобальное сканирование
  2. Запрос на основе RowKey
  3. Отфильтровано по RowKeyСфераЗапрос

4.1 Запрос на основе RowKey

Первое, что нам нужно знать, это то, что RowKey будет нажиматьлексикографический порядокДля сортировки наша таблица HBase будет использовать RowKey для горизонтального разделения таблицы.

Будь то чтение или запись, мы используем RowKey для определения местоположения HRegion, а затем находим HRRegionServer. Вот очень важный вопрос:Итак, как я узнаю, что этот RowKey находится в этом HR-регионе??

В HRegion есть два важных свойства:start-keyиend-key.

Когда мы находим HRegionServer, мы фактически определяем, находится ли наш RowKey в этом HRegion или нет.start-keyиend-keyВ пределах диапазона, если он есть, значит, мы его нашли.

На этот раз возникнет проблема: поскольку наш RowKey отсортирован в лексикографическом порядке, если мы ничего не делаем с RowKey, он может существовать.Данные точки доступаПроблема.

Например, теперь наш RowKey выглядит следующим образом:

java3y111
java3y222
java3y333
java3y444
java3y555
aaa
bbb
java3y777
java3y666
java3y...

Java3yxxxВ начале есть много RowKeys и несколько других RowKeys. если у нас есть несколькоHRegion, затем сохранитеJava3yxxxОбъем данных HR-региона является самым большим, а количество HR-регионов, выделенных другим, очень мало.

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

Если это так, что нам делать? правильноХэш RowKeyЭто хорошо, тогда распределение по HRegion более равномерное, и проблема хот-спотов меньше.

Руководство по оптимизации HBase:

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

'Группа RowKey для данного разделения, например: aaaaa,bbbbb,ccccc, или заданного, например: startKey=00000000,endKey=xxxxxxxxx,regionsNum=x'

первый способ:

Это указывает точку разделения RowKey, чтобы разделить количество регионов.Например, если есть набор данных RowKey [1, 2, 3, 4, 5, 6, 7], данный разделенный RowKey равен 3 , 6, то он будет разделен Три начальные области [1,3), [3,6), [6,7).Если состав и распределение данных RowKey очень ясно, вы можете использовать этот метод для предварительной -разделить точно.

второй способ :

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

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

4.2 Запрос на основе диапазона RowKey

Вышеупомянутая ситуация относится к бизнесу, который запрашивает один RowKey. Если мы запрашиваем на основе диапазона RowKey, то нет необходимости делать вышеописанное.

HBase проектирует RowKey для лексикографической сортировки.Если ограничений нет, вполне вероятно, что похожие RowKeys хранятся в одном и том же HR-регионе. Тогда у меня есть бизнес в этом сценарии, так что мой запрос не намного быстрее?Я могу получить нужные мне данные в том же HR-регионе.

Например: мы будем каждые несколько секунд собирать данные о тепле помещения в прямом эфире, записывать эти данные в HBase, а затем бизнес-сторона часто запрашивает тепло хоста в течение определенного периода времени.

Я разработал RowKey, чтобы записывать популярность хоста за определенный период времени в один и тот же HRegion.При извлечении просто получите доступ к одному HRegionServer, чтобы получить все данные, которые мне нужны, и скорость запроса намного выше.

Наконец

Наконец, я познакомлю вас с тем, что написано в этой статье:

  1. HBase — это база данных NoSQL, обычно мы используем ее для хранения больших объемов данных (поскольку она построена на распределенной файловой системе HDFS).
  2. Строка в HBase состоит из RowKey и одного или нескольких столбцов и их значений. Сначала идут семейства столбцов, а затем столбцы, и столбцы можно добавлять по желанию.
  3. Записи добавления, удаления и изменения HBase имеют «версии», которые по умолчанию реализованы в виде временных меток.
  4. Если дизайн RowKey не имеет особого значения, лучше всего оформить его в виде хэша, чтобы избежать распространения горячих данных в том же HRegionServer.
  5. Чтение и запись HBase проходят через Zookeeper, чтобы извлечь метаданные, найти соответствующий HRegion, а затем найти HRegionServer.

Использованная литература:

Резюме различных точек знаний

Следующие статьи имеют соответствующиеоригинально и красивоPDF, в постоянном обновлении, вы можете прийти ко мне, чтобы призвать к обновлению ~

Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже более 8 тысяч звезд):

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

Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).

Поставьте лайк Санваю, это очень важно для Санвая!