1.hbase简介
答:
hadoop database是一个高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库,是主要用来存储非结构化和半结构化的松散数据。
2.关系数据库和hadoop面临的问题
答:
①hadoop可以很好地解决大规模数的离线批量处理问题,但是,受限于hadoop MapReduce编程框架的高延迟数据处理机制,使的hadoop无法满足大规模数据实时处理应用的需求;
②HDFS是批量访问模式,不是随机访问模式;
③关系型数据库无法应对在数据规模剧增时导致系统扩展性和性能问题;
④传统关系数据库在数据结构变化是一般需要停机维护,空列浪费存储空间。
3.HBASE与传统数据库的区别
答:
①数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBASE则采用了更加简单的数据模型,它把数据存储为未经解释的字符串;②数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表链接。HBASE操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBASE在设计上避免了复杂的表和表之间的关系;③存储模式:关系数据库是基于行模式存储。HBASE是基于列存储,每个列族都由几个文件保存,不同列族文件是分离的;
④数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,可以提高数据访问的性能,HBASE只有一个索引——行键;
⑤数据维护:在关系数据库中,更新操作作用会用最新的当前值去替换记录中原来的数据,旧值被覆盖后就不会存在,而在HBASE中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧的版本仍然保留;⑥可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限,HBASE这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。
4.client
答:
包含访问HBASE的接口并维护cache来加快对HBASE的访问,同时在缓存中维护着已经访问过的region位置信息,用来加快后续数据访问过程。
5.zookeeper
答:
任何时候,一个集群只有一个master,存储所有的region的寻址入口,实时监控region server的上线和下线信息,并实时通知master存储HBASE的schema和table元数据。
6.master
答:
①为region server分配region;
②负责region server的负责均衡;
③发现失效的region server并重新分配其上的region;
④管理用户对table的增删改操作。
7.region server
答:
①维护region,处理对这些region的IO请求;
②负责切分在运行过程变得过大的region。
8.region
答:
①HBASE自动把表水平划分分成多个区域(region),每个region会保存一个表里面的某段连续的数据;
②每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阈值的时候,region就和等分成两个region;
③当table中的行不断增大,就会有越来越多的region,这样一张完整的表会保存在多个region server上;
④是HBASE中分布式存储和负载均衡的最小单元,可以分布在不同的region server上;
⑤有一个或者多个store组成,每个store保存一个columns family。
9.memstore(内存写入)和storefile(磁盘写入)
答:
①一个region有多个store组成,一个store对应一个cf(列族);
②store包括位于内存的memstore和位于磁盘的storefile写操作,先写入memstore,当memstore中的数据达到某个阈值,hregion server会启动flashcache进程写入storefile,每次写入都会形成单独的一个storefile;
③当storefile文件的数据增长到一定阈值后,系统会进行合并(小合并、大合并),大合并过程中会进行版本合并和删除工作,形成更大storefile;
④当一个region所有storefile的大小和数量超过一定的阈值后,会把当前region分割成两个,并有master分配到相应region server服务器上,实现负载均衡;
⑤客户端检索数时,现在memstore中查找,找不到在找storefile。
10.HBASE表
答:
①HBASE是一个稀疏,多维度。排序的映射表,这张表的索引时行键、列族、列限定符合时间戳;
②每个值是一个未经解释的字符串,没有数据类型;
③用户在表中存储数据,每一行都有一个可排序的行键和任意多的列;
④表中水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,同一个列族里面的数据存储在一起;
⑤列族支持动态扩展,可以轻松地添加一个列族或列,无需预先定义列的数量以及类型,所有的列均以字符串形式存储,用户需要自行进行数据类型转换。
11.数据坐标
答:
HBASE可以视为一个四维坐标:列族、行键、列限定符、时间戳。
12.HBASE组件
答:主要有三个主件:
①库函数:链接到每个客户端;
②一个master主服务器;
③许多region服务器;
解析:
(1).主服务器master负责管理和维护HBASE表的分区信息,维护region服务器列表;分配region,负载均衡;
(2).region服务器负责存储和维护分配给自己分region,处理来自客户端的读写服务;
(3).客户端并不是直接从master主服务器上读取数据,而是在获取region的存储位置信息后,直接从region服务器上读取数据;
(4).客户端并不依赖master,而是通过zookeeper来获取region位置信息,大多数客户端设置从来不和master通信,这种设置方式使得master负载很小;(5).开始只有一个region,后面不断分裂,region拆分操作非常快,接近瞬间,因为拆分之后的region读取的仍然是原存储文件,直到合并过程把存储文件异步地写入到独立文件之后,才会读取新文件。
13.region设置大小
答:
①每个region默认大小是100MB到200MB,每个region的最佳大小取决于单台服务器的有效处理能力,目前建议大小为1GB-2GB;
②同一个region不会被拆到多个region服务器上,每个region服务器存储在10-100个region。
14.HBASE表的结构
答:
①元数据表,记为:.META表,存储了region和region服务器的映射关系;
②当HBASE表很大时;.META表会分裂成多个region;
③根数据,记为:.ROOT-表,记录所有元数据的具体位置,只有唯一一个region,名称在程序中写死,zookeeper记录了其位置。
15.HBASE三层结构
第一层 Zookeeper文件 记录了-ROOT-表的位置信息
第二层 -ROOT-表 记录.META表中region位置信息,只能有一个region
第三层 .META.表 记录用户数据表region位置信息,.META表中可以有多个region,保存了HBASE中所有用户数据表的region位置信息
16.region定位
答:
①为了加速寻址,客户端会缓存位置信息,同时需要解决缓存失效问题;
②寻址过程客户端只需要询问zookeeper服务器,不需要连接master服务器。
17.预写式日志(HLog)
答:
HBASE系统为每一个region服务器配置了一个HLog文件,用户更新数据必须写入日志后,才能写入memstore缓存,并且,直到memstore缓存内容对应的日志已经写入磁盘,该缓存内容才能刷写到磁盘中。
18. HLog工作原理
答:
①zookeeper会实时监测每个region服务器的状态,当某个region服务器发生故障是,zookeeper会通知master;
②master首先会处理该故障region服务器上面遗留的HLog文件,这个HLog包含来自多个region对象的日志记录;
③系统会根据每条日志记录所属的region对象对HLog数据进行拆分,分别放到相应region对象目录下,在将失效的region重新分配到可用的region服务器上,并把与该region对象相关的hlog日志记录也发送给相应的region服务器;④region服务器领取到分配给自己的region对象以及与之相关的HLog日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入memstore缓存中,然后,刷新到磁盘storefile文件中,完成数据恢复。
19.ROWKEY作用
答:
①HBASE在读写数据时需要通过ROWKEY找到对应的region(memstore和Hfile中的数据都是按照rowkey的字典排序,在HBASE中,一个region就相当与一个数据分片,每个region都是startrowkey和stoprowkey,用来标识region的存储的rowkey的范围,HBASE表里面的数据是按照rowkey来分散存储到不同的region里面的);
②将数据记录均衡分散到不同region中避免热点现象。
20.热点现象的解决方法
答:
①Reverse反转:针对固定长度的RowKey反转后存储,这样可以是rowkey中经常改变的放在最前面,可以随机rowkey,缺点:打乱数据的有序性;②salt加盐:slating是将每一个rowkey加一个前缀,前缀使用一些随机字符,使得数据分散在多个不同的region,随机前缀的种类数量应该和分散到region的数量一致达到region负载均衡,缺点:region的使用利用小;
③hash散列:让一个给定的行有相同的前缀,这在分散region负载均衡的同时,使读者操作也能够推断。
21.HBASE排序
答:
①先rowkey升序排序;
②rowkey相同column key升序排序;
③rowkey、column key相同则时间戳降序排序。
22.rowkey设计原则
答:
①唯一性:HBASE上数据存储是以k-v形式,所以rowkey值必须唯一,若相同,则会数据覆盖;
②排序原创:rowkey是按照ASCII有序设计;
③散列原则:rowkey应均匀分布在各个HBASE节点;
④长度原创:rowkey二进制,长度设置越短越好,尽量在10-100字节。
流程原理
①客户端编发出HBASE访问请求于zookeeper
②master根据用户请求给zookeeper返回region server信息
③用户跟踪zookeeper返回的region server信息直接访问region server
④region server处理用户请求,根据请求生成region
⑤region 写入memstore中,当memstore达到阈值时在写入storefile中
⑥storefile进行合并生成Hfie
(1).数据写入先进入memstore中,当memstore到达阈值时,进行storefile
(2).storefile先进行小合并,将一个个storefile按照时间顺序先排序存储一起
(3).当存储数量达到一定值时,进行大合并,根据时间顺序,对数据版本进行合并、删除合并成一个新的storefile
(4).新的storefile到达一定阈值时,将会分裂成相同storefile
(5).master节点根据region server信息,将新分裂的storefile文件发送到不同节点上。
⑦Hfile将存储于hadoop的DataNode中,为后期数据分析铺建。