HBase数据库设计.docx
- 文档编号:6274613
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:10
- 大小:22.65KB
HBase数据库设计.docx
《HBase数据库设计.docx》由会员分享,可在线阅读,更多相关《HBase数据库设计.docx(10页珍藏版)》请在冰豆网上搜索。
HBase数据库设计
1.HBase有哪些基本的特征?
1
HBase特征:
1
2.HBase相对于关系数据库能解决的问题是什么?
2
HBase与关系数据的区别?
2
HBase与RDBMS的区别?
2
3.HBase的数据模式是怎么样的?
即有哪些元素?
如何存储?
等3
1).数据模式3
2).HBase的基本元素:
4
3)数据模型有哪些操作?
4
4)返回结果的排序方式是什么?
5
5)最后,HBase不支持联合查询5
mapreduce与HBase表配合使用5
4.HBase的模式Schema设计的一些概念和原则5
1)模式的创建与更新5
2)列族的数量6
3)行键设计RowKey6
5.HBase的拓扑结构是什么?
7
1)拓扑结构7
2)HBase与ZooKeeper的关系是什么?
7
3)HBase的内部结构管理状况:
7
4)HBase的使用示例:
8
6.HBase与Cassender的比较8
7:
几个关键概念:
9
行键(RowKey)9
列族(ColumnFamily)9
时间戳(TimeStamp)9
单元格(Cell)9
区域(Region)10
2:
hbase之宽表与窄表对split的影响10
3:
HBase中所有行数据的均衡分布问题(region)10
1.HBase有哪些基本的特征?
HBase特征:
类似于google的bigtable的开源实现,拥有以下
1).在HDFS之上
2).基于列存储的分布式数据库
3).用于实时地读、写大规模数据集
其他HBase的特性:
1).没有真正的索引,行顺序存储,也没有所谓的索引膨胀问题。
2)自动分区,表增长时,自动分区到新的节点上。
3)线性扩展和区域会自动重新平衡,运行RegionServer,达到负载均衡的目的。
4).容错和普通商用的硬件支持。
这点同hadoop类似。
2.HBase相对于关系数据库能解决的问题是什么?
HBase与关系数据的区别?
其实就是关系数据库与HBase各自的优缺点。
关系数据库的缺憾:
1).扩展困难
2).维护复杂
HBase就是解决可伸缩行的问题。
通过简单增加节点来获取线性扩展性。
不支持SQL。
HBase与RDBMS的区别?
1).表的设计:
HBase的表可以很高,很宽,可伸缩性很强。
而且表的模式是物理存储的直接反映。
2).拓扑:
HBase能水平分区并在上千个节点上自动复制。
3).应用形式:
开发者必须承担更多的责任来正确地利用HBase的检索和存储方式。
4).RDBMS遵循固定的模式,如“codd12规则”,强调事务的“强一致性”、参照完整性、SQL支持、数据的逻辑与物理形式相对独立。
等等。
适用于中小规模的数据,但对于数据的规模和并发读写方面进行大规模扩展时,RDBMS会性能大大降低,分布式更为困难,因为其需要放弃很多RDBMS的易用的特性。
HBase适用于上亿、上千亿级的数据,如果是只有上千、上百万级别是数据,传统的RDBMS是更好的选择。
HBase需要更多硬件,如果硬件较少,如5个,干不成什么好事。
如果从RDBMS移植到HBase,需要消除RDBMS的很多额外特性,如列数据类型、第二索引、事务、高级查询等。
3.HBase的数据模式是怎么样的?
即有哪些元素?
如何存储?
等
1).数据模式
如下列三个表:
第一个是一个稀疏的表,实际上它是一个虚表,仅是一个概念视图,不是真实的存储形式,它来源于后两个表。
而后两个表才是真正的表,物理视图,他们是实际的存储形式,而且它们是按列族进行存储的。
RowKeyTimeStampColumnFamilycontentsColumnFamilyanchor
"n.www"t9anchor:
="CNN"
"n.www"t8anchor:
my.look.ca="CNN.com"
"n.www"t6contents:
html="..."
"n.www"t5contents:
html="..."
"n.www"t3contents:
html="..."
RowKeyTimeStampColumnFamilyanchor
"n.www"t9anchor:
="CNN"
"n.www"t8anchor:
my.look.ca="CNN.com"
RowKeyTimeStampColumnFamily"contents:
"
"n.www"t6contents:
html="..."
"n.www"t5contents:
html="..."
"n.www"t3contents:
html="..."
2).HBase的基本元素:
表、行、列、单元格:
表的基本要素
键:
一般是指行的键,即唯一标识某行的元素。
表中的行,可以根据键进行排序,而对表的访问,也通过键。
列族:
所有列族成员拥有相同的前缀,某列族的成员,需要预先定义,但也可以直接进行追加
列族
hbase表中的每个列,都归属与某个列族。
列族是表的chema的一部分(而列不是),必须在使用表之前定义。
列名都以列族作为前缀。
例如courses:
history,courses:
math
都属于courses这个列族。
列族成员会一起放进存储器。
而HBase面向列的存储,是面向列族的数据存储(这个通过上面那个表的示例可以看出来),数据存储与调优都在这个层次,HBase表与RDBMS中表类似,行是排序的,客户端可以把列添加到列族中去。
单元格cell:
单元格中存放的是不可分割的字节数组。
并且每个单元格拥有版本信息。
HBase的是按版本信息倒序排列。
区域region:
将表水平划分,是HBase集群分布数据的最小单位。
在线的所有区域就构成了表的内容。
加锁:
对数据行进行更新,都需加锁。
保持原子性。
3)数据模型有哪些操作?
Get、Scan、Put、Delete,即返回特定行的属性,多行属性、插入、删除数据。
这些都需要一个HTable实例来操作。
分别有Get、Scan、Put、Delete类来指定相应的参数、属性。
以scan为示例:
[java]viewplaincopy
HTablehtable=...//instantiateHTable
Scanscan=newScan();
scan.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("attr"));
scan.setStartRow(Bytes.toBytes("row"));//startkeyisinclusive
scan.setStopRow(Bytes.toBytes("row"+(char)0));//stopkeyisexclusive
ResultScannerrs=htable.getScanner(scan);
try{
for(Resultr=rs.next();r!
=null;r=rs.next()){
//processresult...
}finally{
rs.close();//alwaysclosetheResultScanner!
}
4)返回结果的排序方式是什么?
先是行、再是列族、再是列修饰符,最后是时间戳(反向排序,最新的在前面)。
5)最后,HBase不支持联合查询
mapreduce与HBase表配合使用
a)默认mapreduce的任务分割是根据HBase表中region的多少来分割,一个region就有一个map。
4.HBase的模式Schema设计的一些概念和原则
1)模式的创建与更新
可以使用HBaseShell或HBaseAdmin来创建和编辑HBase的模式。
在0.90.x版本,只能先禁用表,再修改列族,而0.92.x版本以后,支持在线修改。
而且表和列族修改后,如size,region,blocksize等,在下次主紧缩或存储文件时起作用。
2)列族的数量
-列族数量越少越好,即使同时有两个列族,查询的时候总是访问其中一个列族,不会同时访问。
-当一个表存在多个列族,当基数差距很大时,如A族有100万行,B族10亿行,A族可能会被分散到很多区域region,导致扫描A的效率降低。
-另外,多个列族在flush和compaction时,会造成很多I/O负担。
3)行键设计RowKey
a.不要将RowKey设计成有序的形式,因为这样容易阻塞并行性,将负载压都在一台机器上
b.定位一个单元,需要行,列名和时间戳。
如果一个单元格的坐标很大,会占用内存,索引用光。
所以,解决方法:
列族名尽量小,如一个字符a,短属性名,而行键长度可读即可(行键长度对数据访问无太大影响),将数字字符转换为数字字节模式(节省空间)。
c.倒序时间戳有助于找到找到最近版本值
d.行键是在列族范围内有效,不同列族中可以拥有同样的行键
e.行键永远不能变
4)HBase支持所有能转换为字节数组的东西,如字符串、数字、复杂对象、计数器、甚至图像。
5)列族可以设置存活时间TTL,超时后,HBase自动删除数据
6)第二索引和查询:
这里面有很多东西,需要查看对应版本官方的文档更好些。
5.HBase的拓扑结构是什么?
1)拓扑结构
类似于HDFS的mast与slave,mapreduce的tasktracker与jobtracker的关系,HBase也有master和RegionServer
2)HBase与ZooKeeper的关系是什么?
HBase必须管理一个ZooKeeper实例,它依赖ZooKeeper,主要目的是,通过ZooKeeper来协调区域内的服务器,它负责目录表、主控机地址等重要信息,若有服务器崩溃,HBase就可以通过ZooKeeper来协调分配。
RegionServer在HBase的配置文件conf/regionservers文件中,而HBase集群的站点配置在conf/hbase-site.xml和conf/hbase-env.sh中配置。
HBase尽量遵循了Hadoop的规则。
3)HBase的内部结构管理状况:
其内部有-ROOT,-META的特殊目录表,用于维护当前集群上所有区域的列表、位置和状态。
-ROOT表包含-META表的区域列表,而-META表示包含用户的的区域列表。
所以,HBase管理的流程是:
Client--链接到ZooKeeper--查找-ROOT表的位置--查找-META表的位置--查找用户的区域所在的节点、位置及其状态等--直接管理指定区域的RegionServer并进行交互。
HBase支持Java及MapReduce的开发。
HBase提供了Thrift、REST及Avro的接口。
HBase需要有一个相应的接口客户端负责与这些接口的交互。
但是这些需要代理进行处理请求和响应,所以比java更慢。
%hbase-daemon.shstart/stoprest/thrift/avro//启动或终止对应的客户端
4)HBase的使用示例:
1.创建表
如在外壳环境下:
create‘station’,{NAME=>'info',VERSION>=1}
2.加载数据
MapReduce与HBase可以充分利用集群的分布式模型,将原始数据复制到hdfs中。
每个任务只有一个HTable实例,默认情况下,每个HTable.put(put),在执行插入操作时,不任何缓存。
不过想使用缓存,是可以自己设置的。
3.Web查询
可以直接使用HBase的javaAPI来实现一个Web的应用。
HTable.get()可用来获取已定义的列族的所有内容。
get的结果返回给Result,包含的是数据行。
HBase还可以使用扫描器scanner来检索观测数据。
并且获取的是一个有序的结果。
类似于传统数据库中的“游标”。
HTable.getScanner(scan).
6.HBase与Cassender的比较
不同的应用,应该选用不同的NoSQL数据库,Cassandra,HBase,MongoDB,Riak都有各自的优缺点。
而且以上各种数据库,都在发展中,随着版本变换,特点也会发生变化。
根据CAP理论(Consistency一致性,Availability可获得性,Partitioningtolerance分区容忍),二者可以简单区分一下。
HBase是Hadoop生态系统的一部分,又其他框架如PIG,HIVE等的支持,而Cassender上运行mapreduce相对比较复杂的。
总体上来说,Cassender或许在存储上比较有效,但HBase的数据处理能力更强些。
HBase有Shell脚本和Web页面的处理能力,而Cassender没有Shell的支持,只有API,可用性上不如HBase。
Cassender的Schema发生变化时,需要集群重启,但Cassender宣称“写操作永不失败”,而HBase是有可能的。
场景:
Cassandra对由高速光纤连接的小型数据中心(几百个节点左右)是最佳的,而HBase适合网络“缓慢”且不可预料的Internet网。
其他:
HBase性能调优,别人很好的总结:
7:
几个关键概念:
行键(RowKey)
--行键是字节数组,任何字符串都可以作为行键;
--表中的行根据行键进行排序,数据按照Rowkey的字节序(byteorder)排序存储;
--所有对表的访问都要通过行键(单个RowKey访问,或RowKey范围访问,或全表扫描)
列族(ColumnFamily)
--CF必须在表定义时给出
--每个CF可以有一个或多个列成员(ColumnQualifier),列成员不需要在表定义时给出,新的列族成员可以随后按需、动态加入
--数据按CF分开存储,HBase所谓的列式存储就是根据CF分开存储(每个CF对应一个Store),这种设计非常适合于数据分析的情形
时间戳(TimeStamp)
--每个Cell可能又多个版本,它们之间用时间戳区分
单元格(Cell)
--Cell由行键,列族:
限定符,时间戳唯一决定
--Cell中的数据是没有类型的,全部以字节码形式存贮
区域(Region)
--HBase自动把表水平(按Row)划分成多个区域(region),每个region会保存一个表里面某段连续的数据;
--每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region;
--当table中的行不断增多,就会有越来越多的region。
这样一张完整的表被保存在多个Region上。
--HRegion是HBase中分布式存储和负载均衡的最小单元。
最小单元表示不同的HRegion可以分布在不同的HRegionServer上。
但一个HRegion不会拆分到多个server上
2:
hbase之宽表与窄表对split的影响
只有当rowkey不同是才会做分割,而rowkey相同时即使region大小已经超过hbase.hregion.max.filesize值,也不会分割
1)宽表情况下,单独一行大小超过hbase.hregion.max.filesize值,不会做分割
2)相同rowkey下插入很多不同版本的记录,即使大小超过hbase.hregion.max.filesize值,也不会做分割
3:
HBase中所有行数据的均衡分布问题(region)
1)时间连续的数据
当处理由连续事件得到的数据时,即时间上连续的数据。
这些数据可能来自于某个传感器网络、证券交易或者一个监控系统。
它们显著的特点就是rowkey中含有事件发生时间。
带来的一个问题便是HBase对于row的不均衡分布,它们被存储在一个唯一的rowkey区间中,被称为region,区间的范围被称为StartKey和EndKey。
对于单调递增的时间类型数据,很容易被散列到同一个Region中,这样它们会被存储在同一个服务器上,从而所有的访问和更新操作都会集中到这一台服务器上,从而在集群中形成一个hotspot,从而不能将集群的整体性能发挥出来。
要解决这个问题是非常容易的,只需要将所有的数据散列到全部的Region上即可。
这是可以做到的,比如,在rowkey前面加上一个非线程序列,常常有如下选择:
2)Hash散列
您可以使用一个Hash前缀来保证所有的行被分发到多个Region服务器上。
例如:
byteprefix=(byte)(Long.hashCode(timestamp)%
byte[]rowkey=Bytes.add(Bytes.toBytes(prefix),Bytes.toBytes(timestamp);
这个公式可以产生足够的数字,将数据散列到所有的Region服务器上。
当然,公式里假定了Region服务器的数目。
如果您打算后期扩容您的集群,那么您可以把它先设置为集群的整数倍。
生成的rowkey类似下面:
0myrowkey-1,
1myrowkey-2,2myrowkey-3,0myrowkey-4,1myrowkey-5,\
2myrowkey-6,…
当他们将按如下顺序被发送到各个Region服务器上去:
0myrowkey-1
0myrowkey-4
1myrowkey-2
1myrowkey-5
…
换句话说,对于0myrowkey-1和0myrowkey-4的更新操作会被发送到同一个region服务器上去(假定它们没有被散列到两个region上去),1myrowkey-2和1myrowkey-5会被发送到同一台服务器上。
这种方式的缺点是,rowkey的范围必须通过代码来控制,同时对数据的访问,可能要访问多台region服务器。
当然,可以通过多个线程同时访问,来实现并行化的数据读取。
这种类似于只有map的MapReduce任务,可以大大增加IO的性能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HBase 数据库 设计