HBase是一个高可靠、高性能、面向列、可扩展的分布式存储系统,适用于结构化存储,底层依赖HadoopHDFS,利用HBase技术可以在廉价的PCServer上构建一个大规模的结构化存储集群。因此,HBase被广泛应用于大数据存储解决方案。为什么使用HBase(1)HBase的优点:可以动态添加列,如果列为空则不存储数据,节省存储空间。HBase自动拆分数据,让数据存储自动具备横向扩展性。HBase可以提供对高并发读写操作的支持。(2)HBase的缺点:不能支持条件查询,只支持根据Rowkey查询HBase不适合传统的事务处理程序或者关联分析,不支持复杂查询,这在一定程度上限制了它的使用,但是使用它做数据存储的优势也非常明显,因为HBase存储的是松散的数据,所以如果你的应用中数据表每一行的结构都不一样,那么你可以考虑使用HBase。因为HBase的列是可以动态添加的,如果列为空,则不会存储任何数据,所以如果需要经常添加字段,而且大部分字段都是NULL值,可以考虑HBase。因为HBase可以提供基于Rowkey的高效查询,如果你的数据(包括元数据、消息、二进制数据等)都具有相同的主键,或者你需要通过key来访问和修改数据,那么使用HBase是一个不错的选择.2、HBase的使用方法场景一:卖家操作日志卖家操作日志,顾名思义,就是用来记录商户操作的系统,以保证商户可以准确查询到自己的各种操作。京东有几十万个商户,每时每刻都在进行各种操作。因此,卖家操作日志的特点是:数据量大、实时性强、多查少查。▲图1▲图2卖家操作日志一开始,所有的操作日志都存储在ES中。操作日志的数据量非常大,但是当时可以申请的ES资源有限。当在有限的ES集群中存储大量数据时,会导致性能下降。本案例中,我们选择在ES集群中只存储最近三个月的数据,以提供灵活的查询,而HBase则用于长期数据存储。这样可以实现近期操作的灵活展示和长期数据的准确备份。场景二:京麦消息日志存储京麦消息日志存储是京麦筋斗云系统不可或缺的一部分(用于构建京麦消息生态闭环),包括消息的全链路跟踪和统计分析。京麦新闻每天都有几千万条新闻,如何对新闻进行跟踪统计成为一个至关重要的问题。消息追踪需要实时、多维度的精准查询,所以选择将最近一周的消息日志存储在ES中。统计分析需要足够的数据,所以在将数据存储在ES中的同时,也存储在HBase中。最后,定期将HBase中的数据导入到京东的数据集市,可以非常方便的对京麦新闻进行统计分析。HBase数据结构▲HBase数据概念图要使用HBase,首先要了解HBase的数据结构:HBase会存储一系列行记录,行记录有三种基本类型的定义:RowKey、TimeStamp和Column家庭。1.RowKey和NoSQL数据库一样,RowKey是用来检索记录的主键。访问HBase表中的行只有三种方式:通过单个RowKey访问通过RowKey的范围扫描整个表。RowKey可以是任意字符串(最大长度为64KB,实际长度一般为10~100bytes),在HBase内部,RowKey保存为字节数组。存储时,按照RowKey的字典序(字节序)对数据进行排序存储。在设计key的时候,需要充分排序存储特性,将经常被读取的行存储在一起(位置依赖)。2、ColumnFamilyHBase表中的每一列都必须属于某个列族,列族必须作为表模式定义的一部分预先给定(有点像关系数据库中的列名,定义之后,一般它不会去修改)。列名以列族为前缀,每个列族可以有多个列成员。然后可以根据需要动态添加新的列族成员(即列)。Hbase将同一个列族的数据存储在同一个目录下,由几个文件保存。3.TimeStamp在HBase的每个cell存储单元中存在同一个数据的多个版本。每个版本之间的差异是根据唯一的时间戳来区分的。不同版本的数据按时间倒序排列,最新的数据版本排在最前面。三、简述HBase的架构原理一、HBase的模块(1)MasterHBaseMaster用于协调多个RegionServer,检测RegionServer之间的状态,均衡RegionServer之间的负载。HBaseMaster的另一个职责是将Region分配给RegionServer。HBase允许多个Master节点共存,但这需要Zookeeper的帮助。但是,当多个Master节点共存时,只有一个Master提供服务,其他Master节点处于待命状态。当工作的Master节点宕机时,其他Master将接管HBase集群。(2)RegionServer对于一个RegionServer,它包括多个Region。RegionServer的作用只是管理表和实现读写操作。Client直接连接RegionServer,通过通信获取HBase中的数据。对于Region来说,就是HBase数据实际存放的地方,也就是说Region是HBase可用性和分布的基本单位。如果一张表很大,由多个CF组成,那么该表的数据会存储在多个Region中,每个Region中会关联多个存储单元(Store)。(3)Zookeeper对于HBase来说,Zookeeper的作用是至关重要的。首先,Zookeeper是HBaseMaster的HA解决方案。也就是说,Zookeeper保证至少有一个HBaseMaster在运行。而Zookeeper负责Region和RegionServer的注册。事实上,Zookeeper发展至今,已经成为分布式大数据框架中容错的标准框架。不仅是HBase,几乎所有与分布式大数据相关的开源框架都依赖Zookeeper来实现HA。2、HBase的原理首先要知道HBase集群是通过Zookeeper在机前协调的,也就是说HBaseMaster和RegionServer之间的关系是由Zookeeper维护的。当Client需要访问HBase集群时,Client需要先与Zookeeper通信,然后才能找到对应的RegionServer。每个RegionServer管理着许多Region。对于HBase来说,Region是HBase并行化的基本单位。因此,数据也存储在Region中。这里需要特别注意,每个Region只存储一个ColumnFamily的数据,是CF的一段(按照Row间隔划分为多个Region)。Region可以存储的数据大小有上限。当达到上限(Threshold)时,将对Region进行拆分,将数据拆分到多个Region中,从而提高数据并行度和数据容量。.每个Region包含多个Store对象。每个Store包含一个MemStore和一个或多个HFile。MemStore是内存中数据的实体,一般是有序的。数据写入Region时,会先写入MemStore。当MemStore中的数据需要dump到底层文件系统时(比如MemStore中的数据量达到了MemStore配置的最大值),Store会创建StoreFile,StoreFile是对HFile的一层封装。所以MemStore中的数据最终会写入到HFile中,也就是磁盘IO。由于HBase底层依赖HDFS,所以HFiles都存储在HDFS中。这是对整个HBase工作原理的简单描述。4、使用HBase需要注意的问题在设计和开发基于HBase的系统时,需要考虑的因素与关系型数据库不同。HBase模型本身很简单,但是给了你更大的调整空间。有的模型写性能好,但是读数据的时候性能不好,或者相反,类似于传统数据库的基于范式的OR建模,在实际项目中考虑HBase设计模式时,需要从以下几个方面:这张表应该有多少个列族?列族使用什么数据?每个列族应该有多少列?列名应该是什么?列名虽然在建表的时候可以不定义,但是在读写数据的时候需要定义。每个单元应该存储什么数据?每个单元应该存储什么时间版本?行鉴结构是什么,应该包含什么信息?5.总结如今,各种数据存储方案层出不穷。本文结合两个实战场景,对基于HBase的大数据存储做一个简单的分析,并对HBase的原理做一个简单的介绍阐述。如何用好HBase,甚至如何选择最优的数据存储方案,仍然需要根据场景的需要具体分析设计。作者简介目前就职于京东商城京麦平台组,从事京东商户开放平台的开发工作。热爱技术,熟悉各种常用开源框架,有丰富的大型分布式系统、高并发系统开发经验。热衷于大数据研究,对Hadoop、HBase、ES有深入的研究和理解。【本文为专栏作者张凯涛原创文章,作者微信公众号:凯涛博客,id:kaitao-1234567】点此查看作者更多好文
