Apache Hbase概述

2022-04-27 00:00:00 数据 删除 文件 就会 区域

HBase是一个领先的No-SQL数据库,它在HDFS上存储数据

HBase是面向列的数据库

HBase是一个分布式哈希映射

HBase是基于Google Big Table论文

HBase使用HDFS作为存储,并利用其可靠性

数据访问速度快,响应时间约2-20毫秒

支持每个节点20k到100k以上ops/s的数据库读写操作

扩展到20,000多个节点

关系型数据库一般都有外键约束,代表了数据和数据之间的联系,数据生成过程不一定是一致的;关系型数据库保证数据不会冗余。非关系型数据库就是把很多数据放到一起。

Hbase不是面向文档的,应用于数据查询,可以存数据,查数据,很少会写数据;Hive应用于数据分析擅长复杂数据处理,分析可以拼数据,所以Hive比较慢

Apache HBase用例:
捕获增量数据——时间序列数据
高容量,高速写入


信息交换——消息传递
高容量,高速读写


内容服务——Web应用程序后端
高容量,高速度读取


示例—Facebook中的HBase:
9000个分布式缓存实例

4000 mysql碎片

自2011年以来移动到Hbase


示例—阿里巴巴搜索中的HBase:
自2010年以来,HBase一直是阿里巴巴搜索系统的核心存储

目前的规模:

3个集群每个集群1000 +集群

分享Flink纱

服务每天操作超过10M+/s

Apache HBase生态系统:
Lily——HBase中的CRM

OpenTSDB——时间序列数据的HBase

Kylin——HBase中的OLAP系统

Phoenix——HBase中的SQL

Splice Machine——HBase中的OLTP系统,在HBase增加足够多的功能,使它能够替代关系型数据库

Apache Tephra——HBase事务功能支持

TiDB——分配SQL数据

Apache Omid——正面的事务管理

Yarn应用时间轴服务器v.2移动到HBase

Hive元数据存储正在迁移到HBase

Ambari Metrics服务器将使用HBase作为数据存储

HBase整体物理架构:


HBase RegionServer(区域服务器)与HDFS DataNode配置在一起

HBase Client(客户端)直接与区域服务器通信以发送和接收数据

HBase Maste管理区域分配并处理DDL操作

在ZooKeeper中维护在线配置状态

HBase Master和ZooKeeper不涉及数据路径,HBase Master要通过ZooKeeper保证稳定性,一旦HBase Master掉电或者出现错误,ZooKeeper就会接替HBase Maste,使得服务不会出错

RegionServer是HBase集群中重要的部分,具有真正处理数据,存储数据的功能,与HDFS DataNode配置在一起,RegionServer和HBase Master直接通信,一旦RegionServer把HBase Master交付给HBase Client,两者就会直接通信,数据就会从客户端传入RegionServer,ZooKeeper和HBase Maste并不会参与数据处理

RegionServer(处理读数据和写数据)区域服务器物理架构


RegionServer写数据的时候,先把数据写到HLog(WAL)里,数据写满WAL以后会把数据flash到HRegion中HStore中的HFile中去,在写数据的时候为了保证数据的安全性会在WAL和MemStore中写两份数据,然后把文件存到Hadoop的HDFS文件中,这个文件就叫做HFile,然后WAL就会清空,再次填入新数据,WAL就相当于数据的备份地区

HBase就相当于一个集群

HBase读的时候对应读的区域BlockCache,如果检测到了读的请求就会先去memory中查把数据直接返回,但是如果没有直接在memory中找到数据,就会去Hadoop的HFile中去查

区域服务器包含单个WAL,单个块缓存(读缓存)和多个区域

区域包含多个存储,每个Column Family(列族)对应一个存储

一个存储由多个存储文件和一个MemStore(写/编辑缓存)组成

一个StoreFile对应于一个HFile和Column Familay(列族)

HFiles和WAL作为序列文件保存在HDFS上。

区域和表的逻辑架构


单个表被划分为大小大致相同的Regions。

Regions被分配到跨集群的Regions服务器。

一个区域只分配到一台服务器

Regions服务器承载的Regions数量大致相同。

在区域内拆分列族以将设置列分组在一起

客户端直接与区域服务器对话

行的逻辑结构:


Rowkey(行键)是的和排序的

Schema可以定义何时插入记录

每一行都可以定义自己的列,即使其他行不使用它们

将相关列分组进保存在不同的文件中的Column Families(列族)(<3)

Column qualifier是真正的列名

使用的timestamps(时间戳)维护多个行版本,对每条数据都生成一个时间戳,这样找到每一个数据都十分方便

Value(值)类型可以在不同版本之间更改

HBase只知道字节,客户端必须传递意义

单元格的物理坐标:

Region directory(区域目录) => CF Directory(CF目录) => Row Key(行键) => Column Family(列族) => Column Qualifier(列限定符) => timestamp(时间戳) => Version(版本)

数据管理:
在三个位置可以追踪到什么

系统目录表hbase:meta,整个查询过程中用到的元数据

在元数据中找一个数据HMaster先找到Region,然后找到RegionServer,找到其中的表,找到具体的RowKey

HDFS目录中的文件

打开服务器上的区域实例

系统将这些位置对齐

有时(非常罕见)可能需要使用HBase Fsck进行修复

冗余信息对于修复损坏的表非常有用

HBase架构的优势:
强一致性模型:

当写返回时,所有阅读器将看到相同的值

自动缩放:

当区域变得太大时就会分裂

使用HDFS来传播数据和管理空间

内置的复苏:

使用写前日志,类似于在文件系统上写日志

使用Hadoop集成:

HBase上的MapReduce很简单

如何访问HBase — hbase shell
HBase shell是一种使用HBase的交互模式

它支持完整的hbase命令集

CMD Category

CMDs

General

version, status, whoami, help

DDL

alter, create, describe, disable, drop, enable, exists, is_disabled, is_enabled, list

DML

count, delete, deleteall, get, get_counter, incr, put, scan, truncate

Tools

assign, balance_switch, balancer, close_region,

compact, flush, major_compact, move, split, unassign, zk_dump

Replication

add_peer, disable_peer, enable_peer, remove_peer, start_replication, stop_replication

HBase 常用命令:
通用命令:

hbase shell:进入HBase Shell

Status:提供HBase的状态,例如,服务器的数量。

Version:提供正在使用HBase版本。

table_help:表引用命令提供帮助。

Whoami:提供有关用户的信息。

List:查看当前HBase有哪些表

数据定义语言:表操作
Create:创建一个表。

List:列出HBase的所有表。

Disable:禁用表。

is_disabled:验证表是否被禁用。

Enable:启用一个表。

is_enabled:验证表是否已启用。

Describe:提供了一个表的描述。

Alter:改变一个表。

Exists:验证表是否存在。

Drop:从HBase中删除表。

drop_all:丢弃在命令中给出匹配“regex”的表。

数据操纵语言:
Put:把指定列在指定的行中单元格的值在一个特定的表。

Get:取行或单元格的内容。

Delete:删除表中的单元格值。

Deleteall:删除给定行的所有单元格。

Scan:扫描并返回表数据。

Count:计数并返回表中的行的数目。

Truncate:禁用,删除和重新创建一个指定的表。

具体操作:
//进入HBase Shell

hbase shell

//查看当前HBase有哪些表

list

//创建表t_user,后两项是列族,列族一般不超过3个

create 't_user',{NAME=>'name'},{NAME=>'password'}

//获得表t_user的描述信息

describe 't_user'

//禁用表

disable 't_user'

//删除表,删除表之前要先把表禁用掉

drop 't_user'

//查询表是否存在

exists 't_user'

//查看全表数据

scan 't_user'

//插入数据,分别是表名、key、列(列族:具体列)、值。HBase是面向列的数据库,列可无限扩充

put 't_user' ,'001','cf1:name','chenxj'

put 't_user' ,'001','cf1:age','18'

put 't_user' ,'001','cf2:sex','man'

put 't_user' ,'002','cf1:name','chenxj'

put 't_user' ,'002','cf1:address','fuzhou'

put 't_user' ,'002','cf2:sex','man'

//获取数据,可根据key、key和列族等进行查询

get 't_user','001'

get 't_user','002','cf1'

get 't_user','001','cf1:age'

//删除表中的rowkey

deleteall ‘t_user’,’002’

//删除表中的列column

delete 't_user' ,'002','cf1:address'

//删除表中的值

delete 't_user' ,'002','cf1:address',时间戳

//删除表中的列族,column family

alter 't_user', ’delete=>’cf1’

//批量导入数据

hdfs dfs put -f hbase_import_data.csv /demo/data/

hbase org.apache.hadoop.hbase.mapreduce.ImportTsv

-Dimporttsv.separator=,

-Dimporttsv.columns="HBASE_ROW_KEY , order:numb , order:date"

customer /demo/data/hbase_import_data.csv

//整体示例

Create ‘xuanke’,’stu’,’crs’

Create ‘xuanke’,{NAME=>’stu’},{NAME=>’crs’,VERSIONS=>3}

scan ‘xuanke’,{STARTROW=>’j’,STOPROW=>’m’}

describe ‘xuanke’

put ‘xuanke’,’2015001’,’stu:sname’,’zhangsan’

put ‘xuanke’,’2015001’,’stu:sex’,’male’

put ‘xuanke’,’2015001’,’stu:age’,’25

put ‘xuanke’,’2015001’,’crs:cname’,’math’

put ‘xuanke’,’2015001’,’crs:points’,2.0

put ‘xuanke’,’2015001’,’crs:score,86

get ‘xuanke’,’2015001’,

//改变表增加VERSIONS

alter ‘xuanke’, NAME=>’stu’, VERSIONS=>5

了解HBase JavaAPI:
Configuration 创建配置

Connection 建立连接

ConnectionFactory 工厂方法

Admin 管理类

Connection.getAdmin()

描述符:

表Table,

表名TableDescriptor,

列族ColumnFamily,



创建配置HBaseConfiguration

建立连接Connection

获取管理对象Admin

通过管理对象进行操作:

建表

表名TableName

列族描述符

ColumnFamilyDescriptor

表名,RowKey,列族,列,值

Java重载能不能有不同返回值类型
能,重载只关心参数一样不一样,返回值是什么都没有关系

根据位置进行查询
根据区域进行查询
储存企业信息
按地理位置查询
按区域查询
数据倾斜

如何避免数据倾斜,创建合理的rowkey散列到不同的节点上

HBase Rest API:
Start/Stop rest service

./hbase-daemon.sh start rest -p 9081

./hbase-daemon.sh stop rest -p 9081

Curl -v -X PUT

'http://localhost:9081/test/schema'

-H 'Accept: application/ json"

-H "ContentType: application/ json"

之前都是固定的

-d '{"@name":"test","ColumnSchema":[{"name":"data"}]}'

"@name":"test":代表表的名字

TABLE='test'

FAMILY= ' data '

KEY=$(echo 'row1' | tr -d "n" | base64)

COLUMN=$(echo 'data:test' | tr -d "\n" | base64)

DATA=$(echo 'some data' | tr -d "\n" | base64)

curl -v -X PUT

‘http://localhost :9081/ test/ row1/ data:test'

-H "Accept: application/ json"

-H "Content-Type: application/json"

-d '{"Row":[f"key":"'$KEY'", "Cell":[{" column":"'$COLUMN'","$":"' $DATA'"}]}]}’

如何访问HBase:
Phoenix是:
HBase的一个SQL皮肤。

提供了一个在HBase SQL接口来管理数据。

创建表、插入、更新数据和执行低延迟通过JDBC查询。

PhoenixJDBC驱动程序很容易嵌入到任何支持JDBC应用程序。

Phoenix的整体架构


Phoenix提供了类似sql的语法:
API代码

Phoenix DDL

HBaseAdmin hbase = new HBaseAdmin(conf);

HTableDescriptor desc = new

HTableDescriptor("us_population");

HColumnDescriptor state = new

HColumnDescriptor("state".getBytes());

HColumnDescriptor city = new

HColumnDescriptor("city".getBytes());

HColumnDescriptor population = new

HColumnDescriptor("population".getBytes());

desc.addFamily(state);

desc.addFamily(city);

desc.addFamily(population);

hbase.createTable(desc);

CREATE TABLE us_population (

state CHAR(2) NOT NULL,

city VARCHAR NOT NULL,

population BIGINT

CONSTRAINT my_pk PRIMARY KEY (state, city)

);

更加灵活

熟悉的SQL语法

集成

提供附加约束检查。

Phoenix支持关键:
支持的SQL语句

标准SQL数据类型

UNION ALL

SELECT, UPSERT, DELETE

窗口函数

JOINs: Inner and Outer

Transactions

Subqueries

Cross Joins

Secondary Indexes

Authorization

GROUP BY, ORDER BY, HAVING

Replication Management

AVG, COUNT, MIN, MAX, SUM

Primary Keys, Constraints

CASE, COALESCE

VIEWs

PERCENT_RANK, LAST|FIRST VALUE

Phoenix示例:
增加修改:
Upstart into mytest value(‘stu001’,’zhangsan’,27)

Upstart into mytest(sex varchar) value(‘stu003’,’wangwu’,27,’male’)

Phoenix和Hbase原有的数据映射:

CREATE TABLE “student” (“id”,varchar(20) primary key,”f1”.”name” varchar(50)) column_encoded_bytes=0;

Phoenix非常适合的情况:
快速而容易地构建由HBase支持的应用程序

SQL应用程序需要极大的规模、性能和并发性

在转换到Hadoop时重用现有的SQL技能

BI工具

分析和特别报表

考虑其他工具的情况:
涉及大型连接或SQL特性的复杂SQL查询

全表扫描

ETL作业(之类的)

应用程序驱动程序/接口

HBase上Hive的用户模式
使用HBase作为Hive源(数据仓库分析)

使用HBase作为Hive Sink(批量加载数据到HBase表)


同时使用HBase(计算和存储摘要)


Hive HBase外部表:
只支持select和insert,不支持HBase中的版本控制

性能是好的

create external table customer(

name string,

order_numb string,

order_date string,

addr_city string,

addr_state string)

stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

with

serdeproperties ("hbase.columns.mapping"=":key,order:numb,order:date,addr:city,addr:state")

tblproperties("hbase.table.name"="customer");

HBase主题和优化:
命名空间:

什么是命名空间 — 一种易于表管理的机制

可以创建、删除或更改名称空间

通过指定表单的完全限定表名,可以在创建表时确定名称空间成员关系

#创建一个命名空间

create_namespace 'my_ns’

#在my_ns命名空间中创建my_table

create 'my_ns:my_table', 'fam'

#删除命名空间

drop_namespace 'my_ns’

#改变命名空间

alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}

GRANT的安全性:
使用grant命令将表上的特定/更新权限(如读、写、执行和管理)授予特定的用户。

grant命令的语法如下:

grant <user> <permissions> <table> [<column family> [<column; qualifier>]]

我们可以为RWXCA集合中的用户授予零个或多个特权,其中:

R — 表示读特权

W — 代表写的特权

C — 表示创建特权

A — 表示管理权限

示例:grant 'will', 'RWCA', 'my_hbase_table'

具有Revoke & user_permission的安全性

使用revoke命令删除表中用户的所有权限

grant命令的语法如下:

revoke <user> <table> [<column family> [<column; qualifier>]]

示例:revoke 'will', 'my_hbase_table'

使用user_permission命令列出特定表的所有权限

user_permission的语法如下所示:

user_permission 'tablename'

示例:user_permission 'my_hbase_table'

Region分割:
什么是分裂:

“分割”或“区域分割”是将一个区域划分为两个区域

通常是因为它太大了

这两个分割通常会在不同的服务器上结束

区域分割的策略:

自动(常见)

手动(或按代码预分割)

可插入分割政策

乎每个人都使用“ConstantSizeRegionSplitPolicy”

当存储文件变得比hbase.hregion.max.filesize更大时,就会发生分割

仅限专家:存在其他分割策略,您可以编写自己的策略

Compactions:动机

日志结构合并(LSM)

传统数据库的架构是更新现有数据

大多数现代数据库使用某种日志结构的合并(LSM)

这意味着只需要将值写到日志的末尾,然后进行排序

Pro:插入和更新非常快

Con:使用更多的空间,所以我们需要进行压缩

Compaction的实现

小的Compaction:

将文件合并成更少的大型文件

主要的Compaction:


Compactions控制:

Compactions:

Compaction:重写日志文件并丢弃旧值

节省空间,使读取和恢复更快

Compaction:昂贵的I/O密集型操作。通常希望这发生在非高峰时间

有些人从外部安排compactions,compactions很少完全禁用

Flush -> Minor Compaction -> Major Compaction:

Flush:将memstore写到一个新的存储文件中。事件触发

Minor Compaction:将近的存储文件合并到更大的存储文件中。事件触发。

Major Compaction:主要重写存储数据以小化空间利用率。时间触发。

相关的控制:
Flush:hbase.hregion.memstore.flush.size

Minor Compaction:hbase.hstore.compaction.min/max:大和小的存储文件(由刷新创建),必须存在这些文件才能触发minor compaction

Major Compaction: hbase.hregion.majorcompaction:Major Compaction的时间间隔

相关文章