Apache Hbase概述
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的时间间隔
相关文章