打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
HBase的物理模型(重点****)
HBase的物理模型(重点****)
HBase的读写数据过程
WAL(Write ahead log预写日志机制)
B+ Tree/SLM(Structured Log merge 结构化的日志合并,这是由google提出来的一个数据结构)-Tree
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个
Master运行,HMaster在功能上主要负责Table和Region的管理工作:
管理用户对Table的增、删、改、查操作;管理HRegionServer的负载均衡,调整Region分布,在Region Split后,
负责新Region的分配;在HRegionServer停机后,负责失效HRegionServer上的Regions迁移。
把HMaster简单比作NameNode
HRegionServer
HRegionServer为客户端提供一组可用的HRegion,用于接受客户端读写的需要,HRegionServer需要在HMaster中进行注册
在$HBASE_HOME/conf/regionservers中有配置HRegionServer的机器,一个hbase集群中可以有多个HRegionServer。
把HRegionServer简单比作DataNode
   
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
   HRegionServer包含了一个HLog部分和HRegion部分(多个HRegion)。
   HLog部分保存着用户操作hbase的日志,用户的操作都会先记录到HLog中,然后再保存到HRegion中。
   HRegion其实就是存储的实际数据了。它包含了多个HStore。
HRegion
HRegion是存储一个张表的一个特定的Region数据的。一个HRegion存放了一行数据的所有的列,同时一张表
有很多个HRegion组成。
region有一个startKey和一个endKey,[startKey, endKey)(最后一个region的endKey包涵在内)
rowkey--->1~100,由10个region来组
region-0 [null, 10)
region-1 [10, 20)
...
region-8 [80, 90)
region-9 [90, null]
HRegion是由表和key的扩展来定义的,换句话说,HRegion就是hbase中表的横向的扩展,
近似的,为每一个列族构建一个单独的store
HStore
Store在一个Region中就代表了一个列族,由一个MemStore和多个StoreFile组成,在HLog中
追加数据是在HRegion这个级别来完成的,Store提供最重要的一个服务就是Compaction(合并 压缩)服务
根据配置信息,对storeFile中的数据一次性进行聚合合并。
需要工作的一件事就是参与HLog的重建工作,在存放数据到HStore的时候,HRegion还将数据存放到HLog里面了,
当HStore将数据完成存放到HStore对应StoreFile中的时候,会向HLog发送删除文件内容的指令,但是只有当配置条件
生效或者所有的Store都关闭的时候,才会删除HLog中对应的数据,说白了就是之前执行的是标记删除。
Deal with  a man as he deals with you以其人之道还治其人之身
MemStore
每一个HStore拥有一个MemStore,用于更新Cell,不能并行操作(单线程),在操作的收必须要持有一个读锁或者写锁,由HStore来完成
更新MemStore中数据的操作。
memstore默认大小是堆内存的40%(hbase.regionserver.global.memstore.size),也就是说当达到了堆内存的40%的时候就要往磁盘中刷
数据,但是这里有一个限制hbase.regionserver.global.memstore.size.lower.limit,当达到该参数的95%的时候就要往磁盘刷数据,也就是说
当达到堆内存的40%*95%=38%的时候要往磁盘刷数据。
StoreFile
Major.compaction:大合并(主合并)
将一张表对应的所有的HFile进行合并操作,这种大合并的操作是非常消耗磁盘的IO,网络的IO,要在实际生产中尽量不要这么做。
Minimum.compaction:小合并
在HStore向StoreFile存储完毕之后要向HLog发送一条指令,删除对应数据,但是这是一个标记删除;
把一个HStore中的多个StoreFile进行合并
HFile
用于存储HBase数据的k-v键值对的文件,其中k和v都是有序的字节数组。
HFile构成:
HFile index
k
v
block块
data block的组成
meta data blocks
fileinfo block
data block index
meta data block index
a fixed size trailer
在每一个datablock块其实都有一个magic number作为标记
优化的建议:
默认的block块大小在65536byte,16k,一般在8k~1M之间。
如果我们对于一张表主要执行的顺序写的操作,
可以将这个block设置大一点,当然这会导致随机写操作的低效率(因为要不断进行数据的解压缩)
如果我们对于一张表主要执行的随机写的操作,可以将这个block设置的小一点,但是这样就要求有更多的内存空间用于存储
block的索引index
因为我们要想查询的速度快一点,就只能把数据存储在内存中,而且为了更快还提供了数据块的索引index,所以也希望在内存中
能够容纳下更多的所以,但是内存总归是由有限的,如果是顺序写的操作,我们就适当将block调大;而随机适当降低block的大小,
最理想的操作是每一个k-v键值对创建一个索引,但理想很丰满,现实很骨感。
<Rowkey, <cf, <cq, <ts, value>>>>
一个HBase集群
|————一个Active HMaster(同时可以有多个standby hmaster)
|————多个HRegionServer
|————一个HLog
|————多个HRegion
|————多个HStore(Store由一些拥有共同列的行数据组成,其实说白了这个Store就是一个列族的一部分行数据)
|————一个MemStore
|————多个StoreFile
HBase的优化的建议(重点*****)
Row的设计
select * from t where name like '%....%'这种表现能力相对比较弱;再一个所有的hbase的操作都要基于rowkey,所以在设计HBase
表的时候就要非常非常重视这个行健的设计。
又由于HBase的数据是安装行健的字节顺序进行排列的,所以极容易出现这个行健集中,进而操作HBase单个或者某几个Region压力多大
而操作的Region瘫痪的事故,我们这些问题称之为HBase的热点问题。
所以对于上述两种问题,我们在设计HBase行健rowkey的时候,就要非常注重rowkey的,第一表现力、第二避免由于设计造成的热点问题。
时间戳 手机号 mac地址 ip地址 (思考?谁做行健,如果在hbase中进行存储)
1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200
方案一:手机号做行键
一般情况下这个手机号就这么集中133 131 136 138 139 。。。。因为手机号连续,所有有热点的风险
方案二:ip地址做行键
因为在一个范围内的用户都是使用同一个ip上网,所以无法表示一个独立的用户,所以在业务上行不通
方案三:时间戳
第一时间戳连续,其次同一个时间戳有多个用户的点击,所以有高概率的热点+业务上行不通
方案四:时间戳+手机号
在一定程度上课,可以,但是要稍微进行一个修正,但一般在业务上也难以行的同
1363157985066_13726230503,问题同方案三
13726230503_1363157985066,问题同方案三
方案五:时间戳+手机号+ip地址
pass
终极版
1、根据这个连续的思路,我们可以将手机号倒置(str.reverse())
2、添加随机前缀(10以内)
3、倒置的手机号_时间戳|倒置的时间戳_手机号|随机前缀_手机号_时间戳
为了避免hbase行健的热点问题,其次有提高行健表现能力的问题,我们第一步使用1 2中的解决方案,其次我们使用3的方案去提高rowkey表现能力
尽可能多的将查询条件存放在行健中
将这些尽可能多的条件存放在行健中所组成的行健,我们称之为hbase的复合键。
对列族+列等等设计的一些要求:
在做列族和列限定符等设计的尽量的减少空间的占用,使用想对比较简单的字符去表示,可以节省非常多的内存空间,以存放更多的额数据,
来提高hbase读写的效率。
HBase和Hive以及Phoenix整合(***)
启动hive,进入hive的终端
/opt/hive/bin/hive --auxpath /opt/hive/lib/hive-hbase-handler-2.1.0.jar,/opt/hive/lib/zookeeper-3.4.6.jar --hiveconf hbase.master=uplooking01:16010 --hiveconf hbase.zookeeper.quorum=uplooking01,uplooking02,uplooking03
create table h2hb_1(
id int,
name string,
age int
)row format delimited
fields terminated by ','
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties (
"hbase.columns.mapping" = ":key,cf:name,cf:age",
"hbase.table.name" = "t3"
);
hive> load data local inpath '/root/data.log' into table h2hb_1;
FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD
因为load方式,其实并没有告知hbase数据发生变化,所以不支持,只能使用从其它表进行转换,insert into xx select 
如果要去管理hbase中已经存在的表,这个时候,hive中新建的表只能是外部表
在hive中创建了一张表h2hb_1,有三列内容id, name, age,同时映射到hbase中的表t,其中id对应行健
name对应hbase中列族cf中的name,age同理
如果hbase中已经存在该表
如果使用上述建表语句创建的时候,则会报错,因为在hbase中已经存在了一张表为t,所以这时只能创建外部表去映射hbase中的一张表。
create external table h2hb_2
(id int,
name string,
age int
)row format delimited
fields terminated by ','
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties (
"hbase.columns.mapping" = ":key,cf:name,cf:age",
"hbase.table.name" = "t"
);
我们即可对hbase中的表,使用hql来进行常见的分析操作,比较便利。
HBase和Phoenix的整合
安装Phoenix
约定安装到/opt目录下面
解压:
soft]# tar -zxvf phoenix-4.7.0-HBase-1.1-bin.tar.gz -C ../
重命名 opt]# mv phoenix-4.7.0-HBase-1.1 phoenix
拷贝lib目录下面jar包到regionserver机器的lib($HBASE_HOME/lib)目录
phoenix]# scp *.jar root@uplooking02:/opt/hbase/lib/
phoenix]# scp *.jar root@uplooking03:/opt/hbase/lib/
重启regionserver
hbase-daemon.sh stop regionserver
hbase-daemon.sh start regionserver
将phoenix中的client拷贝到hbase的client中,重启master
phoenix]# cp phoenix-4.7.0-HBase-1.1-client.jar /opt/hbase/lib/
另外,为了防止出错,将phoenix-4.7.0-HBase-1.1-client.jar添加到HBASE_CLASSPATH
vim /opt/hbase/conf/hbase-env.sh
export HBASE_CLASSPATH=$HBASE_CLASSPATH:/opt/hbase/lib/phoenix-4.7.0-HBase-1.1-client.jar 
官网测试案例:
./psql.py uplooking01:2181 us_population.sql us_population.csv us_population_queries.sql
操作:
./sqlline.py uplooking01:2181/hbase
创建一张表:
create table p(id integer primary key, name varchar(20), age integer);
注意:我们气的表名叫小写的p,但是反应到Phoenix数据库中转变成为大写的P,
插入数据:
upsert into P values(1, 'zhangsan', 13);//插入数据的时候,如果是字符串必须要是用''
上述创建表的时候有一不好的地方,首先:创建好的表名大写,其次自动生成的列族名称为0,如果是integer设置的字段显示为16进程的数据,不方便观察。
下面的创建的方式
create table "p2"(id varchar(20) primary key, "cf"."name" varchar(20), "cf"."age" varchar(3));
其中的p2为表名,注意,在Phoenix中的所有关于p2的操作,都需要带上"",如若不然会去找P2,这在系统中是不存在的。
cf表示列族名称
使用GUI的工具进行操作
java -jar squirrel-sql-3.7-standard.jar
根据提示进行安装操作








本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
HBASE松散数据存储设计初识 - 西湖边的穷秀才-文初 - BlogJava
工作中我自己总结的hbase文档,供初学者学习。看了这个,就不用
分布式系统概述(Hadoop与HBase的前生今世)
HBase 底层原理详解
HBase学习之路 (七)HBase 原理
基于Hadoop分布式数据库HBase1.0部署及使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服