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用例:

捕获增量数据——时间序列数据

高容量,高速写入

apache hbase 中文 apache hbase简介_apache hbase 中文

信息交换——消息传递

高容量,高速读写

apache hbase 中文 apache hbase简介_大数据_02

内容服务——Web应用程序后端

高容量,高速度读取

apache hbase 中文 apache hbase简介_HBase_03

示例—Facebook中的HBase:

9000个分布式缓存实例

4000 mysql碎片

自2011年以来移动到Hbase

apache hbase 中文 apache hbase简介_大数据_04

示例—阿里巴巴搜索中的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整体物理架构:

apache hbase 中文 apache hbase简介_大数据_05

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(处理读数据和写数据)区域服务器物理架构

apache hbase 中文 apache hbase简介_apache hbase 中文_06

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上。

区域和表的逻辑架构

apache hbase 中文 apache hbase简介_服务器_07

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

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

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

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

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

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

行的逻辑结构:

apache hbase 中文 apache hbase简介_apache hbase 中文_08

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重载能不能有不同返回值类型

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

  1. 根据位置进行查询
  2. 根据区域进行查询
  3. 储存企业信息
  4. 按地理位置查询
  5. 按区域查询

数据倾斜

如何避免数据倾斜,创建合理的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的整体架构

apache hbase 中文 apache hbase简介_数据_09

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源(数据仓库分析)

apache hbase 中文 apache hbase简介_apache hbase 中文_10

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

apache hbase 中文 apache hbase简介_服务器_11

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

apache hbase 中文 apache hbase简介_大数据_12

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:

apache hbase 中文 apache hbase简介_服务器_13

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的时间间隔