分布式数据库系统:如何利用HBase构建微博搜索引擎?

作者:禅与计算机程序设计艺术

1.简介

概述

随着互联网的蓬勃发展,用户数量和社交活动呈爆炸式增长。因此,基于互联网的新型应用正在崭露头角,例如新浪微博、微信朋友圈、QQ空间、知乎、搜狐新闻等。这些网站拥有庞大的用户群体,每天产生海量的数据,极大的 challenges 要如何快速准确地处理和分析大数据并将其用于信息发现,用户行为分析,以及推荐系统的设计、开发和部署?这些应用都需要能够存储、检索、分析海量的、结构化的非结构化数据。传统的关系型数据库在处理海量数据时效率低下,无法满足需求。而分布式数据库则可以有效解决这个问题。分布式数据库允许多台服务器共同存储、检索和管理海量的数据,并且提供高可用性、容错性、扩展性等优点。其中,Apache HBase 是一个开源的分布式 NoSQL 数据库系统。本文主要阐述了 HBase 的工作原理、相关概念、特性、适用场景及其在微博搜索引擎中的应用。

发展历史

Apache Hadoop 是 Apache 基金会的开源项目之一,它是一个框架,提供了一个分布式计算模型。它的核心是一个分布式文件系统(HDFS),支持流式读取和写入,具备可靠的容错能力;MapReduce 模型用于对大数据进行并行计算;YARN 技术则负责资源调度和任务监控。

Hadoop 以其高效的数据处理能力和弹性扩展性著称,但同时也存在一些问题。首先,由于 MapReduce 模型的限制,在处理海量数据的同时不能做实时的查询。其次,数据不一致的问题。当多个节点修改相同的数据导致数据不一致时,很难排查错误。第三,Hadoop 中 MapReduce 只能处理结构化数据,对于半结构化或者非结构化的数据,比如文本或者 JSON 数据,就无能为力了。

为了解决上述问题,Hadoop 的开发者们开始思考如何在 Hadoop 上部署一个分布式数据库。于是,HBase 诞生了,它是一个基于 Hadoop 的分布式 NoSQL 数据库系统。HBase 在 Hadoop 的基础上,进行了优化,使其能够以超高速读写性能进行海量数据存储和处理,并且能够保证数据的一致性和容错性。它采用一种列族(ColumnFamily)存储模式,使得单个表可以划分为不同维度的列簇,各列簇之间可以独立拓扑。同时,它还支持分布式实时查询,能够应对用户的实时查询需求。

至今,HBase 已成为 Apache 软件基金会的顶级项目,其社区发展迅速,已成为处理大数据最流行的开源工具之一。

2.核心概念

2.1 数据模型

HBase 中最重要的概念就是“表”。每个表都是有序且关联的数据集合。每个表由若干个列组成,每个列包含相同类型的数据值。每一行包含若干个 Cell,Cell 按照列簇进行分类。Cell 中的数据按时间戳排序,保证最新数据排在前面。

2.2 ColumnFamily

ColumnFamily 类似于关系型数据库中表的字段集。每个 ColumnFamily 可以根据自己的业务逻辑灵活定义,避免某些数据重复存储造成硬盘资源浪费。一般情况下,一个表通常会包含多个 ColumnFamily,如 user_info 表可以有 name、age、gender 三个 ColumnFamily,不同的业务可以使用不同的列簇。

2.3 Region

Region 是一个独立存储单元,主要用来存放存储在 HDFS 中的数据块。一个 Region 大小默认为 128M ,最少为 32MB 。Region 在物理上被切割成更小的 HDFS block ,这样可以实现并行 IO 操作,提高读写效率。每个 Region 会有一个 start key 和 end key ,确定了该 Region 包含的 Key 范围。所有的更新操作都会被顺序记录到 WAL (Write Ahead Log) 文件中,以便在遇到故障或其他问题时恢复数据完整性。

2.4 Splitting

当一个 Region 中的数据超过预设的阈值后,HBase 将自动将该 Region 拆分成两个子 Region ,并将数据均匀分布到这两个子 Region 中。默认情况下,HBase 每隔 10 分钟就会检查一次数据量,如果发现某个 Region 中的数据超过预设的阈值,就触发 Region 自动拆分功能。

2.5 Master/Slave

HBase 的 master/slave 架构可以方便地横向扩展集群,提升系统性能。一个 HBase 集群中可以配置多个 master 节点,它们共同协作完成各种事务,包括分配 Region 到 Slave 节点上,分配数据切分,执行垃圾回收,以及对客户端请求的路由等工作。每个 slave 节点都保存了所有 Region 的拷贝,包括 Active 和 Standby 的状态。当 master 节点出现问题时,备用的 slave 节点可以接管工作,保证服务可用性。

3.基本原理

3.1 数据写入流程

  1. client 通过 Thrift API 或 RESTful API 向 Master 提交写请求
  2. Master 检查权限,确定 RegionServer 来承载写操作
  3. Master 为客户端生成写 RPC 请求
  4. Client 通过 TCP 连接发送写 RPC 请求
  5. 当一个 RegionServer 响应 Master 的写 RPC 时,该 RegionServer 会进入预提交状态
  6. RegionServer 会将数据写入内存,然后将数据批量持久化到 HDFS
  7. 当数据写入完毕后,RegionServer 会通知 Master
  8. Master 更新元数据,把写成功的 Region 标记为 “Committed”
  9. 如果写失败,Master 会重试该写请求

3.2 数据查询流程

  1. client 通过 Thrift API 或 RESTful API 向任意一个 RegionServer 发送查询请求
  2. RegionServer 根据读请求找到对应的 MemStore,并返回给客户端结果
  3. 如果 MemStore 不存在,RegionServer 会向 Master 获取合适的 HDFS file reader 读取数据
  4. 查询结果会被缓存到 BlockCache 中,供后续查询使用

3.3 数据分片

  1. HBase 会把整张表按照 RowKey 进行 Range 分割成若干个区域
  2. 默认情况下,HBase 会把每一个区域均匀切分成 128M,即一个区域会分成 128 个 16KB 的 HDFS blocks 。这意味着每一个 HDFS block 的最大容量是 128M ,最小容量为 32M 。切分数量可以通过 hbase-site.xml 中的 hbase.regionserver.region.split.policy 参数调整。
  3. 当一个更新操作完成后,HBase 会根据 RowKey 定位所在的 Region 。如果所在的 Region 的 Size 超过一定阈值, HBase 会触发自动切割操作,分裂当前 Region 。

3.4 数据过期机制

  1. HBase 引入了一套 TTL (Time To Live) 机制,通过设置 columnfamily 的 TTL 属性,可以让 HBase 在一段时间之后删除相应的 cell 。
  2. TTL 可以减少 HBase 存储空间的占用,因为过期的 cell 可以被删除掉,节省磁盘空间。
  3. 用户可以设置 Table 的 TTL 属性,也可以针对特定的 ColumnFamily 设置 TTL 属性。HBase 会自动扫描到期的 cell 删除掉。

3.5 RegionServer 故障转移

  1. 当一个 RegionServer 出现故障时,HBase 会在一定时间内尝试恢复它。
  2. 当发生故障时,HBase 不会丢失已经提交的事务,这些事务会保存在 WAL 文件中。
  3. 当 RegionServer 恢复正常时,它会从 JournalNode 复制 WAL 文件,并加载到内存中。
  4. 当 RegionServer 接收到 master 的心跳消息,它才会接受新的请求。

3.6 数据冗余

  1. HBase 支持多个 RegionServers 的数据副本机制,防止数据丢失。
  2. 用户可以在 hbase-site.xml 配置文件中指定 RegionServers 的数量,HBase 会自动创建多个 RegionServers。
  3. 当数据更新后,HBase 会自动将数据同步到多个 RegionServers。
  4. 用户可以通过 hbase shell 命令 hbase dfsreplication 命令来查看某个 Region 是否有多个副本。

4.应用案例

4.1 搜索引擎建模

4.1.1 搜索对象

微博搜索引擎主要需要搜索的内容是微博。搜索对象主要有四种:用户主页、微博详情页、用户粉丝、用户关注列表。

4.1.2 索引结构

用户主页:需要搜索的内容包括微博的发布位置、发布时间、发布的内容。因此,需要建立的索引结构如下:

{
  "user": "user1", // 用户ID
  "weibo_id": "wb1", // 微博ID
  "location": "北京市",
  "created_at": "2016-12-12T12:12:12Z",
  "text": "这是一条测试微博"
}

微博详情页:需要搜索的内容包括微博的评论数量、点赞数量、转发数量。因此,需要建立的索引结构如下:

{
  "user": "user1", // 用户ID
  "weibo_id": "wb1", // 微博ID
  "comment_count": 10, // 评论数量
  "like_count": 20, // 点赞数量
  "repost_count": 15 // 转发数量
}

用户粉丝:需要搜索的内容包括粉丝的昵称、粉丝的关注数、粉丝的生日。因此,需要建立的索引结构如下:

{
  "follower": "fans1", // 粉丝ID
  "name": "fan1", // 昵称
  "following_count": 10, // 关注数
  "birthday": "1990-01-01T00:00:00Z" // 生日
}

用户关注列表:需要搜索的内容包括关注人的昵称、关注人的生日、关注人的粉丝数量。因此,需要建立的索引结构如下:

{
  "followee": "fans1", // 关注人ID
  "name": "fan1", // 昵称
  "birthday": "1990-01-01T00:00:00Z", // 生日
  "followers_count": 100 // 粉丝数量
}

4.1.3 索引维护

微博发布事件:当有新微博发布时,HBase 会自动插入发布微博所属的用户 ID 以及微博信息,索引建立成功。

微博评论、点赞、转发:当有微博评论、点赞、转发时,HBase 会自动更新微博索引的信息,例如增加评论数量、点赞数量、转发数量。

粉丝变化:当有粉丝变化时,HBase 会自动更新粉丝索引的信息,例如新增粉丝、修改粉丝属性等。

关注列表变化:当有关注列表变化时,HBase 会自动更新关注列表索引的信息,例如新增关注人员、修改关注人员属性等。

4.2 实时搜索

4.2.1 热点搜索

热点搜索:顾名思义,就是最受欢迎的搜索内容,即搜索热度比较高的搜索词。微博搜索引擎需要实时统计搜索关键词的热度,并实时更新热点搜索。

解决方案:HBase 的 MapReduce 机制可以非常方便地统计搜索关键词的热度。搜索引擎定期将历史日志导入 HBase ,HBase 可以运行 MapReduce 程序统计搜索关键词的热度。另外,还可以根据业务情况,定期清除热点搜索的旧数据。

4.2.2 搜索建议

搜索建议:当用户输入关键字时,希望搜索引擎为用户提供相关搜索建议,以帮助用户快速完成搜索。微博搜索引擎需要实时生成搜索建议,以帮助用户快速填写关键词。

解决方案:搜索引擎需要结合用户输入的关键字、用户兴趣爱好、历史搜索记录等因素,实时生成相应的搜索建议。HBase 在提供快速的实时查询能力的同时,也可以提供缓存、异步查询等技术来降低延迟。

4.3 业务规则引擎

微博搜索引擎还需要支持复杂的业务规则引擎,比如微博审核、智能过滤等。

解决方案:通过 HBase 的脚本语言,我们可以定义自定义的业务规则,微博审核、智能过滤等等。用户提交新微博时,HBase 可以根据自定义规则判断是否可以发布,甚至可以实时阻断垃圾信息的传播。

5.总结与展望

本文主要介绍了 HBase 的基本原理、应用场景、核心概念、基本原理以及索引结构、热点搜索、搜索建议、业务规则引擎等方面。分布式数据库系统作为新时代的大数据存储技术,在分布式计算、海量数据存储、分布式文件系统、数据分片、数据冗余等方面都有独特的能力。同时,HBase 也在不断发展,如 Apache Phoenix、Hive on HBase、Tephra 等技术可以进一步加强分布式数据库系统的功能。最后,笔者希望这篇文章能够抛砖引玉,激起读者的思考,进一步理解 HBase 及其在微博搜索引擎中的应用。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133566260