欢迎投稿

今日深度:

Hbase入门,

Hbase入门,


概要

HBase是一种列式存储的分布式数据库。
HBase利用Hadoop HDFS作为其文件存储系统。
利用Hadoop MapReduce来处理HBase中的海量数据。
利用Zookeeper作为协调工具。

Hbase的系统架构

由上图见:hbase整个数据库中的数据最终落地还是在hdfs上的
组成部件说明
  Client:
  使用HBase RPC机制与HMaster和HRegionServer进行通信
  Client与HMaster进行通信进行管理类操作
  Client与HRegionServer进行数据读写类操作
  Zookeeper:
  Zookeeper Quorum存储-ROOT-表地址、HMaster地址
  HRegionServer把自己以Ephedral方式注册到Zookeeper中,也就是说Zookeeper实时监控了HRegionserver的上线和下线信息,HMaster随时感知各个HRegionServer的健康状况
  Zookeeper保证了在任何时候,集群只有一个HMaster,如果一个HMaster宕掉,那么zookeeper会通过它的选举机制再重新选取一个regionserver作为新的HMaster,所以HBase集群不会有单节点故障Zookeeper避免HMaster单点问题
  HMaster:
  HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行
  主要负责Table和Region的管理工作:
  1 管理用户对表的增删改查操作
  2 管理HRegionServer的负载均衡,调整Region分布
  3 Region Split后,负责新Region的分布
  4 在HRegionServer停机后,负责失效HRegionServer上Region迁移
  HRegionServer:
  HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据
  
  HRegionServer管理一些列HRegion对象;
  每个HRegion对应Table中一个Region,HRegion由多个HStore组成;
  每个HStore对应Table中一个Column Family的存储;
  Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效
  HStore:
  HBase存储的核心。一个HStore又由一个Memstore和0个或多个StoreFile组成。
  MemStore是Sorted Memory Buffer。用户写入数据的流程:
  
Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 触发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
由此过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。
HLog(容错机制)
  引入HLog原因:
  在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况
  工作机制:
  每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

HBase存储格式
  HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:
  1 HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
  2 HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File
  HFile
  
 HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo
  Trailer中指针指向其他数据块的起始点
  File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
  Data Index和Meta Index块记录了每个Data块和Meta块的起始点
  Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制
  每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询
  每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏

HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。
  
  KeyLength和ValueLength:两个固定的长度,分别代表Key和Value的长度
  Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey
  Column Family Length是固定长度的数值,表示Family的长度
  接着就是Column Family,再接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)
  Value部分没有这么复杂的结构,就是纯粹的二进制数据
  HLog File
  
  HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。
  HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue 。

Hbase数据表(逻辑结构)

其核心概念是表(Table)。

表:在HBase中数据以表的形式存储。表名使用Java String类型或
byte[]字节数组来表示。每个表名对应HDFS中的一个目录结构。创建表 时需要指定表名和至少一个列族。列族影响表的物理存储结构。

列族(Column Family)

列族:一些列的集合。列族创建好后不能频繁修改,数量不能太 多。列族名由可见的字符组成。列族中包含列的数量没有限制,可以有数百万个列。列值没有类型和长度的限定。一个列族中的所有列存储在同一个底层文件(HFile)中。
常见的引用列的格式是family:qualifier, 其中qualifier是任意的字节数组。

行键(row key)

行键:HBase中最重要的概念之一,它在表中用来唯一地标示一行,其值保存为二进制字节数组。
在HBase中行键是默认索引,所以在设计行键时必须考虑检索数据的效率。比如把常用的检索字段组合作为rowkey,并且要保证其唯一性,但rowkey长度又不能太长,太长的rowkey会增加存储开销,降低内存利用率,从而降低索引命中率。
另外,rowkey的设计同时要考虑如何使其值能够尽量散列,这样会保证所有的数据不都在一个Region上,避免进行读写时负载集中在个别Region上。

单元(cell)

行键、列族和列名一起确定了一个单元。存储在单元里的数据称为单元值(Value)。单元值没有数据类型,存储为字节数组byte[]。

时间版本(Time Stamp## )

元值有时间版本,时间版本用时间戳标识,是一个long型数字,默认使用当前时间戳。
HBase保留单元值时间版本的数量基于列族进行配置,默认数量是3个。

Hbase问题答疑

Hbase和hive 的区别
共同点:
1.hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储
区别:
2.Hive是建立在Hadoop之上为了减少MapReducejobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。
3.想象你在操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop。如果是索引访问,就用HBase+Hadoop 。
4.Hive query就是MapReduce jobs可以从5分钟到数小时不止,
HBase查询是非常高效的,肯定比Hive高效的多。
5.Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。
6.hive借用hadoop的MapReduce来完成一些hive中的命令的执行 。
7.hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作。
8.hbase是列存储。
9.hdfs作为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件。
10.hive需要用到hdfs存储文件,需要用到MapReduce计算框架。

hbase实时查询的原理
实时查询,可以认为是从内存中查询,一般响应时间在1秒内。HBase的机制是数据先写入到内存中,当数据量达到一定的量(如128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。

Hbase的rowKey的设计原则
1 rowkey长度原则
rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。建议越短越好,不要超过16个字节, 原因如下:
数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长会极大影响HFile的存储效率
MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率
2 rowkey散列原则
如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。
3 rowkey唯一原则
必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

Hbase中scan和get的功能以及实现的异同
1.按指定RowKey 获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get)Get 的方法处理分两种 : 设置了ClosestRowBefore 和没有设置的rowlock .主要是用来保证行的事务性,即每个get 是以一个row 来标记的.一个row中可以有很多family 和column.
2.按指定的条件获取一批记录,scan方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能使用的就是scan 方式.
1)scan 可以通过setCaching 与setBatch 方法提高速度(以空间换时间); 2)scan 可以通过setStartRow 与setEndRow 来限定范围([start,end]start 是闭区间,end 是开区间)。范围越小,性能越高。
3)scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
3.全表扫描,即直接扫描整张表中所有行记录。

hbase的cache与batch的理解
https://www.cnblogs.com/editice/archive/2013/04/22/3035728.html
cache是面向行的优化处理
batch是面向列的优化处理

HBASE中compact用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?
在hbase中每当有memstore数据flush到磁盘之后,就形成一个storefile,当storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。
Compact 的作用:
1>.合并文件
2>.清除过期,多余版本的数据
3>.提高读写数据的效率
HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的区别是:
1、Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过
期版本清理,不做任何删除数据、多版本数据的清理工作。
2、Major 操作是对 Region 下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。

Hbase filter的实现原理
HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列名,时间戳定位)。RowFilter、PrefixFilter。。。
hbase的filter是通过scan设置的,所以是基于scan的查询结果进行过滤.
过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器
过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端。

Hbase内部机制
在HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的。HBase 接到命令后存下变化信息,或者写入失败抛出异常。默认情况下,执行写入时会写到两个地方:预写式日志(write-ahead log,也称HLog)和MemStore。HBase 的默认方式是把写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化信息都写入并确认后,才认为写动作完成。
MemStore 是内存里的写入缓冲区,HBase 中数据在永久写入硬盘之前在这里累积。当MemStore 填满后,其中的数据会刷写到硬盘,生成一个HFile。HFile 是HBase 使用的底层存储格式。HFile 对应于列族,一个列族可以有多个HFile,但一个HFile 不能存储多个列族的数据。在集群的每个节点上,每个列族有一个MemStore。
大型分布式系统中硬件故障很常见,HBase 也不例外。设想一下,如果MemStore还没有刷写,服务器就崩溃了,内存中没有写入硬盘的数据就会丢失。HBase 的应对办法是在写动作完成之前先写入WAL。HBase 集群中每台服务器维护一个WAL 来记录发生的变化。WAL 是底层文件系统上的一个文件。直到WAL 新记录成功写入后,写动作才被认为成功完成。这可以保证HBase 和支撑它的文件系统满足持久性。大多数情况下,HBase 使用Hadoop 分布式文件系统(HDFS)来作为底层文件系统。
如果HBase 服务器宕机,没有从MemStore 里刷写到HFile 的数据将可以通过回放WAL 来恢复。你不需要手工执行。Hbase 的内部机制中有恢复流程部分来处理。每台HBase 服务器有一个WAL,这台服务器上的所有表(和它们的列族)共享这个WAL。
你可能想到,写入时跳过WAL 应该会提升写性能。但我们不建议禁用WAL,除非你愿意在出问题时丢失数据。如果你想测试一下,如下代码可以禁用WAL: 注意:不写入 WAL 会在RegionServer 故障时增加丢失数据的风险。关闭WAL,出现故障时HBase 可能无法恢复数据,没有刷写到硬盘的所有写入数据都会丢失。

HBase宕机处理机制
宕机分为HMaster宕机和HRegisoner宕机,如果是HRegisoner宕机,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。
如果是HMaster宕机,HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。即ZooKeeper会保证总会有一个HMaster在对外提供服务。

Hbase深度剖析

1.导致Hbase挂掉的场景
https://blog.csdn.net/zlfprogram/article/details/74066585
2.深入理解HBase的memestore、storeFile(HFile)
https://blog.csdn.net/xiaoshunzi111/article/details/69844526

3.HBase-7.hbase查询多版本数据&过滤器原则&批量导入Hbase&hbase预分区
https://blog.csdn.net/shenfuli/article/details/50589496

补充: 布隆过滤可以每列族单独启用。
使用 HColumnDescriptor.setBloomFilterType(NONE | ROW | ROWCOL) 对列族
启用布隆过滤可以节省读磁盘过程,可以有助于降低读取延迟
4. HBase原理-数据读取流程解析+HBase最佳实践-写性能优化策略
http://hbasefly.com/2016/12/21/hbase-getorscan/
http://hbasefly.com/2016/12/10/hbase-parctice-write/

5.HBaseRegion切分原理
http://hbasefly.com/2017/08/27/hbase-split/

6.HBase Compaction的前生今世
http://hbasefly.com/2016/07/13/hbase-compaction-1/

www.htsjk.Com true http://www.htsjk.com/hbase/42014.html NewsArticle Hbase入门, 概要 HBase是一种 列式存储 的分布式数据库。 HBase利用Hadoop HDFS作为其文件存储系统。 利用Hadoop MapReduce来处理HBase中的海量数据。 利用Zookeeper作为协调工具。 Hbase的系统架构...
相关文章
    暂无相关文章
评论暂时关闭