Один: Введение
Название HBase происходит от базы данных Hadoop, то есть базы данных hadoop, которая отличается от общей реляционной базы данных.Это база данных для хранения неструктурированных данных, и она основана на столбцах, а не на строках.
HBase — это распределенная, ориентированная на столбцы реализация с открытым исходным кодом, основанная на Google Bigtable.
Используйте Hadoop HDFS в качестве системы хранения файлов,
используйте Hadoop MapReduce для обработки больших объемов данных в HBase и
используйте Zookeeper в качестве службы для совместной работы.
Два: важные концепции HBase
2.1 Структура таблицы HBase
HBase хранит данные в виде таблиц. Таблица состоит из строк и столбцов. Столбцы делятся на несколько семейств столбцов/семейств столбцов, и каждое семейство столбцов/семейство столбцов может иметь несколько общих столбцов.
2.2 Таблица Таблица
HBase использует таблицы для хранения данных.
2.3 пространство имен
Пространство имен Пространство имен относится к логической группировке набора таблиц , подобно базе данных в СУБД, что облегчает разделение таблиц в бизнесе.
Система HBase по умолчанию определяет два пространства имен по умолчанию:
- hbase: системные встроенные таблицы, включая пространства имен и метатаблицы.
- по умолчанию: таблицы, в которых не указано пространство имен, когда пользователь создает таблицу, создаются здесь
2.3 Ключ строки
Ключ строки, столбец первичного ключа каждой строки, ключ строки каждой строки должен быть уникальным, значением ключа строки является любая строка (максимальная длина 64 КБ, длина обычно составляет 10-100 байт в практических приложениях) 在HBase内部,rowKey保存为字节数组byte[]
.
Чтение и запись строки — это атомарная операция (независимо от того, сколько столбцов считывается и записывается одновременно).
2.4 Регион Регион
Таблица разделена на несколько областей в направлении строки.
Регионы делятся по размеру. Каждая таблица начинается только с одного региона. По мере увеличения данных регион продолжает расти. Когда он достигает порога, регион будет разделен на два новых региона. Регионов становится все больше и больше.
Регион — это наименьшая единица распределенного хранилища и балансировки нагрузки в HBase. Разные регионы распределены по разным серверам регионов.
Регион состоит из одного или нескольких хранилищ, в каждом хранилище хранится семейство столбцов, а каждое хранилище состоит из хранилища памяти (хранящегося в памяти) и от 0 до нескольких файлов хранилища (хранящихся в HDFS).
семейство столбцов семейство столбцов
Семейство столбцов является родителем каждого дочернего столбца. Каждый дочерний столбец принадлежит семейству столбцов. Семейство столбцов содержит один или несколько связанных столбцов. При создании таблицы необходимо указать семейство столбцов, но столбец не обязательно быть указано. Конкретный подстолбец представлен «имя семейства столбцов: имя столбца».
Схема в HBase — это TableName + Column Family Name.
квалификатор столбца
Это имя каждого подстолбца в семействе столбцов, или связанного столбца, или квалификатора, но перевод отличается.
Используйте columnFamily:column
для поиска подстолбца.
элементарная ячейка памяти
Каждая ячейка, которую мы видим снаружи, на самом деле соответствует нескольким единицам хранения.По умолчанию ячейка соответствует единице хранения, и единица хранения может хранить часть данных.Если в ячейке несколько единиц хранения, это означает, что ячейка может хранить несколько значений. Количество единиц хранения может быть установлено версией. Единица хранения может быть
rowKey + columnFamily + column + timestamp
однозначно идентифицирована Данные в ячейке не имеют типа и хранятся в форме байт-кода.
hbase сортирует версии времени в порядке убывания метки времени, а другие сопоставления сортируются в порядке возрастания.
Временная метка номера версии
Каждая ячейка содержит несколько версий одних и тех же данных. Версии индексируются по отметке времени. Тип временной метки — 64-битное целое число. Временная метка может быть назначена hbase (автоматически при записи данных), а временная метка — это текущее системное время с точностью до миллисекунд. Временные метки также могут быть явно назначены клиентами. Если приложения хотят избежать конфликтов версий данных, они должны сами генерировать уникальные временные метки. В каждой ячейке разные версии данных сортируются в обратном хронологическом порядке, то есть самые свежие данные находятся вверху.
Чтобы избежать бремени управления (включая хранение и индексирование), вызванного слишком большим количеством версий данных, hbase предлагает два метода повторного использования версий данных. Один из них — сохранить последние n версий данных, а другой — сохранить самую последнюю версию (например, за последние семь дней). Пользователи могут установить его для каждого семейства столбцов.
三:Оболочка HBase
имя | описывать | грамматика |
---|---|---|
помощь | «Имя» для просмотра описания команды | help 'имя команды' |
кто я | кто я | кто я |
версия | Возвращает информацию о версии hbase | версия |
положение дел | Вернуть информацию о состоянии кластера hbase | положение дел |
table_help | Посмотрите, как за столом | table_help |
создавать | создать таблицу | создать «имя таблицы», «имя семейства столбцов 1», «имя семейства столбцов 2», «имя семейства столбцов N» |
изменить | изменить семейство столбцов | Добавить семейство столбцов: изменить 'имя таблицы', 'имя семейства столбцов' Удалить семейство столбцов: изменить 'имя таблицы', {ИМЯ=> 'имя семейства столбцов', МЕТОД=> 'удалить'} |
описывать | Показать подробную информацию о таблице | описать «имя таблицы» |
список | Список всех таблиц, присутствующих в hbase | список |
существует | Проверяет, существует ли таблица | существует 'имя таблицы' |
помещать | Добавленные или измененные значения таблицы | поместите «имя таблицы», «ключ строки», «имя семейства столбцов», «значение столбца» поместите «имя таблицы», «ключ строки», «имя семейства столбцов: имя столбца», «значение столбца» |
сканирование | Получите соответствующее значение, просканировав таблицу | scan 'имя таблицы' сканирует семейство столбцов: scan 'имя таблицы', {COLUMN=>'имя семейства столбцов'} сканирует столбец определенного семейства столбцов: scan 'имя таблицы', {COLUMN=>'имя семейства столбцов: имя столбца'} Запросить несколько столбцов одного семейства столбцов: scan 'имя таблицы', {COLUMNS => ['имя семейства столбцов 1: имя столбца 1', 'имя семейства столбцов 1: имя столбца 2', … ]} |
получать | Получить значение строки или ячейки | получить «имя таблицы», «ключ строки» получить «имя таблицы», «ключ строки», «имя семейства столбцов» |
считать | подсчитывает количество строк в таблице | count 'имя таблицы' |
увеличение | Увеличить значение указанной строки или столбца таблицы | incr 'имя таблицы', 'ключ строки', 'семейство столбцов: имя столбца', значение шага |
get_counter | получить счетчик | get_counter 'имя таблицы', 'ключ строки', 'семейство столбцов: имя столбца' |
удалить | Удалить значение указанного объекта (может быть значение, соответствующее таблице, строке, столбцу или указать значение метки времени) | Удалить столбец семейства столбцов: удалить «имя таблицы», «ключ строки», «имя семейства столбцов: имя столбца» |
удалить все | Удалить все значения элементов указанной строки | удалить все 'имя таблицы', 'ключ строки' |
обрезать | Воссоздать указанную таблицу | обрезать «имя таблицы» |
давать возможность | сделать таблицу действительной | включить «имя таблицы» |
включен | Включить ли | is_enabled 'имя таблицы' |
запрещать | аннулировать таблицу | отключить «имя таблицы» |
выключен | Это недействительно | is_disabled 'имя таблицы' |
уронить | удалить таблицу | Отбрасываемая таблица должна быть отключена отключить «имя таблицы» удалить «имя таблицы» |
неисправность | Закройте кластер hbase (отличается от выхода) | |
инструменты | Список инструментов, поддерживаемых hbase | |
Выход | выйти из оболочки hbase |
HBase Shell — это набор команд, официально предоставленных для работы с HBase.如果配置了HBase的环境变量了,就可以知己在命令行中输入hbase shell 命令进入命令行。
hbase shell
команда справки
help '命名名称'来
Посмотреть можно по 命令行的具体使用,包括命令的作用和用法
.
Используйте справку 'hbase' для просмотра всех команд, поддерживаемых оболочкой hbase.Hbase группирует команды, среди которых больше используются ddl и dml.
Четыре: общее наименование
1. Показать статус состояния кластера
Может быть «сводной», «простой», «подробной» или «репликационной». По умолчанию «сводная».
hbase> status
hbase> status 'simple'
hbase> status 'summary'
hbase> status 'detailed'
hbase> status 'replication'
hbase> status 'replication', 'source'
hbase> status 'replication', 'sink'
2. Запрос версии версии базы данных
3. Показать текущего пользователя и группу whoami
4. Просмотрите команду table_help таблицы операций.
5. Выйдите из оболочки HBase.
exit
Пять: команда ddl
1. Создать таблицу создать
Примечание. При создании таблицы необходимо указать только имя семейства столбцов, а не имя столбца.
# 语法
create '表名', {
NAME => '列族名1'}, {
NAME => '列族名2'}, {
NAME => '列族名3'}
# 此种方式是上上面的简写方式,使用上面方式可以为列族指定更多的属性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等属性
create '表名', '列族名1', '列族名2', '列族名3'
create '表名', {
NAME => '列族名1', VERSIONS => 版本号, TTL => 过期时间, BLOCKCACHE => true}
# 示例
create 'tbl_user', 'info', 'detail'
create 't1', {
NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
2. 修改(添加、删除)表结构Schema alter
2.1 添加一个列族
# 语法
alter '表名', '列族名'
# 示例
alter 'tbl_user', 'address'
2.2 删除一个列族
# 语法
alter '表名', {
NAME=> '列族名', METHOD=> 'delete'}
# 示例
alter 'tbl_user', {
NAME=> 'address', METHOD=> 'delete'}
2.3 修改列族的属性
可以修改列族的VERSIONS、IN_MEMORY
# 修改f1列族的版本为5
alter 't1', NAME => 'f1', VERSIONS => 5
# 修改多个列族,修改f2为内存,版本号为5
alter 't1', 'f1', {
NAME => 'f2', IN_MEMORY => true}, {
NAME => 'f3', VERSIONS => 5}
# 也可以修改table-scope属性,例如MAX_FILESIZE, READONLY,MEMSTORE_FLUSHSIZE, DEFERRED_LOG_FLUSH等。
# 例如,修改region的最大大小为128MB:
alter 't1', MAX_FILESIZE => '134217728'
3. 异步修改Schema alter_async
# change or add the 'f1' column family in table 't1' from defaults
to instead keep a maximum of 5 cell VERSIONS
alter_async 't1', NAME => 'f1', VERSIONS => 5
# delete the 'f1' column family in table 'ns1:t1'
alter_async 'ns1:t1', NAME => 'f1', METHOD => 'delete'
alter_async 'ns1:t1', 'delete' => 'f1'
# change the max size of a family to 128MB
alter 't1', METHOD => 'table_att', MAX_FILESIZE => '134217728'
alter 't1', {
NAME => 'f1'}, {
NAME => 'f2', METHOD => 'delete'}
4. 获取alter_async执行的状态 alter_status
alter_status '表名'
5. 获取表的描述describe
# 语法
describe '表名'
# 示例
describe 'tbl_user'
6. 列举所有表list
7. 表是否存在exists
# 语法
exists '表名'
# 示例
exists 'tbl_user'
8. 启用表enable和禁用表disable
通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用。
# 语法
enable '表名'
is_enabled '表名'
disable '表名'
is_disabled '表名'
# 示例
disable 'tbl_user'
is_disabled 'tbl_user'
enable 'tbl_user'
is_enabled 'tbl_user'
9. 禁用满足正则表达式的所有表disable_all
.
匹配除“\n”和"\r"之外的任何单个字符*
匹配前面的子表达式任意次
# 匹配以t开头的表名
disable_all 't.*'
# 匹配指定命名空间ns下的以t开头的所有表
disable_all 'ns:t.*'
# 匹配ns命名空间下的所有表
disable_all 'ns:.*'
10. 启用满足正则表达式的所有表enable_all
enable_all 't.*'
enable_all 'ns:t.*'
enable_all 'ns:.*'
11. 删除表drop
需要先禁用表,然后再删除表,启用的表是不允许删除的
# 语法
disable '表名'
drop '表名'
# 示例
disable 'tbl_user'
drop 'tbl_user'
12. 删除满足正则表达式的所有表drop_all
drop_all 't.*'
drop_all 'ns:t.*'
drop_all 'ns:.*'
13. 获取某个表赋值给一个变量 get_table
通过 var = get_table ‘表名’ 赋值给一个变量对象,然后对象.来调用,就像面向对象编程一样,通过对象.方法来调用,这种方式在操作某个表时就不必每次列举表名了。
14. 获取rowKey所在的区 locate_region
locate_region '表名', '行键'
15. 显示hbase所支持的所有过滤器show_filters
过滤器用于get和scan命令中作为筛选数据的条件,类型关系型数据库中的where的作用
六:namespace命令
6.1 列举命名空间 list_namespace
6.2 获取命名空间描述 describe_namespace
6.3 查看命名空间下的所有表 list_namespace_tables
6.4 创建命名空间create_namespace
6.5 修改命名空间的属性
# add/modify a property
alter_namespace 'ns1', {
METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
# delete a property
alter_namespace 'ns1', {
METHOD => 'unset', NAME=>'PROPERTY_NAME'}
6.6 删除命名空间drop_namespace
drop_namespace '命名空间名称'
七:dml命令
1. 插入或者修改数据put
# 语法
# 当列族中只有一个列时'列族名:列名'使用'列族名'
put '表名', '行键', '列族名', '列值'
put '表名', '行键', '列族名:列名', '列值'
# 示例
# 创建表
create 'tbl_user', 'info', 'detail', 'address'
# 第一行数据
put 'tbl_user', 'mengday', 'info:id', '1'
put 'tbl_user', 'mengday', 'info:name', '张三'
put 'tbl_user', 'mengday', 'info:age', '28'
put 'tbl_user', 'mengday', 'detail:birthday', '1990-06-26'
put 'tbl_user', 'mengday', 'detail:email', '[email protected]'
put 'tbl_user', 'mengday', 'detail:create_time', '2019-03-04 14:26:10'
put 'tbl_user', 'mengday', 'address', '上海市'
# 第二行数据
put 'tbl_user', 'vbirdbest', 'info:id', '2'
put 'tbl_user', 'vbirdbest', 'info:name', '李四'
put 'tbl_user', 'vbirdbest', 'info:age', '27'
put 'tbl_user', 'vbirdbest', 'detail:birthday', '1990-06-27'
put 'tbl_user', 'vbirdbest', 'detail:email', '[email protected]'
put 'tbl_user', 'vbirdbest', 'detail:create_time', '2019-03-05 14:26:10'
put 'tbl_user', 'vbirdbest', 'address', '北京市'
# 第一行数据
put 'tbl_user', 'xiaoming', 'info:id', '3'
put 'tbl_user', 'xiaoming', 'info:name', '王五'
put 'tbl_user', 'xiaoming', 'info:age', '26'
put 'tbl_user', 'xiaoming', 'detail:birthday', '1990-06-28'
put 'tbl_user', 'xiaoming', 'detail:email', '[email protected]'
put 'tbl_user', 'xiaoming', 'detail:create_time', '2019-03-06 14:26:10'
put 'tbl_user', 'xiaoming', 'address', '杭州市'
2. 全表扫描scan
获取表的所有数据
# 语法
scan '表名'
# 示例
scan 'tbl_user'
注意:中文编码了
扫描整个列簇
# 语法
scan '表名', {
COLUMN=>'列族名'}
# 示例
scan 'tbl_user', {
COLUMN=>'info'}
扫描整个列簇的某个列
# 语法
scan '表名', {
COLUMN=>'列族名:列名'}
# 示例
scan 'tbl_user', {
COLUMN=>'info:age'}
3. 获取数据get
# 语法
get '表名', '行键'
# 示例
get 'tbl_user', 'mengday'
根据某一行某列族的数据
# 语法
get '表名', '行键', '列族名'
# 示例
get 'tbl_user', 'mengday', 'info'
# 创建表,c1版本为4, 元数据mykey=myvalue
hbase(main):009:0> create 't1', {
NAME => 'c1', VERSIONS => 4}, METADATA => {
'mykey' => 'myvalue' }
0 row(s) in 2.2810 seconds
=> Hbase::Table - t1
# 添加列族c2, c3
hbase(main):010:0> alter 't1', 'c2', 'c3'
Updating all regions with the new schema...
1/1 regions updated.
Done.
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.8320 seconds
# 出入数据,c1 插入4个版本的值
hbase(main):011:0> put 't1', 'r1', 'c1', 'v1'
0 row(s) in 0.1000 seconds
hbase(main):012:0> put 't1', 'r1', 'c1', 'v11'
0 row(s) in 0.0180 seconds
hbase(main):013:0> put 't1', 'r1', 'c1', 'v111'
0 row(s) in 0.0140 seconds
hbase(main):014:0> put 't1', 'r1', 'c1', 'v1111'
0 row(s) in 0.0140 seconds
# 插入c2、c3的值
hbase(main):015:0> put 't1', 'r1', 'c2', 'v2'
0 row(s) in 0.0140 seconds
hbase(main):016:0> put 't1', 'r1', 'c3', 'v3'
0 row(s) in 0.0210 seconds
# 获取rowKey=r1的一行记录
hbase(main):017:0> get 't1', 'r1'
COLUMN CELL
c1: timestamp=1552819382575, value=v1111
c2: timestamp=1552819392398, value=v2
c3: timestamp=1552819398244, value=v3
3 row(s) in 0.0550 seconds
# 获取rowKey=r1并且 1552819392398 <= 时间戳范围 < 1552819398244
hbase(main):018:0> get 't1', 'r1', {
TIMERANGE => [1552819392398, 1552819398244]}
COLUMN CELL
c2: timestamp=1552819392398, value=v2
1 row(s) in 0.0090 seconds
# 获取指定列的值
hbase(main):019:0> get 't1', 'r1', {
COLUMN => 'c1'}
COLUMN CELL
c1: timestamp=1552819382575, value=v1111
1 row(s) in 0.0160 seconds
# 获取指定列的值,多个值使用数组表示
hbase(main):020:0> get 't1', 'r1', {
COLUMN => ['c1', 'c2', 'c3']}
COLUMN CELL
c1: timestamp=1552819382575, value=v1111
c2: timestamp=1552819392398, value=v2
c3: timestamp=1552819398244, value=v3
3 row(s) in 0.0170 seconds
# 获取c1的值,获取4个版本的值,默认是按照时间戳降续排序的
hbase(main):021:0> get 't1', 'r1', {
COLUMN => 'c1', VERSIONS => 4}
COLUMN CELL
c1: timestamp=1552819382575, value=v1111
c1: timestamp=1552819376343, value=v111
c1: timestamp=1552819368993, value=v11
c1: timestamp=1552819362975, value=v1
4 row(s) in 0.0180 seconds
# 获取c1的3个版本值
hbase(main):027:0* get 't1', 'r1', {
COLUMN => 'c1', VERSIONS => 3}
COLUMN CELL
c1: timestamp=1552819382575, value=v1111
c1: timestamp=1552819376343, value=v111
c1: timestamp=1552819368993, value=v11
3 row(s) in 0.0090 seconds
# 获取指定时间戳版本的列
hbase(main):022:0> get 't1', 'r1', {
COLUMN => 'c1', TIMESTAMP => 1552819376343}
COLUMN CELL
c1: timestamp=1552819376343, value=v111
1 row(s) in 0.0170 seconds
hbase(main):023:0> get 't1', 'r1', {
COLUMN => 'c1', TIMESTAMP => 1552819376343, VERSIONS => 4}
COLUMN CELL
c1: timestamp=1552819376343, value=v111
1 row(s) in 0.0130 seconds
# 获取rowKey=r1中的值等于v2的所有列
hbase(main):024:0> get 't1', 'r1', {
FILTER => "ValueFilter(=, 'binary:v2')"}
COLUMN CELL
c2: timestamp=1552819392398, value=v2
1 row(s) in 0.0510 seconds
hbase(main):025:0> get 't1', 'r1', {
COLUMN => 'c1', ATTRIBUTES => {
'mykey'=>'myvalue'}}
COLUMN CELL
c1: timestamp=1552819382575, value=v1111
1 row(s) in 0.0100 seconds
4. 删除某个列族中的某个列delete
# 语法
delete '表名', '行键', '列族名:列名'
create 'tbl_test', 'columnFamily1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column2', 'value2'
delete 'tbl_test', 'rowKey1', 'columnFamily1:column1'
5. 删除某行数据deleteall
# 语法
deleteall '表名', '行键'
# 示例
deleteall 'tbl_test', 'rowKey1'
6. 清空整个表的数据truncate
先disable表,然后再drop表,最后重新create表
truncate '表名'
7. 查询表中有多少行count
# 语法
count '表名'
# 示例
count 'tbl_user'
8. 自增incr
# 语法
incr '表名', '行键', '列族:列名', 步长值
# 示例
# 注意:incr 可以对不存的行键操作,如果行键已经存在会报错,如果使用put修改了incr的值再使用incr也会报错
# ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 2 bytes wide
incr 'tbl_user', 'xiaohong', 'info:age', 1
9. 计数器get_counter
# 点击量:日、周、月
create 'counters', 'daily', 'weekly', 'monthly'
incr 'counters', '20110101', 'daily:hits', 1
incr 'counters', '20110101', 'daily:hits', 1
get_counter 'counters', '20110101', 'daily:hits'
10. 修饰词
10.1 COLUMNS: 查询同一个列族的多个列
# 语法
scan '表名', {
COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}
# 示例
scan 'tbl_user', {
COLUMNS => [ 'info:id', 'info:age']}
10.2 TIMESTAMP 指定时间戳
scan 't1', {
COLUMNS => 'c2', TIMESTAMP=> 1552819392398}
10.3 TIMERANGE表示的是”>=开始时间 and <结束时间“
# 语法
scan '表名',{
TIMERANGE=>[timestamp1, timestamp2]}
# 示例
scan 'tbl_user',{
TIMERANGE=>[1551938004321, 1551938036450]}
10.4 VERSIONS
默认情况下一个列只能存储一个数据,后面如果修改数据就会将原来的覆盖掉,可以通过指定VERSIONS时HBase一列能存储多个值。
create 'tbl_test', 'columnFamily1'
describe 'tbl_test'
# 修改列族版本号
alter 'tbl_test', {
NAME=>'columnFamily1', VERSIONS=>3 }
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'
# 默认返回最新的一条数据
get 'tbl_test','rowKey1','columnFamily1:column1'
# 返回3个
get 'tbl_test','rowKey1',{
COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2个
get 'tbl_test','rowKey1',{
COLUMN=>'columnFamily1:column1', VERSIONS=>2}
10.5 STARTROW
ROWKEY起始行。会先根据这个key定位到region,再向后扫描
# 语法
scan '表名', {
STARTROW => '行键名'}
# 示例
scan 'tbl_user', {
STARTROW => 'vbirdbest'}
10.6 STOPROW :截止到STOPROW行,STOPROW行之前的数据,不包括STOPROW这行数据
# 语法
scan '表名', {
STOPROW => '行键名'}
# 示例
scan 'tbl_user', {
STOPROW => 'vbirdbest'}
10.7 LIMIT 返回的行数
# 语法
scan '表名', {
LIMIT => 行数}
# 示例
scan 'tbl_user', {
LIMIT => 2 }
11. FILTER条件过滤器
过滤器之间可以使用AND、OR连接多个过滤器。
ValueFilter 值过滤器
# 语法:binary 等于某个值
scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"
# 语法 substring:包含某个值
scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"
# 示例
scan 'tbl_user', FILTER=>"ValueFilter(=, 'binary:26')"
scan 'tbl_user', FILTER=>"ValueFilter(=, 'substring:6')"
ColumnPrefixFilter 列名前缀过滤器
# 语法 substring:包含某个值
scan '表名', FILTER=>"ColumnPrefixFilter('列名前缀')"
# 示例
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth')"
# 通过括号、AND和OR的条件组合多个过滤器
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:26')"
rowKey字典排序
Table中的所有行都是按照row key的字典排序的
三:HBase 常见错误
hbase shell在使用的时候经常会报错,这里列举了几个错误:
1. HBase创建不存在的表报已经存在错误 ERROR: Table already exists: !
解决办法:
# 1. 进入zookeeper client模式
cd /usr/local/Cellar/hbase/1.2.9/bin
hbase zkcli
# 2. 在zk client模式下输入ls /hbase/table命令看到zombie table
ls /hbase/table
# 3. 删除表,TABLE_NAME为要删除的表名
rmr /hbase/table/TABLE_NAME
# 4. 重启hbase
./stop-hbase.sh
./start-hbase.sh
2. ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
# 使用jps查看是否有datanode服务
jps
删除hadoop 的临时目录
/usr/local/Cellar/hadoop/3.1.1/libexec/tmp
3. ОШИБКА: невозможно получить мастер-адрес от ZooKeeper; данные znode == ноль
# 重启hbase
./stop-hbase.sh
./start-hbase.sh
4. ОШИБКА: org.apache.hadoop.hbase.PleaseHoldException: мастер инициализируется
Есть много причин для этой ошибки. Позвольте мне рассказать о причине моей ошибки здесь. Существует ошибка конфигурации имени атрибута в hbase-site.xml. Некоторые из Интернета hbase.rootdir, и имя настроено как это. Иногда он сообщает об ошибке, а иногда не сообщает об ошибке. , Когда сообщается об ошибке, отформатируйте Hadoop, а затем перезапустите его. Иногда этот метод может решить проблему, а иногда нет. Здесь я меняю hbase.rootdir на hbase.root.dir, и об ошибке не сообщается. Я не знаю, отличается ли конфигурация имени атрибута в разных версиях. Моя версия Hadoop — 3.1.1, а версия hbase — 1.2.9.
<!-- 正确的配置的属性名应为hbase.root.dir而不是hbase.rootdir -->
<property>
<name>hbase.root.dir</name>
<value>hdfs://localhost:8020/hbase</value>
</property>