Команда должна поделиться знаниями о HBase. Раньше я изучал его в течение определенного периода времени, и знания относительно разбросаны. На этот раз я систематически систематизирую их. Тогда, когда я думаю о HBase, достаточно прочитать один статья.
Обзор
характеристика
Hbase — это база данных NoSQL, что означает, что она не поддерживает SQL в качестве языка запросов, как традиционные базы данных RDBMS. Hbase — это база данных с распределенным хранилищем. С технической точки зрения, она больше похожа на распределенное хранилище, чем на распределенную базу данных. В ней отсутствуют многие функции систем СУБД, такие как типы столбцов, вспомогательные индексы, триггеры и расширенные языки запросов. Итак, каковы особенности Hbase? следующее:
- Сильная согласованность чтения и записи, но не «конечно согласованное» хранилище данных, что делает его идеальным для агрегации высокоскоростных вычислений.
- Автоматический шардинг, который рассредоточен в кластере по Региону, при увеличении количества строк, Регион тоже будет автоматически делиться и перераспределяться.
- автоматический переход на другой ресурс
- Интеграция с Hadoop/HDFS, готовая работа с HDFS, без проблем с подключением
- Богатый «краткий и эффективный» API, Thrift/REST API, Java API
- Кэш блоков, фильтр Блума, эффективная оптимизация запросов столбцов
- Управление операциями, Hbase предоставляет встроенный веб-интерфейс для работы, а также может отслеживать индикаторы JMX.
Когда использовать Hbase?
Hbase не подходит для решения всех задач:
- Прежде всего, база данных должна быть достаточно большой.Если есть миллиарды и десятки миллиардов строк данных, то хорошим вариантом будет Hbase.Если всего несколько миллионов строк или даже меньше, чем количество данных, RDBMS хороший выбор. Поскольку объем данных невелик, количество машин, которые действительно могут работать, невелико, а остальные машины находятся в состоянии простоя.
- Во-вторых, если вам не нужны вспомогательные индексы, статически типизированные столбцы, транзакции и другие возможности, система, которая уже использует СУБД, хочет перейти на Hbase, вам необходимо перепроектировать систему.
- Наконец, убедитесь, что аппаратных ресурсов достаточно, каждый кластер HDFS не может работать хорошо, если имеется менее 5 узлов. Поскольку количество репликаций по умолчанию в HDFS равно 3 плюс один NameNode.
Hbase также может работать в автономной среде, но используйте его в среде разработки.
Внутреннее приложение
- Храните бизнес-данные: информацию о GPS автомобиля, информацию о местоположении водителя, информацию о работе пользователя, информацию о доступе к устройству. . .
- Данные журнала хранения: данные мониторинга архитектуры (журнал входа в систему, журнал доступа к промежуточному ПО, журнал push-уведомлений, запись отправки SMS-сообщений...), информация журнала бизнес-операций.
- Хранение бизнес-вложений: система UDFS хранит информацию о вложениях, такую как изображения, видео, документы и т. д.
Однако, когда компания использует его, собственный Hbase API, как правило, не используется.Использование собственного API приведет к неконтролируемому доступу, влияя на стабильность системы и делая обновления версий неконтролируемыми.
Базовая архитектура
- Zookeeper, как распределенный координатор. RegionServer также записывает свою информацию в ZooKeeper.
- HDFS — это базовая файловая система, на которой работает Hbase.
- RegionServer, понимаемый как узел данных, хранит данные.
- Главный региональный сервер должен сообщать информацию главному серверу в режиме реального времени. Мастер знает глобальную работу RegionServer и может управлять отказоустойчивостью RegionServer и сегментацией региона.
Уточнение архитектуры
-
HMaster — это реализация главного сервера.Он отвечает за мониторинг экземпляров RegionServer в кластере и является интерфейсом для всех изменений метаданных.В кластере он обычно работает на NameNode.Вот более подробное введение в HMaster
- Интерфейсы, предоставляемые HMasterInterface, Table (createTable,modifyTable,remoTable,включить,отключить), ColumnFamily(addColumn,modifyColumn,removeColumn),Region(переместить,назначить,отменитьназначение)
- Фоновый поток, который запускает мастер: поток LoadBalancer, который управляет регионом для балансировки нагрузки кластера. Поток CatalogJanitor периодически проверяет таблицу hbase:meta.
-
HRegionServer — это реализация RegionServer, обслуживающая регионы и управляющая ими. RegionServer работает на DataNode в кластере.
- HRegionRegionInterface предоставляет интерфейсы: данные (получить, поместить, удалить, далее и т. д.), регион (splitRegion, compactRegion и т. д.)
- Фоновые потоки RegionServer: CompactSplitThread, MajorCompactionChecker, MemStoreFlusher, LogRoller
-
Регионы, представляющие таблицу, регион имеет несколько хранилищ (семейств столбцов), магазин имеет Memstore и несколько файлов хранилищ (HFiles), а нижний уровень файлов хранилищ — это блок.
дизайн хранения
В Hbase таблица делится на несколько более мелких блоков, а затем разбрасывается по разным серверам.Эти небольшие блоки называются регионами, а место, где хранятся регионы, называется RegionServer. Процесс Master отвечает за распределение регионов между различными серверами RegionServer. Классы HRegionServer и HRegion представляют RegionServer и Region в реализации Hbase. HRegionServer обрабатывает два типа файлов для хранения данных в дополнение к некоторым HRegions.
- HLog, файл журнала с упреждающей записью, также называемый WAL (журнал с упреждающей записью).
- Файл хранения реальных данных HFile
HLog
-
MasterProcWAL: HMaster записывает операции управления, такие как серверы разрешения конфликтов, создание таблиц и другие операции DDL, в свой файл WAL. Эти WAL хранятся в каталоге MasterProcWALs. В отличие от WAL RegionServer, WAL HMaster также поддерживает эластичные операции. То есть, если мастер сервер зависает, другие Мастера продолжат работу с этим файлом, когда они возьмут на себя управление.
-
WAL записывает все изменения данных HBase.Если RegionServer зависает, когда MemStore находится в состоянии FLushing, WAL может гарантировать, что изменения данных будут применены. Если запись в WAL завершается сбоем, вся операция по изменению данных завершается сбоем.
- Как правило, каждый регионы только экземпляр WAL. До 2,0 реализация WAL называется HLOG
- WAL находится в каталоге */hbase/WALs/*
- MultiWAL: если каждый RegionServer имеет только один WAL, поскольку HDFS должна быть непрерывной, WAL должен записываться непрерывно, и тогда возникнут проблемы с производительностью. MultiWAL позволяет RegionServer параллельно записывать несколько WAL через базовый многоконвейерный конвейер HDFS, что в конечном итоге повышает общую пропускную способность, но не улучшает пропускную способность одного региона.
-
WAL-конфигурация:
// 启用multiwal <property> <name>hbase.wal.provider</name> <value>multiwal</value> </property>
HFile
HFile — это формат, в котором HBase хранит данные в HDFS. Он содержит несколько слоев индексов, поэтому HBase не нужно полностью загружать весь файл при извлечении данных. Размер индекса (размер ключей, размер объема данных) влияет на размер блока.В случае больших наборов данных также принято устанавливать размер блока равным 1 ГБ на каждый региональный сервер.
Изучение метода хранения данных в базе данных на самом деле означает изучение того, как данные эффективно организованы на диске. Потому что мы обычно стремимся к тому, как эффективно читать и потреблять данные, а не к самому хранилищу данных.
Метод генерации h-файла
Сначала в HFile не было блока, а данные все еще существовали в MemStore.
Когда происходит Flush, создается HFile Writer и появляется первый пустой блок данных.Инициализированный блок данных резервирует место для части заголовка, которая используется для хранения информации метаданных блока данных.
Затем KeyValues, находящиеся в MemStore, добавляются один за другим к первому блоку данных, находящемуся в памяти:
Примечание: если настроено кодирование блока данных, оно будет синхронно кодироваться при добавлении значения ключа, а закодированные данные больше не являются простым режимом значения ключа. Кодирование блоков данных — это внутренний механизм кодирования, предоставляемый HBase для уменьшения структурного расширения KeyValue.
Прочитайте и напишите краткий процесс
Установка Hbase в автономном режиме
На этот раз для развертывания автономной версии Hbase отдельные демоны Hbase (Master, RegionServers и ZooKeeper) запускаются в одном и том же процессе JVM, а затем сохраняются в файловой системе. Это самое простое развертывание, но оно помогает нам лучше понять Hbase. После завершения установки мы продемонстрируем использование командной строки hbase.
окрестности
- CentOS 7
- Hbase 1.2.8
Установить отдельно
- Убедитесь, что jdk установлен, просто установите его прямо в Linux, используя собственный менеджер пакетов.Использование двоичного кода также является хорошим выбором.Я использую CentOS
yum install java-1.8.0-openjdk* -y
- Загрузите бинарный пакет Hbase, адрес загрузки находится по адресузеркало.биты.quota.capable/apache/bus…
tar -xf hbase-1.2.8-bin.tar.gz
cd hbase-1.2.8
- Настройте переменные среды hbase и измените JAVA_HOME. Обратите внимание на то, где находится ваш JAVA_HOME.
vim conf/hbase-env.sh
// 注意这个是在CentOS上的java位置
export JAVA_HOME=/etc/alternatives/java_sdk_1.8.0/
- Настройте onf/hbase-site.xml, который является основным файлом конфигурации Hbase.Вы можете указать каталог, в который записываются данные hbase и ZooKeeper, и, конечно же, вы можете указать, где находится корневой каталог hbase.
Я поместил каталог hbase в каталог hbase домашнего каталога пользователя hadoop. Нам не нужно заранее создавать каталог данных hbase, hbase автоматически создаст его для нас.Если каталог данных уже существует, hbase перенесет существующий каталог.
useradd -s /sbin/nologin -m hadoop
vim conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/hadoop/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
<description>
Controls whether HBase will check for stream capabilities (hflush/hsync).
Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
with the 'file://' scheme, but be mindful of the NOTE below.
WARNING: Setting this to false blinds you to potential data loss and
inconsistent system state in the event of process and/or node failures. If
HBase is complaining of an inability to use hsync or hflush it's most
likely not a false positive.
</description>
</property>
</configuration>
- В бинарном пакете Hbase есть скрипт start-hbase, который может легко запустить hbase, и если наша конфигурация правильная, он запустится нормально.
./bin/start-hbase.sh
После запуска вы можете открытьhttp://localhost:16010 Просмотр веб-сайта Hbase UI
Использование Hbase
Сначала мы можем предоставить инструмент командной строки, предоставляемый HBASE, расположенный в HBASE / Bin / Directory
- Подключиться к HBase
./hbase shell
- Для просмотра справочной информации введите
>help
- Для создания таблицы необходимо указать имя таблицы и имя кластера столбцов.
hbase(main):003:0> create 'test', 'cf'
0 row(s) in 1.6320 seconds
=> Hbase::Table - test
- Перечислите информацию о вашем столе, перечислите «sometable»
- Для получения более подробной информации о таблице используйте команду описать
- поместить данные в таблицу
- Посмотреть все данные в таблице
- Получить одну строку данных
-
Остальные команды можете попробовать сами
-
чтобы выйти из оболочки, используйте
quit
Вот демонстрация того, как установить автономную версию hbase и понять основы использования оболочки hbase.Чтобы узнать больше о Hbase, вы можете узнать о официальной документации.
Модель данных Hbase
В Hbase есть некоторые термины, которые нужно знать заранее. следующее:
- Таблица: таблица Hbase состоит из нескольких строк.
- Строка: Строка в Hbase состоит из одного или нескольких столбцов со значениями. Строка сортируется в алфавитном порядке, поэтому структура состояния строки очень важна. Этот метод проектирования может сделать связанные строки очень близкими.Обычно дизайн строки работоспособности заключается в том, чтобы изменить доменное имя веб-сайта, например (org.apache.www, org.apache.mail, org.apache.jira), в этом случае все доменные имена Apache очень близки.
- Столбец: столбец состоит из семейства столбцов и идентификатора столбца, обычно «семейство столбцов: идентификатор столбца». При создании таблицы идентификатор столбца указывать не нужно.
- Семейство столбцов. Семейство столбцов физически содержит множество столбцов и значений столбцов, и каждое семейство столбцов имеет некоторые настраиваемые сохраненные свойства. Например, следует ли использовать кеш, тип сжатия, количество сохраненных версий и т. д. В таблице каждая строка имеет одно и то же семейство столбцов, хотя некоторые семейства столбцов не содержат ничего.
- Квалификатор столбца: квалификатор кластера столбцов, понимаемый как уникальный идентификатор столбца. Но идентификаторы столбцов можно изменить, поэтому каждая строка может иметь другой идентификатор столбца.
- Ячейка: ячейка состоит из строки, семейства столбцов, квалификатора столбца, включая отметку времени и значение, обычно выражающее версию значения.
- Временная метка: обычно рядом со значением указывается временная метка, представляющая номер версии значения.Временная метка по умолчанию — это момент записи данных, но вы также можете указать другую временную метку при записи данных.
HBase — это разреженная, распределенная, постоянная, многомерная, отсортированная карта, индексированная ключами строк, ключами столбцов и временными метками.
Когда Hbase хранит данные, есть два SortedMaps, которые сначала лексикографически сортируются по ключу строки, а затем лексикографически сортируются по столбцу.
Тестовые данные
create 'user','info','ship';
put 'user', '524382618264914241', 'info:name', 'zhangsan'
put 'user', '524382618264914241', 'info:age',30
put 'user', '524382618264914241', 'info:height',168
put 'user', '524382618264914241', 'info:weight',168
put 'user', '524382618264914241', 'info:phone','13212321424'
put 'user', '524382618264914241', 'ship:addr','beijing'
put 'user', '524382618264914241', 'ship:email','sina@sina.com'
put 'user', '524382618264914241', 'ship:salary',3000
put 'user', '224382618261914241', 'info:name', 'lisi'
put 'user', '224382618261914241', 'info:age',24
put 'user', '224382618261914241', 'info:height',158
put 'user', '224382618261914241', 'info:weight',128
put 'user', '224382618261914241', 'info:phone','13213921424'
put 'user', '224382618261914241', 'ship:addr','chengdu'
put 'user', '224382618261914241', 'ship:email','qq@sina.com'
put 'user', '224382618261914241', 'ship:salary',5000
put 'user', '673782618261019142', 'info:name', 'zhaoliu'
put 'user', '673782618261019142', 'info:age',19
put 'user', '673782618261019142', 'info:height',178
put 'user', '673782618261019142', 'info:weight',188
put 'user', '673782618261019142', 'info:phone','17713921424'
put 'user', '673782618261019142', 'ship:addr','shenzhen'
put 'user', '673782618261019142', 'ship:email','126@sina.com'
put 'user', '673782618261019142', 'ship:salary',8000
put 'user', '813782218261011172', 'info:name', 'wangmazi'
put 'user', '813782218261011172', 'info:age',19
put 'user', '813782218261011172', 'info:height',158
put 'user', '813782218261011172', 'info:weight',118
put 'user', '813782218261011172', 'info:phone','12713921424'
put 'user', '813782218261011172', 'ship:addr','xian'
put 'user', '813782218261011172', 'ship:email','139@sina.com'
put 'user', '813782218261011172', 'ship:salary',10000
put 'user', '510824118261011172', 'info:name', 'yangyang'
put 'user', '510824118261011172', 'info:age',18
put 'user', '510824118261011172', 'info:height',188
put 'user', '510824118261011172', 'info:weight',138
put 'user', '510824118261011172', 'info:phone','18013921626'
put 'user', '510824118261011172', 'ship:addr','shanghai'
put 'user', '510824118261011172', 'ship:email','199@sina.com'
put 'user', '510824118261011172', 'ship:salary',50000
Точки проектирования таблицы Hbase (Schema)
Пока существует база данных, проблема проектирования схемы, есть парадигма проектирования схемы в реляционном типе, Hbase как база данных для хранения столбцов, ее дизайн схемы также очень важен.
Атрибуты, требующие внимания при проектировании, как проектировать эти атрибуты и т. д.
Сравнение HBase и реляционных баз данных
Атрибуты | Hbase | RDBMS |
---|---|---|
тип данных | только строки | Богатые типы данных |
манипуляция данными | Добавление, удаление, изменение, поиск, присоединение не поддерживаются | Различные функции и соединения таблиц |
режим хранения | Хранилище на основе столбцов | На основе структуры таблицы и хранения на основе строк |
защита данных | После обновления остается старая версия | заменять |
Масштабируемость | Легко добавлять узлы | Требуется промежуточный слой, жертвуя производительностью |
Факторы, которые следует учитывать при проектировании Hbase
Ключевые понятия Hbase: таблица, rowkey, кластер столбцов, отметка времени.
- Сколько семейств столбцов должно быть в этой таблице
- Какие данные использует семейство столбцов
- Сколько столбцов имеет каждое семейство столбцов
- Имя столбца Хотя имя столбца не обязательно указывать при создании таблицы, его необходимо знать при чтении и записи данных
- Какие данные должен хранить модуль
- Сколько временных версий хранится в ячейке
- Что такое структура rowKey (rowKey) и какую информацию она должна содержать
Очки дизайна
Синцзянь Дизайн
Ключевая часть напрямую связана с производительностью доступа последующих сервисов. Если конструкция ключа строки является неразумной, последующая эффективность службы запросов снизится в геометрической прогрессии.
- Избегайте монотонного увеличения ключей строк, поскольку ключи строк HBase расположены по порядку, что может привести к тому, что большая часть операций записи будет сосредоточена в определенном регионе в течение определенного периода времени, а вся нагрузка будет на одном узле. Может быть разработан как: [metric_type][event_timestamp], разные metric_types могут распространять давление на разные регионы
- Ключ строки должен быть достаточно коротким, чтобы его можно было прочитать, поскольку производительность запросов коротких ключей не должна быть намного лучше, чем у длинных ключей, поэтому длина должна быть взвешена при проектировании.
- Синцзянь нельзя изменить,Единственный способ изменить это - сначала удалить, а затем вставить
Дизайн кластера столбцов
Семейство столбцов — это набор столбцов, элементы которых имеют одинаковый префикс, разделенные двоеточием (:).
-
Теперь Hbase не может очень хорошо обрабатывать более 2–3 семейств столбцов, поэтому постарайтесь максимально сократить количество семейств столбцов.Если в таблице несколько семейств столбцов, семейство столбцов A содержит 1 миллион строк данных, а семейство столбцов B имеет 1 миллиард строк, то кластер столбцов A будет разбросан по многим регионам, что приведет к низкой эффективности сканирования кластера столбцов A.
-
Длина имени кластера столбцов должна быть как можно меньше. Во-первых, для экономии места и повышения эффективности. Например, d означает данные, а v означает значение.
Конфигурация свойств семейства столбцов
- Блок данных HFile, по умолчанию 64 КБ, размер базы данных влияет на размер индекса блока данных. Если блок данных большой, чем больше данных загружается в память за один раз, тем лучше будет эффект сканирующего запроса. Однако, если блок данных небольшой, производительность случайного запроса выше.
> create 'mytable',{NAME => 'cf1', BLOCKSIZE => '65536'}
- Кэш блоков данных, кеш блоков данных включен по умолчанию, если некоторые менее доступные данные могут закрыть кеш.
> create 'mytable',{NAME => 'cf1', BLOCKCACHE => 'FALSE'}
- Сжатие данных, сжатие улучшит использование диска, но увеличит нагрузку на ЦП, в зависимости от ситуации, которую необходимо контролировать.
> create 'mytable',{NAME => 'cf1', COMPRESSION => 'SNAPPY'}
Дизайн таблицы Hbase связан с требованиями, но соблюдение некоторых жестких показателей дизайна таблицы очень полезно для повышения производительности.Вот некоторые ключевые моменты, используемые при проектировании.
Операции API Java
У Hbase есть много разных клиентов, таких как клиент REST, клиент Thift, платформа ORM Kundera и многие другие. Hbase также предоставляет API-интерфейсы Java для управления такой информацией, как таблицы и кластеры столбцов.Его оболочка представляет собой инкапсуляцию API-интерфейсов Java.
Java API Hbase предоставляет множество дополнительных функций:
- Управление метаданными, сжатие данных для кластеров столбцов, разделение регионов
- Создание, удаление, обновление, чтение rowkey
Мы по-прежнему смотрим на код напрямую, чтобы его было легче понять
окрестности
- Hbase 0.98
- Java 1.8
- Zookeeper 3.4.6
- Mac OS
кейс
Экспериментальные результаты несогласованных клиентских версий Hbase могут привести к проблемам, поэтому попробуйте использовать одну и ту же версию. Поскольку серверный эксперимент — Hbase0.98, а клиент также использует 0.98.Кроме того, поскольку версия Hadoop 2.x была значительно улучшена для 1.x, рекомендуется использовать клиент Hbase-hadoop 2.x.
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.24-hadoop2</version>
</dependency>
установить соединение
-
Непосредственно создайте новый HTable ("tableName"), но каждый раз, когда вы создаете таблицу, поскольку вам нужно запрашивать таблицу .meta, чтобы определить, существует ли таблица, процесс создания таблицы будет немного медленным, поэтому не рекомендуется создавать каждый запрос.
-
Использование HTablePool очень похоже на то, как создается HTable, но если используется пул соединений, он не будет создавать отдельную Htable для каждого запроса.
Более подробную информацию о конфигурации можно указать при создании Htable или HtablePool.
HTablePool hTablePool = new HTablePool();
hTablePool.getTable("user");
CRUD
rowkey — единственная строка, представляющая таблицу в Hbase, и используется для поиска некоторых данных в таблице, таких как кластер столбцов, отметка времени и т. д. Java API предоставляет следующие классы для CURD Hbas:
- Put
- Get
- Delete
- Scan
- Increment
Мы подробно обсудим несколько классов, а остальные можно вывести один из другого.
записать данные
Когда получен запрос на запись, данные по умолчанию записываются в Hlog и MemStore синхронно. В то же время данные записываются в двух местах, чтобы обеспечить сохранение данных. Memstore в конечном итоге будет сохранен в Hfile на диске. Каждый раз, когда MemStore очищается, создается новый Hfile.
Класс Put используется для хранения данных в таблицах Hbase.При сохранении данных экземпляр Put должен указывать Rowkey
После создания экземпляра Put добавьте в него данные
public void put() throws IOException {
// 获取默认的配置
Configuration conf = HBaseConfiguration.create();
// 获取Table实例
HTable table = new HTable(conf, "tab1");
// 创建Put实例,并且指定rowKey
Put put = new Put(Bytes.toBytes("row-1"));
// 添加一个 column,值为 "Hello",在 "cf1:greet" 列中
put.add(Bytes.toBytes("cf1"), Bytes.toBytes("greet"), Bytes.toBytes("Hello"));
// 添加一个 column,值为 "John",在 "cf1:person" 列中
put.add(Bytes.toBytes("cf1"), Bytes.toBytes("person"), Bytes.toBytes("John"));
table.put(put);
table.close();
}
Данные также можно вставлять пакетами:
// Объект таблицы может передаваться в параметре List table.put(последний список помещается)
Результаты:
читать данные
Hbase использует кеш LRU для чтения данных. Объект Htable использует следующие методы для чтения данных
Метод построения экземпляра Get очень похож на метод Put. В методе построения необходимо указать ключ строки.
Если вы хотите найти конкретную ячейку, то есть данные определенного столбца, вы можете использовать дополнительные методы для более тонкого контроля.
Взгляните на следующий код случая:
public void get() throws IOException {
// 获取默认的配置
Configuration conf = HBaseConfiguration.create();
// 获取Table实例
HTable table = new HTable(conf, "tab1");
// 创建Put实例,并且指定rowKey
Get get = new Get(Bytes.toBytes("row-1"));
//
get.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("greet"));
// 添加一个 column,值为 "John",在 "cf1:person" 列中
Result result = table.get(get);
byte[] value = result.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("greet"));
System.out.println("获取到的值" + new String(value));
table.close();
}
Результаты
обновить данные
Обновление данных в основном такое же, как запись данных, за исключением того, что когда экземпляру Put присваивается значение, для того же столбца устанавливается другое значение, и оно будет обновлено до нового значения во время работы.
код показывает, как показано ниже:
public void update() throws IOException {
Configuration conf = HBaseConfiguration.create();
// 获取Table实例
HTable table = new HTable(conf, "tab1");
// 创建Put实例,并且指定rowKey
Put put = new Put(Bytes.toBytes("row-1"));
// 添加一个 column,值为 "Hello",在 "cf1:greet" 列中
put.add(Bytes.toBytes("cf1"), Bytes.toBytes("greet"), Bytes.toBytes("Good Morning"));
// 添加一个 column,值为 "John",在 "cf1:person" 列中
// put.add(Bytes.toBytes("cf1"), Bytes.toBytes("person"), Bytes.toBytes("John"));
table.put(put);
table.close();
}
Результаты:
удалить данные
Команда «Удалить» просто помечает текущие данные как удаляемые, а не удаляет их немедленно, то есть сначала удаляет их логически. Фактическое удаление происходит при сжатии Hfile, эти помеченные записи будут удалены.
Удалить объекты также похоже на Поместить и получить
Создайте экземпляр Delete
Если вы хотите указать более подробно, вы можете указать конкретные столбцы и другую информацию.
См. код случая ниже:
public void delete() throws IOException {
Configuration conf = HBaseConfiguration.create();
// 获取Table实例
HTable table = new HTable(conf, "tab1");
// 创建Delete实例,并且指定rowKey
Delete delete = new Delete(Bytes.toBytes("row-1"));
// 删除 column "cf1:greet"
delete.deleteColumn(Bytes.toBytes("cf1"), Bytes.toBytes("greet"));
table.delete(delete);
table.close();
}
Результат выполнения: удалить два раза подряд
Операционная оптимизация
После запуска системы разработка и настройка будут продолжаться на протяжении всего жизненного цикла системы, и HBase не является исключением. Здесь мы в основном говорим о некоторой настройке Hbase.
Оптимизация запросов Hbase
В качестве базы данных NoSQL CRUD является ее основной функцией, а запрос — наиболее часто используемой.
Установить кеш сканирования
Запросы сканирования в HBase можно кэшировать с помощью setCaching(), что может эффективно уменьшить взаимодействие между сервером и клиентом и более эффективно повысить производительность запросов сканирования.
/**
* Set the number of rows for caching that will be passed to scanners.
* If not set, the default setting from {@link HTable#getScannerCaching()} will apply.
* Higher caching values will enable faster scanners but will use more memory.
* @param caching the number of rows for caching
* 设置scanners缓存的行数
*/
public void setCaching(int caching) {
this.caching = caching;
}
указанный столбец для отображения
При использовании Scan или GET для получения большого количества строк лучше указывать нужные столбцы, так как объем данных передается от сервера к клиенту по сети, и большой объем данных может быть узким местом. Если некоторые данные могут быть эффективно отфильтрованы, стоимость сетевого ввода-вывода может быть значительно снижена.
/**
* Get all columns from the specified family.
* <p>
* Overrides previous calls to addColumn for this family.
* @param family family name
* @return this
* 获取指定列簇的所有列
*/
public Scan addFamily(byte [] family) {
familyMap.remove(family);
familyMap.put(family, null);
return this;
}
/**
* Get the column from the specified family with the specified qualifier.
* <p>
* Overrides previous calls to addFamily for this family.
* @param family family name
* @param qualifier column qualifier
* @return this
* 获取指定列簇的特定列
*/
public Scan addColumn(byte [] family, byte [] qualifier) {
NavigableSet<byte []> set = familyMap.get(family);
if(set == null) {
set = new TreeSet<byte []>(Bytes.BYTES_COMPARATOR);
}
if (qualifier == null) {
qualifier = HConstants.EMPTY_BYTE_ARRAY;
}
set.add(qualifier);
familyMap.put(family, set);
return this;
}
Общее использование: scan.addColumn(...)
Закрыть ResultScanner
Если вы забудете закрыть этот класс после использования table.getScanner, он останется подключенным к серверу, и ресурсы не могут быть освобождены, что сделает некоторые ресурсы на сервере недоступными.
Поэтому после того, как он будет израсходован, вам необходимо выполнить операцию выключения, которая аналогична операции JDBC MySQL.
scanner.close()
Отключить кеширование блоков
Если полное сканирование таблицы выполняется пакетно, по умолчанию есть кеш, если в это время есть кеш, то эффективность сканирования будет снижена.
scan.setCacheBlocks(true|false);
Для часто читаемых данных рекомендуется использовать значение по умолчанию и включить кэширование блоков
кешировать результаты запроса
Для сценариев приложений, где HBase часто запрашивается, можно рассмотреть возможность создания слоя системы кэширования между приложением и HBase.Новые запросы сначала отправляются в кеш, а кеш не отправляется в HBase.
Оптимизация записи
Запись также является одной из распространенных операций Hbase, а Hbase имеет несравненные преимущества в операциях записи, с которыми не могут сравниться другие NoSQL Давайте поговорим о том, как оптимизировать операции записи.
Отключить запись журналов WAL
Как правило, для обеспечения высокой доступности системы журнал WAL включен по умолчанию, а журнал WAL в основном используется для аварийного восстановления.Если приложение допускает определенный риск потери данных, журнал WAL можно отключить при записи данные.
риск:Когда RegionServer выходит из строя, записанные данные теряются и не могут быть восстановлены.
Настроить автосмыв
У Htable есть атрибут AutoFlush, который используется для поддержки пакетных обновлений клиента. По умолчанию установлено значение true. Когда клиент получает фрагмент данных, он будет немедленно отправлен на сервер. Если установлено значение false, когда клиент отправляет запрос на размещение, он будет первым. Запрос кэшируется на стороне клиента, и когда достигается пороговое значение или выполняется hbase.flushcommits(), запрос отправляется на RegionServer.
рискСбой клиента перед отправкой запроса на RegionServer и потеря данных
table.setAutoFlush(false);
table.setWriteBufferSize( 12 * 1024 * 1024 );
Предварительно созданный регион
Как правило, таблица имеет только один регион в начале, данные, вставленные в таблицу, будут сохранены в этом регионе, и все пластификаторы, вставленные в таблицу, будут сохранены в этом регионе, и разделение произойдет при достижении определенного порога. достиг. Таким образом, операции записи для таблицы вначале концентрируются на определенном сервере, из-за чего нагрузка на этот сервер становится очень напряженной и расходуется впустую ресурсы всего кластера.
Рекомендуется предварительно создать регион в начале, вы можете использовать RegionSplitter, который поставляется с Hbase.
Очистка журнала задержки
Операция записи по умолчанию, сначала запись в WAL и запись в HDFS в течение 1 с, на этот раз по умолчанию 1 с, что можно настроить с помощью параметров.
hbase.regionserver.optionallogflushinterval
Можно настроить большее значение, например, 5. В течение этого времени данные будут храниться в памяти до тех пор, пока RegionServer периодически не выполнит операцию сброса.
Важные параметры сканирования
Сканирование является очень распространенной операцией в Hbase. Хотя предыдущая операция Hbase API кратко знакомит с операцией сканирования, она недостаточно детализирована. Поскольку сканирование очень часто используется, необходимо организовать его в деталях.
Scan
Таблица данных в HBase разделена на области для достижения фрагментации данных.Каждая область связана с диапазоном RowKey, и данные в каждой области организованы в соответствии с лексикографическим порядком RowKey.
На основе этого дизайна HBase может легко обрабатывать запросы такого типа: «Укажите диапазон RowKey и получите все записи в этом диапазоне», такой запрос называется Scan в HBase.
1. Build Scan, указать startRow и stopRow, если не указано, будет выполнять полное сканирование таблицы 2. Получите сканер результатов 3. Просмотрите результаты запроса 4. Закройте сканер результатов.
public void stringFilter() throws IOException {
Configuration conf = HBaseConfiguration.create();
// 获取Table实例
HTable table = new HTable(conf, "user");
// 构建Scan
Scan scan = new Scan();
scan = scan.setStartRow(Bytes.toBytes("startRowxxx")).setStopRow(Bytes.toBytes("StopRowxxx"));
RowFilter filter = new RowFilter(
CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes("224382618261914241"))
);
scan.setFilter(filter);
// 获取resultScanner
ResultScanner scanner = table.getScanner(scan);
Result result = null;
// 处理结果
while ((result = scanner.next()) != null) {
byte[] value = result.getValue(Bytes.toBytes("ship"), Bytes.toBytes("addr"));
if (value == null || value.length == 0) {
continue;
}
System.out.println(
new String(value)
);
System.out.println("hello World");
}
// 关闭ResultScanner
scanner.close();
table.close();
}
Другие параметры настройки
Кэширование: установите количество результатов, считываемых пакетами для одного запроса RPC.
В следующем примере кода количество результатов, считываемых за один раз, устанавливается равным 100:
scan.setCaching(100);
Каждый раз, когда клиент отправляет запрос на сканирование на RegionServer, он извлекает пакет данных в пакетах (количество результатов, извлекаемых каждый раз, определяется кэшированием), а затем помещает их в кэш результатов на этот раз:
Каждый раз, когда приложение считывает данные, оно получает их из локального кэша результатов. Если данные в кэше результатов прочитаны, клиент снова отправит запрос на сканирование на RegionServer, чтобы получить больше данных.
Пакет: установите количество столбцов в каждом результате.
Следующий пример кода устанавливает ограничение на количество столбцов в каждом результате до 3:
scan.setBatch(3);
Этот параметр подходит для сценариев, когда строка данных слишком велика.В этом случае запрошенный столбец строки данных будет разделен на несколько результатов и возвращен клиенту.
Пример выглядит следующим образом:
Предположим, что в строке данных есть десять столбцов: {Col01, Col02, Col03, Col04, Col05, Col06, Col07, Col08, Col09, Col10} Предполагая, что пакет, установленный в сканировании, равен 3, тогда эта строка данных будет разделена на 4 результата и возвращена:
Result1 -> {Col01,Col02,Col03}
Result2 -> {Col04,Col05,Col06}
Result3 -> {Col07,Col08,Col09}
Result4 -> {Col10}
Что касается параметра кэширования, мы объяснили, что это количество результатов, получаемых клиентом со стороны RegionServer каждый раз.В приведенном выше примере строка данных разделена на 4 результата, что приведет к уменьшению счетчика в кэшировании. 4 раза. Совмещая кэширование и пакетную обработку, приведем чуть более сложный пример:
Предположим, параметры Scan установлены следующим образом:
final byte[] start = Bytes.toBytes("Row1"); final byte[] stop = Bytes.toBytes("Row5"); Scan scan = new Scan(); scan.withStartRow(start).withStopRow(stop); scan.setCaching(10); scan.setBatch(3);
Данные RowKey для чтения и соответствующий набор столбцов следующие:
Ряд1: {Col01,Col02,Col03,Col04,Col05,Col06,Col07,Col08,Col09,Col10}
Строка 2: {Col01,Col02,Col03,Col04,Col05,Col06,Col07,Col08,Col09,Col10,Col11}
Ряд3: {Col01,Col02,Col03,Col04,Col05,Col06,Col07,Col08,Col09,Col10}
Давайте еще раз рассмотрим определения кэширования и пакетной обработки:
Кэширование: влияет на количество результатов, возвращаемых чтением.
Пакет: Ограничивает количество столбцов, содержащихся в Результате. Если количество столбцов, запрошенных для строки данных, превышает лимит Пакета, строка данных будет разделена на несколько Результатов.
Затем набор результатов, возвращаемый первым запросом Клиента к RegionServer, выглядит следующим образом:
Результат1 -> Строка1: {Col01, Col02, Col03} Результат2 -> Строка1: {Col04, Col05, Col06} Результат3 -> Строка1: {Col07, Col08, Col09} Результат4 -> Строка1: {Col10} Результат5 -> Строка2: {Col01, Col02, Col03} Результат6 -> Строка2: {Col04,Col05,Col06} Результат7 -> Строка2: {Col07, Col08, Col09} Результат8 -> Строка2: {Col10,Col11} Результат9 -> Строка3: {Col01, Col02, Col03} Результат10 -> Строка3: {Col04, Col05, Col06}
Ограничение: ограничение количества строк, извлекаемых операцией сканирования.
То же, что и предложение limit в синтаксисе SQL для ограничения общего количества строк, полученных операцией сканирования:
scan.setLimit(10000);
Примечание. Параметр Limit был впервые введен в версии 2.0. Однако в версии 2.0.0 при одновременном задании Batch и Limit, похоже, есть ошибка, первоначальный анализ проблемы должен быть связан с логической обработкой счетчика numberOfCompletedRows в BatchScanResultCache. Поэтому не рекомендуется задавать эти два параметра одновременно.
CacheBlock: Должна ли сторона RegionServer кэшировать HFileBlocks, участвующие в этом сканировании.
scan.setCacheBlocks(true);
e) Raw Scan: может ли он прочитать флаг удаления и данные, которые были удалены, но не очищены.
scan.setRaw(true);
MaxResultSize: ограничить возвращаемый набор результатов сканирования размерами занимаемой памяти.
В следующем примере кода максимальный возвращаемый результирующий набор задается равным 5 МБ:
scan.setMaxResultSize(5 * 1024 * 1024);
Обратное сканирование: обратное сканирование
Обычные операции сканирования читаются в лексикографическом порядке от меньшего к большему, а обратное сканирование — прямо противоположное:
scan.setReversed(true);
Сканировать с фильтром
Фильтр может установить дополнительные значения условий для возвращаемых записей на основе набора результатов сканирования.Эти условия могут быть связаны с RowKey, именем столбца или значением столбца, и несколько условий фильтра могут быть объединены вместе, подождите.
Наиболее часто используемым фильтром является SingleColumnValueFilter, на основе которого могут быть реализованы следующие подобные запросы:
"Вернуть все строки, удовлетворяющие условию {значение столбца I:D больше или равно 10}"
Пример кода выглядит следующим образом:
Фильтр расширяет возможности запроса HBase, но перед использованием фильтра необходимо обратить внимание на одну вещь: фильтр может привести к тому, что задержка ответа на запрос станет неконтролируемой. Поскольку мы не можем предсказать, чтобы найти запись, удовлетворяющую условиям, сколько данных нужно просканировать позади, если диапазон сканирования эффективно ограничен (путем установки пределов StartRow и StopRow), эту проблему можно эффективно контролировать. Эта информация требует, чтобы вы подробно изучили свою бизнес-модель данных, прежде чем использовать фильтр.
Наконец
Эта статья немного длинная, как ссылка
Ссылаться на
- [Борьба за разработку на уровне предприятия]
- Справочная документация по HBase
- Графический процесс чтения HBase: краткое вводное руководство по HBase 4
- Официальная документация Hbase
- Hbase Shell Command
- Hbase shell tuturial
- Путь высокопроизводительного случайного запроса HBase — анализ принципа HFile