HBase 教程:什么是 HBase?


HBase 是一个用 Java 编写的开源、多维、分布式、可扩展和 NoSQL 数据库。HBase 运行在HDFS(Hadoop 分布式文件系统)之上,并为 Hadoop 提供类似 BigTable 的功能。它旨在提供一种容错方式来存储大量稀疏数据集。
因为,HBase 通过在庞大的数据集上提供更快的读/写访问来实现高吞吐量和低延迟。因此,HBase 是需要快速随机访问大量数据的应用程序的选择。
它提供了压缩、内存操作和布隆过滤器(数据结构,它告诉一个值是否存在于一个集合中)来满足快速和随机读写的要求。
让我们通过一个例子来理解它:喷气发动机从压力传感器、温度传感器、速度传感器等不同的传感器生成各种类型的数据,这些数据表明发动机的健康状况。这对于了解航班的问题和状态非常有用。连续发动机运行每次飞行生成 500 GB 数据,每天大约有 30 万次飞行。因此,近乎实时地应用于此类数据的引擎分析可用于主动诊断问题并减少计划外停机时间。这需要一个分布式环境来存储大量具有快速随机读写的数据以进行实时处理。在这里,HBase 来帮忙了。
 
HBase由来
Facebook 消息平台于 2010 年 11 月从 Apache Cassandra 转移到 HBase。
Facebook Messenger 将消息、电子邮件、聊天和短信结合到实时对话中。Facebook 试图构建一个可扩展且强大的基础设施来处理这些服务。
当时,消息基础设施处理了超过 3.5 亿用户,每月发送超过 150 亿条人对人的消息。聊天服务支持超过 3 亿用户,每月发送超过 1200 亿条消息。
通过监控使用情况,他们发现出现了两种通用数据模式:

  • 一组短的时间数据,往往是不稳定的
  • 很少被访问的不断增长的数据集

Facebook 希望为这两种使用模式找到一种存储解决方案,他们开始研究寻找现有消息基础架构的替代品。2008 年初,他们使用了开源数据库,即 Cassandra,这是一个最终一致性的键值存储,已经投入生产,为收件箱搜索提供流量。他们的团队在使用和管理 MySQL 数据库方面拥有丰富的知识,因此切换其中任何一种技术对他们来说都是一个严重的问题。
他们花了几周时间测试不同的框架,以评估 MySQL、Apache Cassandra、Apache HBase 和其他系统的集群。他们最终选择了 HBase。
由于 MySQL 无法有效处理大型数据集,随着索引和数据集变大,性能受到影响。他们发现 Cassandra 无法处理困难的模式来协调他们的新消息基础设施。
主要问题是: 
  • 存储来自各种 Facebook 服务的大量持续增长的数据。
  • 需要可以对其进行高处理的数据库。
  • 满足数百万个请求所需的高性能。
  • 保持存储和性能的一致性。

针对所有这些问题,Facebook 想出了一个解决方案,即 HBase。Facebook 采用 HBase 来为 Facebook Messenger、聊天、电子邮件等提供服务,因为它具有多种功能。
HBase 为这种工作负载提供了非常好的可扩展性和性能,其一致性模型比 Cassandra 更简单。虽然他们发现 HBase 最适合他们的要求,如自动负载平衡和故障转移、压缩支持、每台服务器多个分片等。
HDFS 是 HBase 使用的底层文件系统,还为他们提供了一些所需的功能,例如端到端校验和、复制和自动负载重新平衡。
由于消息接受来自不同来源(如 SMS、聊天和电子邮件)的数据,因此他们编写了一个应用服务器来处理用户消息的所有决策。它与大量其他服务接口。附件存储在 Haystack(适用于 HBase)中。他们还在 Apache ZooKeeper 之上编写了一个用户发现服务,该服务与其他基础设施服务进行交流以进行朋友关系、电子邮件帐户验证、交付决策和隐私决策。
Facebook 团队花了很多时间来确认这些服务中的每一个都是健壮的、可靠的,并且提供良好的性能来处理实时消息传递系统。
  
HBase VS HDFS
HDFS 是一个基于 Java 的分布式文件系统,它允许您跨 Hadoop 集群中的多个节点存储大数据。因此,HDFS 是一个底层存储系统,用于在分布式环境中存储数据。HDFS 是一个文件系统,而 HBase 是一个数据库(类似于 NTFS 和 MySQL)。
 
我们可以在哪里使用 HBase?
  • 我们应该在拥有大型数据集(数百万或数十亿或行和列)的情况下使用 HBase,并且我们需要对数据进行快速、随机和实时的读写访问。
  • 数据集分布在各个集群中,我们需要高可扩展性来处理数据。
  • 数据是从各种数据源收集的,可以是半结构化或非结构化数据,也可以是所有数据的组合。它可以通过 HBase 轻松处理。
  • 您想存储面向列的数据。
  • 您有很多版本的数据集,您需要存储所有这些版本。

   
HBase VS Cassandra
  • HBase 以 BigTable (Google) 为模型,而 Cassandra 基于最初由 Facebook 开发的 DynamoDB (Amazon)。
  • HBase 利用 Hadoop 基础设施(HDFS、ZooKeeper),而 Cassandra 单独发展,但您可以根据需要组合 Hadoop 和 Cassandra。
  • HBase 有几个组件可以一起通信,如 HBase HMaster、ZooKeeper、NameNode、Region Servers。而 Cassandra 是单一节点类型,其中所有节点都是平等的并执行所有功能。任何节点都可以是协调器;这消除了单点故障。
  • HBase针对读优化,支持单写,严格一致性。HBase 支持基于范围的扫描,这使得扫描过程更快。而 Cassandra 支持保持最终一致性的单行读取。
  • Cassandra 不支持基于范围的行扫描,与 HBase 相比,这会减慢扫描过程。
  • HBase 支持有序分区,其中 Column Family 的行以 RowKey 顺序存储,而在 Casandra 中,有序分区是一个挑战。由于 RowKey 分区,与 Cassandra 相比,HBase 中的扫描过程更快。
  • HBase 不支持读负载均衡,一个 Region Server 服务读请求,副本只在失败时使用。而Cassandra支持读负载均衡,可以从各个节点读取相同的数据。这会损害一致性。
  • 在 CAP(Consistency, Availability & Partition -Tolerance)定理中,HBase 维护了一致性和可用性,而 Cassandra 则专注于可用性和分区容限性。

 
HBase 的特性
  • 原子读写: 在行级别,HBase 提供原子读写。可以解释为,在一个读或写过程中,所有其他进程都被阻止执行任何读或写操作。
  • 一致的读写: 由于上述特性,HBase 提供一致的读写。
  • 线性和模块化可扩展性:由于数据集分布在 HDFS 上,因此它可以跨各个节点线性扩展,也可以模块化扩展,因为它被划分到各个节点。
  • 自动和可配置的表分片: HBase 表跨集群分布,这些集群分布在跨区域。这些区域和集群分裂,并随着数据的增长重新分布。
  • 易于使用的 Java API 进行客户端访问:它提供了易于使用的 Java API 进行编程访问。
  • Thrift 网关和 REST-ful Web 服务:它还支持用于非 Java 前端的 Thrift 和 REST API。
  • 块缓存和布隆过滤器:  HBase 支持用于大容量查询优化的块缓存和布隆过滤器。
  • 自动故障支持: 带有 HDFS 的 HBase 提供跨集群的 WAL(预写日志),提供自动故障支持。
  • 排序的行键:由于搜索是在行范围内完成的,HBase 按字典顺序存储行键。使用这些排序的行键和时间戳,我们可以构建优化的请求。