HBase总结

一、HBase的特点:

(1)、表大:一个表可以有数亿行,上百万列。

(2)、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列。

(3)、HBase是面向列的的存储和权限控制,列族独立索引。

(4)、稀疏:空(null)列并不占用空间,表可以设计的非常稀疏。

(5)、数据类型单一:HBase中的数据都是字符串,没有类型。

二、HBase和Hive的对比:

(1)、HBase和Hive的区别对比:

(2)、Hive是一种构建在Hadoop基础设施之上的数据仓库,通过Hive可以使用HQL语言查询存放在HDFS上面的数据。HBase能够在它的数据库上面实时运行,HBase被分区为表格,表格有进一步分割为列簇,列族必须需要用schema定义。一个列簇可以包含很多列,每个key/value在HBase中都被定义成一个cell,每一个cell都有一个rowkey,一个columnFamily,一个value值,一个timestamp。rowkey不能为空且唯一。

(3)、Hive把HQL解析成MR程序,因为它是兼容JDBC,所有可以和很多JDBC程序做集成,它只能做离线查询,不能做实时查询,默认查询Hive是查询所有的数据,这个可以通过分区来控制。HBase通过存储的key/value来工作的,它支持主要的四种操作,增删改查。

(4)、Hive目前不支持更新操作,花费时间长,必须要先设置schema将文件和表映射,Hive和ACID不兼容。HBase必须需要zk的支持,查询语句需要重新学,如果要使用sql查询,可以使用Apache Phonenix,但会以schema作为代价。

(5)、Hive适用于一段时间内的数据进行分析查询,HBase适用于大规模数据的实时查询。

三、HBase适用场景:

(1)、半结构化数据和非结构化数据,可以进行动态扩展。

(2)、记录非常的稀疏。

(3)、多版本数据。

(4)、超大数据容量:HBase会自动水平切分扩展,跟Hadoop的无缝集成保证了其数据的可靠性和海量数据分析的高性能。

四、HBase中的rowkey设计原则:

(1)、rowkey长度原则:rowkey是一个二进制流,长度开发者建议是10-100字节,不过建议越短越好,最好不超过16字节。原因是:数据持久化文件HFile中是按照按照key/value存储的,如果rowkey太长的话就会影响HFile的存储效率。Memstore将缓存数据到内存,如果rowkey字段过长内存的有效利用会降低,系统将会无法缓存更多的数据,降低检索的效率。

(2)、rowkey散列原则:如果rowkey是按照时间戳方式递增的话,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,如果没有散列字段就会出现一个regionServer上堆积的热点现象。

(3)、rowkey的唯一原则:rowkey不能为空且唯一。

五、HBase中的get和scan区别:

(1)、get查询:get方法分为两种,一种是设置了closestRowBefore和没有设置的rowlock,只要保证行的事务性,即每一个get是以一个row来标记的,一个row中可以有多个family和column。

(2)、按指定的条件获取一批记录,条件查询。scan可以通过setCaching和setBatch方法来提高速度;scan也可以通过setStartRow和setEndRow来限定范围(左闭右开),scan还可以通过setFileter方法来添加过滤器。

(3)、setCache方法:这个方法设置即一次RPC请求放回的行数,对于缓存操作来说,如果返回行数太多了,就可能内存溢出,那么这个时候就需要setBatch方法,。

(4)、setBatch:设置这个之后客户端可以选择取回的列数,如果一行包括的列数超过了设置的值,那么就可以将这个列分片。例如:如果一行17列,如果batch设置为5的话,就会返回四组,分别是5,5,5,2。、

※:Cache设置了服务器一次返回的行数,而Batch设置了服务器一次返回的列数。

ps:Batch参数决定了一行数据分为几个result,它只针对一行数据,Cache决定了一次RPC返回的result个数。

RPC请求次数 = (行数 * 每行列数) / Min(每行的列数,批量大小) / 扫描器缓存

六、HBase中的cell结构及compact作用:

(1)、HBase中通过row和columns确定的为一个存储单位为cell。

(2)、cell:由{rowkey, column(=<family> + <label>,version)}唯一确定的单元,cell中的数据没有类型,全部都是字节码形式存储。

(3)、当HBase中的memstore数据flush到磁盘的时候,就会形成一个storefile,当storefile的数量达到一定程度的时候,就需要将storefile文件进行compaction操作,Compact作用:合并文件、清楚过期,多余版本数据、提高读写效率。

(4)、compact操作的实现:①minor:Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。②major:Major 操作是对 Region 下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。

七、HBase中优化方法:

1、减少调整:可以调整region和HFile。因为region的分裂会导致I/O开销,如果没有预设分区的话,随着region中条数的增,region会进行分裂,解决方法就是根据rowkey设计来进行预建分区,减少region的动态分裂。HFile会随着memstore进行刷新时生成一个HFile,当HFile增加到一定量的时候,会将属于一个region的HFile合并,HFile是不可避免的,但是如果HFile大于设置得值,就会导致HFile分裂,这样就会导致I/O的开销增大。

2、减少启停:对于HBase会有compact机制,会合并HFile,但是我们可以手动关闭compact,减少I/O。如果是批量数据的写入,我们可以用BulkLoad来批量插入数据。(BulkLoad的使用:https://blog.csdn.net/shixiaoguo90/article/details/78038462

3、减少数据量:开启过滤,提高查询效率。(开启BloomFilter,这个是列簇级别的过滤,在生成一个StoreFile同时会生成一个MetaBlock,用于查询时的过滤)。使用压缩,一般使用snappy和lzo压缩。

4、合理设计:rowkey的设计:(散列性、简短性、唯一性、业务性),列族的设计:(多列族的优势是:在进行查表的时候,只需要扫描那一列就行了,就不需要全盘扫描,减少I/O,劣势是:降低了写的I/O,原因是:数据写到stroe以后会缓存到memstore中,)

八、HBase中的RowFilter和BloomFilter:

(1)、RowFilter顾名思义是对rowkey进行过滤的,它是采用比较符结合比较器的方式来过滤的,比较器有这些:https://blog.csdn.net/qq_28205539/article/details/79520428

(2)、BloomFilter:这个比较器主要功能是提供可随机读的性能,但是它的存储开销会变大,一旦表格中开启了BloomFilter,那么生成StoreFile时同时会生成一份包含BloomFilter结构的文件MetaBlock,所以会增加一定的存储开销和内存开销,建表时对某一列设置BloomFilter即可。

(3)、HBase中数据的导入导出:https://blog.csdn.net/javajxz008/article/details/61173213

九、HBase中怎么预设分区及HRegionServer宕机处理:

1、shell方法:例如:create 'tb_split',{NAME=>'cf', VERSION=>3},{SPLITS=>['10','20','30']}

2、java程序控制:https://blog.csdn.net/javajxz008/article/details/51913471

3、(1)、zk会监控HRegionServer的线上线下情况,如果发现某个HRegionServer宕机了会通知HMaster进行失效备援。(2)、宕机的HRegionServer会停止对外服务,也就是它所对应的region暂停对外服务。(3)、HMaster会将该HRegionServer所负责region转移到其他的HRegionServer上,并且对HRegionServer上存在memstore中还未持久化到磁盘中的数据进行恢复。(4)、这个恢复工作是由WAL重播来完成的,过程是:wal实际上就是一个文件,存在/hbase/WAL/对应RegionServer路径下。 宕机发生时,读取该RegionServer所对应的路径下的wal文件,然后根据不同的region切分成不同的临时文件recover.edits。当region被分配到新的RegionServer中,RegionServer读取region时会进行是否存在recover.edits,如果有则进行恢复。

九、HBase读写流程:

1、HBase的读流程:(1)、HRegisonServer保存着.meta.表及数据表,首先client先访问zk,访问-ROOT-表,然后在zk上面获取.meta.表所在的位置信息,找到这个meta表在哪个HRegionServer上面保存着。(2)、接着client访问HRegionServer表从而读取.meta.进而获取.meta.表中存放的元数据。(3)、client通过.mete.中的元数据信息,访问对应的HRegionServer,然后扫描HRegionServer的Memstore和StoreFile来查询数据。(4)、最后把HRegionServer把数据反馈给client。

2、HBase的写流程:(1)、client访问zk中的-ROOT-表,然后后在访问.meta.表,并获取.meta.中的元数据。(2)、确定当前要写入的HRegion和HRegionServer。(3)、clinet向HRegionServer发出写相应的请求,HRegionServer收到请求并响应。(4)、client先将数据写入到HLog中,以防数据丢失。(5)、然后将数据写入到MemStore中。(6)、如果HLog和MemStore都写入成功了,那么表示这个条数据写入成功了。(7)、如果MemStore写入的数据达到了阈值,那么将会flush到StoreFile中。(8)、当StoreFile越来越多,会触发Compact合并操作,将过多的StoteFile合并成一个大的StoreFile。(9)、当StoreFile越来越多时,Region也会越来越大,当达到阈值时,会触发spilit操作,将这个Region一分为二。

ps:HBase中所有的更新和删除操作都会在后续的compact中进行,使得用户的写操作只需要进入内存中就行了。实现了HBase的 I/O高性能。

十、HBase的数据模型:

1、HBase的模型:(1)、Master:协调多个RegionServer,侦测各个RegionServer之间的状态,实现多个RegionServer之间的负载,还有一个作用就是分配Region给RegionServer,多个Master共存需要zk的支持。(2)、RegionServer:它包含多个Region,作用是管理表个,实现读写的操作,client直接连接RegionServer,并通信获取数据,对于Region而言,它是真实存放数据的低方也就是说Region是HBase分布式和可用性的基本单位。

2、逻辑视图:转载:


3、物理视图:(1)、每个columnFamily存储在HDFS上的一个单独文件,空值不会被保留。(2)、key和versionNumber在每个columnFamily中单独一份。(3)、HBase每个值维护多级索引,即<key,columnFamily,columnName,timeStamp>。(4)、表在行的方向上分割为多个Region。(5)、Region是HBase分布式存储和负载均衡的最小单元,不同Region分布在不同的RegionServer中。(6)、Region虽然是分布式存储的最小单元,但并不是最小存储单元,一个Region中包含多个Store对象,每个Store包含一个MemStore和若干个StoreFile,StoreFile包含一个或多个HFile。MemStore存放在内存中,StoreFile存储在HDFS上面。

4、HBase中的-ROOT-表和.META.表:HBase中的Region元数据都存储在.META.表中,随着Region的增加,.META.表也会越来越多。为了定位.META.表中各个Region的位置,把.META.表中所有Region的元数据保存在-ROOT-表中,最后由Zookeeper记录-ROOT-表的位置信息。所有客户端访问用户数据前,需要首先访问Zookeeper获得-ROOT-的位置,然后访问-ROOT-表获得.META.表的位置,最后根据.META.表中的信息确定用户数据存放的位置。-ROOT-表是不会分割的,它只有一个Region。为了加快访问速度,.META.表的所有Region全部保存在内存中。客户端会将查询过的位置信息缓存起来,且缓存不会主动失效。如果客户端根据缓存信息还访问不到数据,则询问相关.META.表的Region服务器,试图获取数据的位置,如果还是失败,则询问-ROOT-表相关的.META.表在哪里。

5、结构图:

十一、HBase中的线程安全问题:

1、HTable的实例话的过程都是需要新创建一个conf,我们可以认为新创建的这个conf就是一个新的connection,因此client对于一个table,每次需要新new一个conf对象的话,那么意味着两个HTable操作的是一个table,但是建立了是两条connection,它们的socket不是公用,所以是不安全的。官方文档给出的安全模式是:

十二、HBase中的MemStore作用:

1、HBase为了保证随机读取的性能,所以HFile里面的rowkey是有序的,当客户端的请求到达RegionServer之后,保证写入的rowkey有序,所以不能将数据立刻写入到HFile中,而是将每个变更的操作保存到内存中,就是memstore中,memstore能够很方便的支持操作的随机插入,并保证所有的操作在内存中是有序的,当memstore中的数据达到阈值的时候,就会flush到HFile中,这样能够充分的利用Hadoop写大文件的优势,提高写入的效率。由于memstoe是保存在内存中的,如果RegionServer因为某种原因死掉之后,会导致内存中的数据丢失,为了保证数据不丢失,HBase会将更新操作写入memstore之前写入到一个write ahead log里面,WAL文件是追加、顺序写入的,WAL每个RegionServer只有一个,同一个RegionServer上所有的region写入同一个WAL文件,当RegionServer挂掉时,可以通过WAL文件将所有的操作顺序重新加载到MemStore中。

十三、如何提高HBase客户端的读写性能:

1、开启bloomfilter过滤器。

2、在条件允许的情况下,给HBase足够的内存。修改配置文件hbase-env.sh中的export HBASE_HEAPSIZE=1000

3、增加RPC的数量。通过修改hbase-site.xml中的hbase.regionserver.handler.count属性可以适当的放大RPC数量,默认是10。

4、HBase中的region太小会造成多次spilit,region就会下线。如果HBase中的region过大,就会发生多次的compaction,将数据读一遍重写一遍到HDFS上面,占用io。

更多文章见:

让我遇见你。​www.shiruiblog.cn图标

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值