HBase 2015 年技术发展
在 2015 年,HBase 迎来了一个里程碑——HBase 1.0 release,这也代表着 HBase 走向了稳定。
New Interface(更加清晰的接口定义)
旧的 HBase 接口逻辑与传统 JDBC 方式很不相同,新的接口与传统 JDBC 的逻辑更加相像,具有更加清晰的 Connection 管理方式。同时,在旧的接口中,客户端何时将 Put 写到服务端也需要设置,一个 Put 马上写到服务端,还是攒到一批写到服务端,新用户往往对此不太清楚。在新的接口中,引入了 BufferedMutator,可以提供更加高效清晰的写操作。
HBase 0.98 与 HBase 1.0 接口名称对比
举一个例子,旧的 API 写入操作的代码:
新的 API 写入操作的代码:
可以看到,在操作前,首先建立连接,然后拿到一个对应表的句柄,之后再进行一系列操作。以上两个是同步写操作。下面看一下批量异步写入接口:
代码有相应的注释,可见新的接口显得更加清晰。
多个 Region 副本(读操作高可用 HBASE-10070)
如图所示,在 HBase 中,Table 被横向划分为 Region,它是一段数据的管理者,Region 被分发到 RegionServer 上进行管理,一个 Region 只被一个 RegionServer 管理,它的数据存储在 HDFS 上,是可以有多个副本的。
也就是说:管理者 (Region) 只有一个,数据有多个副本。
HBase 的以前实现中,当一台 RegionServer 不可用时,需要数十秒甚至数分钟才可以完成发现和恢复工作,在这段时间内,这台 RegionServer 上的 Region 是不可用的。当一个 Region 不可用时,它需要一段时间才可以被其他 RegionServer 接管。
在最新的实现中,一个 Region 可以有多个副本(Region 是数据的管理者,是实际数据的抽象),分布在多个 RegionServer 上。
特点:
- 有一个主 Region,多个从 Region。
- 只有主 Region 接收写请求,并把数据持久化到 HDFS 上。
- 从 Region 从 HDFS 中读取数据并服务读请求。
- 从 Region 可能会读到脏数据(主 Region 内存中的数据)。
- 读操作可以只读主,或者既可以读主又可读从(可配置)。
这样在主 Region 不可用时,用户仍可以读从 Region 的数据。目前社区在进行的开发:主 Region 异步同步数据到从 Region,从而减少从 Region 缺少的数据量。
Family 粒度的 Flush(减少小文件,优化磁盘 IO,提高读性能 HBASE-10201)
我们先看一下 HBase 的写流程图
数据从客户端写到 RegionServer 上的 Region 后,先写入到内存中,积攒到阈值后写入磁盘,即 LSM-tree 架构。
在以前的实现中,服务端数据从内存刷写到 HDFS 上是 Region 粒度的,Region 下面所有的 Family 都会被 Flush。在很多应用场景中,HBase 中存储的是稀疏数据,在写入一行的数据中,有的 Family 具有值,有的为空,而且不同 Family 中存储的数据大小本身就不同,所以当大的 Family 到达阈值需要刷写数据时,小的 Family 也会跟着刷写,这样会导致很多小文件的产生,影响性能。
在新的实现中,提供了更小粒度的 Flush——Family 级别。它的特点是:
- 更加合理的使用内存的写延迟和聚合功能
- 减少 Compaction 的磁盘IO
- 提高读性能
RPC 读写队列分离(读写隔离,scan 与 get 隔离 HBASE-11355)
之前的实现中,RegionServer 上所有操作共享队列,各种操作互相影响。比如Scan 和 Get,在 RPC Call Queue 中,如果一个大的 Scan 请求排列在 Get 之前,那么 Get 就需要等待之前的 Scan 完成才可以执行,延迟较大。
在现在的实现中,RPC 可以具有多个 Call Queue,同时将它们分配给不同的操作使用,从而实现各种 Put、Scan 和 Get 等操作的隔离。具体配置的参数如下:
hbase.ipc.server.callqueue.handler.factor
hbase.ipc.server.callqueue.read.ratio
hbase.ipc.server.callqueue.scan.ratio
在线调整配置 HBASE-12147
之前的实现中,每次修改配置后都需要重启集群(Rolling Restart)
现在,调整配置后不再需要重启,但是目前只支持一部分配置的在线调整,如 Load Balance 和 Compaction。Hadoop 也已经实现了此功能。
目前社区的工作方向和趋势:
提高可用性
很多应用都要求存储具有高可用性,目前 HBase 实现的还不够优秀,Facebook 的 HydraHBase 是 Facebook 内部维护的 HBase 版本,它使用 Raft 协议管理 Region Server,从而实现高可靠,它的可用率达到 99.999%,Facebook 声称 HydraBase 能将 Facebook 全年的宕机时间缩减到不到 5 分钟。Cloudera Kudu 使用 Raft 协议管理协调 Tablet,从而也可以达到很高的可用率。
HBase 与 HydraHBase 对比:
HBase
HydraBase
对于 HDFS 多存储介质的使用
随着 HDFS 对内存、SSD 的支持和使用,HBase 也会充分使用它们带来的高性能。比如把 WAL 和更多的热数据放到 HDFS 的内存或者 SSD上(三副本)
减少对 ZooKeeper 的使用
Zookeeper 的抖动会对 HBase 造成影响,目前已经完成对 Master 上的 Assignment Manager 的改造,使它不再依赖 ZooKeeper。
堆外内存的使用
Java 管理大内存的方式还不高效,HBase 可以把 Cache 放在堆外,读取的时候不再拉到堆内中,以减少 GC 的影响。
Q & A
1、HBase 集群是不是尽量要读写分离(针对整个集群),我们的集群,随机写入很大,也有随机读,现在碰到随机读请求很不稳定的情况,希望有经验分享一下
HBase 可以支持高吞吐的写请求。对于随机读,如果写操作很多,会造成很多文件来不及 Compact,这会影响随机读的性能。同时,如果 JVM 参数没有经过调优,忙碌的 HBase 集群会有 GC 问题,也会影响随机读的性能。建议可以先调优 JVM 参数和 Cache,也可以引入 BloomFilter 等来优化查询。如果对随机读延迟要求较高,可以考虑分离读写。
2、对于 HBASE 脏读问题,如果只读从 region,是不是就可以避免了?
不能,因为从 Region 的数据就是过时的,主 Region 才是最新的数据。目前 HBase 的实现中,只有读主 Region 才可以获得最新数据,当主 Region 不可用时,如果可以忍受 stale 的数据,则可以读从 Region 来保证可用性。目前高可用实现的还不太好,这也是社区努力的方向之一。
3、修改 HBase 配置文件,但不重启集群是怎么实现的?
Hadoop 实现了一个动态载入配置的框架,修改配置后,激发服务端重新获取配置。具体可见 Hadoop-7001(https://issues.apache.org/jira/browse/HADOOP-7001)
4、HBase 历史数据有好的处理办法吗?设定多少天之前的数据删除或者只对对历史数据进行压缩?
可以设置 TTL 来淘汰历史数据,设置的时间根据具体应用来定。HBase 可以支持 Family 级别设置压缩,原生 HBase 还不能对于一部分行做压缩,可以考虑分表或者其他上层实现。如果历史数据不再需要,可以考虑设置 TTL。
5、写 MapReduce job 从 HBase 中导出某张表的所有数据,默认是几个 region 产生几个 mapper,有什么可以优化提速的办法?
可以让多个 mapper 读取一个 region 中的数据,这时候你需要定制一下 TableInputFormat(适当修改源代码)
6、0.98 版本或以前的 HBase 有什么好的读写分离方案?snapshot 是不是是一种方法?
从 RPC 层面上讲,snapshot 不算读写分离方案,因为所有的读写都进入同一个 Call Queue。从 MVCC 和锁级别等其他方面来看,snapshot 是一种方案。
7、HBase multitenant 方面有解决方案没有?
社区已经有相应的 issue,在明年发布的 2.0 版本中会发布。
8、HBase 不同集群之间的数据同步在 1.0 版本之后有没有更好的解决方案?
目前的解决方案仍然是 copytable + replication。目前社区已经可以解决 bulk load 的数据的同步(之前 bulk load 的数据不能同步到从集群)。
9、基于 HBase 缓存怎么设计比较好,Hulu 是怎么做的?我的项目里用了 Cloudera 自带的 Solr,发现服务器 memory CPU 开销太大。
HBase 的随机读性能不足为在线服务提供缓存服务,可以考虑使用 Redis 或者 Memcache。Solr 应该是做全文索引服务,这应该和 Solr 的实现相关。如果没有设置把 HBase 的表放到内存,HBase 不会消耗很大内存。对于忙碌的 HBase 集群,还是比较消耗 CPU 。
10、社区版 Hadoop 2.6 没有对应的 HBase 版本支持,可以用刚才讲的 HydraBase 替代 HBase 吗?
HBase 1.0 应该是可以运行在 Hadoop 2.6 之上,从个人角度来看,HydraBase可以替代 HBase,Facebook 就是这么实现的,不过 HydraBase 还没有开源。从架构上来讲,HydraBase 使用 Raft 协议管理 RegionServer,写性能可能不如原生 HBase。
11、请问你们是否在生产环境种使用 HBase + Phoenix 的组合来提供复杂快速查询?如果使用了,并发查询的性能如何?
Hulu 内部还没有使用 Phoenix,以前我个人使用过 Phoenix,当时 Phoenix 对于大量并发查询支持的不好,尤其是使用了索引的复杂查询。但是 Phoenix 社区发展很快,现在的情况应该会有好转。
12、Off-heap 做二级 cache 能否提高随机读速度?
可以 。 bucket cache 实现的比较好。目前社区仍在继续优化。对于随机读,还可以增加 BloomFilter 增强性能。
13、HBase 的 Rowkey 如何设计才能既保持无热点又能有序便于 scan?
可以考虑 salt 的方式,在写入的时候为 Rowkey 加随机前缀,比如前缀范围 001 – 100,那么我可以随机为 Rowkey 加上这些前缀来消除热点,在 scan 的时候需要加上所有的前缀(001-100)来 scan,不过这样一个 scan 就要转化为并发的 100 个 scan。
Hadoop+HBase搭建云存储总结 PDF http://www.linuxidc.com/Linux/2013-05/83844.htm
HBase 结点之间时间不一致造成regionserver启动失败 http://www.linuxidc.com/Linux/2013-06/86655.htm
Hadoop+ZooKeeper+HBase集群配置 http://www.linuxidc.com/Linux/2013-06/86347.htm
Hadoop集群安装&HBase实验环境搭建 http://www.linuxidc.com/Linux/2013-04/83560.htm
基于Hadoop集群的HBase集群的配置 http://www.linuxidc.com/Linux/2013-03/80815.htm‘
Hadoop安装部署笔记之-HBase完全分布模式安装 http://www.linuxidc.com/Linux/2012-12/76947.htm
单机版搭建HBase环境图文教程详解 http://www.linuxidc.com/Linux/2012-10/72959.htm
HBase 的详细介绍:请点这里
HBase 的下载地址:请点这里
张虔熙,Hulu 网,专注于分布式存储和计算,HBase contributor。
相关推荐
HBase作为一款高性能、支持无限水平扩展的在线...综上所述,2018 Apache HBase 技术实战专刊详细介绍了HBase的多个方面,包括其生态、组件、应用场景、技术细节、运维实践等,旨在为HBase爱好者提供全面的技术参考。
本文档是HBase技术社区成员的共同努力的成果,特别感谢了多位贡献者和讲师,这表明HBase技术社区非常活跃,对推动HBase技术的发展和应用有着重要作用。 综上所述,HBase的技术发展和应用案例显示了它作为大数据存储...
### HBase数据库的发展 #### 大数据与云计算背景下的HBase定位 随着信息化时代的迅猛发展,数据量呈现出指数级的增长态势。在这个背景下,“大数据”这一概念应运而生,用以描述这种信息爆炸时代所产生的海量数据...
### HBase技术深入解析 #### 引言 HBase,作为大数据领域中一款重要的分布式数据库系统,基于Hadoop生态系统构建,旨在提供高可靠、高性能的数据存储与查询服务。本文将全面解析HBase的核心概念、技术架构及应用...
第一部分、详细介绍了分布式数据库和Hbase的发展由来,基本原理,应用场景。第二部分,对Hbase进行基本的概述,主要介绍其中基本原理,第三部分对Hbase的技术进行详解,包括关键成员和技术优化。第四部分,通过一个...
HBase社区2018精选资料的知识点涵盖了HBase生态系统的多个方面,包括HBase的基本概念、架构、组件、应用案例...HBase社区资料不仅总结了过去一年的技术发展,也为我们提供了如何在未来继续优化和使用HBase的宝贵信息。
随着地理信息系统技术的迅速发展,数据的时间和空间精度不断提高,同时,GIS系统面临着数据量迅速增长的压力。在高并发访问响应效率与海量空间数据的高速访问技术两方面,传统的空间数据存储方式存在难以扩展和在...
Hbase学习总结,很不错的资源,对你绝对有帮助
- **大数据时代的来临**:随着互联网技术的发展,人类社会产生了前所未为的数据量。这些数据不仅数量巨大,而且种类繁多,传统的数据库系统难以应对这样的挑战。 - **关系型数据库系统的局限性**:关系型数据库虽然...
### HBase的应用与发展 #### HBase的基本概念及特点 HBase是一种分布式的、版本化的、非关系型的列存储数据库,其设计灵感来源于Google的BigTable论文。...随着技术的不断进步,HBase的应用前景将会更加广阔。
HBase的未来发展方向是很广泛的。随着云计算和大数据时代的到来,HBase将会在更多的领域中发挥作用。例如,在社交网络、电商平台、物联网等领域,HBase都将会扮演着重要的角色。 HBase是一个高可靠性、高性能、面向...
在大数据存储领域,HBase作为一个分布式列式数据库,因其高吞吐量、低延迟的特性,被广泛应用于处理海量实时数据...随着技术的发展,未来我们可能会看到更多创新的冷热分离解决方案,进一步推动大数据存储领域的发展。
本技术参考手册旨在深入解析HBase的核心概念、功能和使用方法。 **Hadoop的限制** Hadoop最初设计用于批处理作业,对随机读写和低延迟查询的支持相对较弱。HBase弥补了这一缺陷,允许在Hadoop环境中进行高效的数据...
【大数据技术基础培训-HBase技术介绍】 HBase是一种开源的分布式NoSQL数据库,设计用于处理大规模数据集。它建立在Hadoop文件系统(HDFS)之上,为大数据环境提供了高效、可扩展的数据存储和访问解决方案。HBase的...
前两个部分分别介绍了分布式系统和大规模数据处理的发展历史,讲解HBase的基本原理模式设计以及如何使用HBase的高级特性;第三部分通过真实的应用和代码示例以及支持这些实践技巧的理论知识,进一步探索HBase的一些...
- **当前状态**:总结了 HBase 当前的发展状况和技术优势。 - **未来趋势**:讨论了 HBase 可能面临的挑战及未来发展方向,如性能优化、新功能开发等。 通过上述内容可以看出,《HBase 权威指南》不仅覆盖了 ...
随着大数据技术的发展,HBase因其高效、可扩展的特性,成为许多企业和开发者存储非结构化数据,如图片、音视频等的理想选择。在HBase 2.0版本中,引入了Mob(Medium Object)特性,使得存储小文件变得更加高效。本篇...
HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,它构建在Hadoop文件系统(HDFS)之上,专为处理海量数据而设计...此外,还可以对比不同版本的源码,了解HBase的发展历程和技术演进。