基于HBase构建可伸缩的分布式事务队列

标签: hbase 分布 队列 | 发表时间:2015-06-13 15:54 | 作者:蓝儿唯美
出处:http://www.iteye.com

一个实时流处理框架通常需要两个基础架构:处理器和队列。处理器从队列中读取事件,执行用户的处理代码,如果要继续对结果进行处理,处理器还会把事件写到 另外一个队列。队列由框架提供并管理。队列做为处理器之间的缓冲,传输数据和事件,这样处理器可以单独操作和扩展。例如,一个web 服务访问日志处理应用,可能是这样的:

 

框架之间的主要区别在于队列语义,通常不同之处有以下几点:

  • 调度保障机制: 至少一次,至多一次,只有一次。

  • 容灾机制: 失败对用户和自动恢复是透明的。

  • 可用性: 数据在出现错误后可以保存并重启。

  • 可扩展性:产品/用户增加时的局限性。

  • 性能Performance: 队列操作的吞吐量和延迟。

我们想在开源的 Cask Data Application Platform (CDAP) 上提供一个动态可扩展,强一致性并且有一次性交易机制的实时流处理框架,在这个强大的机制保护下,开发者可以自由操作任何形式的数据操作而不用担心不一致 性,潜在的返工和失败。它可以帮助开发者在没有分布式系统背景的情况下建立他们的大数据应用。此外,如果需要可以关闭这种强大的保护机制换取高性能。它总 是比其他方式更容易使用。

可扩展队列

队列有两种基本操作:入队和出队。生产者将消息写到队头(入队),消费者从队尾读取数据(出队)。如果做为一个整体你添加更多生成者时的入队速度和添加更多消费者时的出队速度足够快,我们说这个队列是可扩展的。

理想状态下,扩展是线性的,这意味着两倍的生产者 /消费者,会产生两位速度的出队/入队,增长只受集群的规模限制。为了支持生产者的线性扩展,队列需要一个存储系统并且需要当前写入者的数量线性扩展。为 了应对消费者的线性扩展,队列可以分区,例如一个消费者只处理队列中的一段数据。

队列扩展的另一个方面是它应该可以横向扩展。这意味着队列性能的上限可以通过增加集群结点的方式来提升。这是很重要的,它可以保证队列不受当前集群大小限制根据数据的增长而扩展。

分区的 HBase 队列

我们选择 Apache HBase 做为队列的存储层。它为存储强一致性,可横向扩展的行数据做了设计和优化。它的并发写操作性能非常好,并提供了有序扫描以支持分区消费者。我们使用 HBase Coprocessors 的高效扫描滤波和队列清洗。为了在队列上使用一次性语义,我们用 Tephra’s 为 HBase 提供传输支持。

生产者和消费者具有操作独立性。每个生产者通过 Hbase puts 批处理执行入队操作,消费者通过执行 Hbase Scans 执行出队操作。生产者和消费者的数量之间没有关联,他们可以分离。

此队列存在一个消费者组的概念。一个消费者组,是由相同的关键字划分的消费者集合,这样,每个发布到队列的事件,就会由此消费者组中的消费者去消费。使用 消费者组,可以通过不同的关键字划分同一个队列,同时,也可以通过数据的操作性特点来拓展。按照上面访问日志分析的例子,生产者和消费者组可能看起来像这 样:

 

 

对于Log Parser,这里有两个生产者在运行,它们并发的向队列写数据。在消费者这边,这里存在两个消费者组。 Unique User Counter组有两个消费者,使用UserID作为划分(队列的)关键字。Page View Counter组则有三个消费者,使用 PageID 作为划分(队列的)关键字。

 

队列行值格式

当一个事件通过一个生产者被发布出去,一个或多个消费者组合将收到消息,我们把事件写入 HBase 表的一个或多个行上,那么这条记录就被设计成适用于每个消费者组。事件的有效负荷和元数据被存储在独立的列上,那么行的值就是下面这样的格式:

 

两个有趣的部分是行的值是分区 ID 和整个 ID。分区 ID 通过限定行值前缀再提供给消费者。消费者只被允许读数据,并在出队的时候使用前缀扫描。分区 ID 由两部分组成:一个消费者组 ID 和一个消费者 ID。生产者计算出每个消费者组的分区 ID,并通过入队写到那些行。

行关键字中的入口 ID(Entry ID)包含了事务信息。它由 Tephra 触发的生产者事务写指针和单向增长的计数器组成。这个计数器由本地的生产者生成,同时,针对事件,计数器需要让行关键字唯一,因为生产者可以在同一个事务中将多个事件加入队列。

出队列的时候,计数器会使用事务写指针来决定,队列入口是否已经提交,以及是否可以消费了。事务写指针和计数器的组合,使得行关键字总是唯一的。这让生产者可以独立的操作,而不会有写冲突。

为了生成分区 ID(Partition ID),生产者需要知道大小和每个消费者组的分区关键字。当应用程序启动,以及组大小发生任何变化的时候,消费者组信息都会被记录下来。

改变生产者和消费者

增加或减少生产者是很直接的,因为每个生产者都是独立操作的。增加或减少生产者进程就可以满足这个要求。然而,当消费者组的大小需要改变的时候,就需要协调来正确更新消费者组的信息。可以用下面的图表来概括所需的步骤:

由于暂停和恢复是由 Apache ZooKeeper 来协调的,同时它们也是并行执行的,所以它们是两个非常快速的操作。例如,之前我们提到的 Web 访问日志分析应用程序,改变消费者组信息的过程可能看起来像这样:

 

基于这个队列的设计,入队列和出队列的性能,与单独的批量 HBase Puts 和 HBase Scans 不相上下,这样也带来与 Tephra 服务器进行通讯的开销。通过在同一个业务处理中将多个事件批量处理,可以大大降低这个开销。来自:博狗    www.qhvip.com/bogou/

最后,为了避免“热点聚焦(hotspotting)“,我们基于簇的大小提前分割了 HBase 表,同时,在行关键字(row key)上采用 加盐(salting) 的方式来更好的分配写。否则,由于是单调的增加业务处理写指针,行关键字就会是连续的。

性能值

我们在小型的 10 节点的 HBase 集群上已经测试过性能,结果令人印象深刻。使用 1K 字节负载,以 500 个事件为一个批次大小,我们完成了生产和消费 100K 个事件/秒的吞吐量,其中运行了 3 个生产者和 10 个消费者。我们也观察到当我们增加消费者和消费者的时候,吞吐量线性增加:例如,当我们将生产者和消费者数量加倍的时候,吞吐量增加到 200K 个事件/秒。

在 HBase 的帮助下,结合最佳实践,我们成功的创建了一个线性可伸缩的,分布式事务队列系统。同时,在 CDAP 中使用这个系统提供实时流处理框架:动态可伸缩,强一致性,以及一次交付的传输保证。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hbase 分布 队列] 推荐:

基于HBase构建可伸缩的分布式事务队列

- - 数据库 - ITeye博客
一个实时流处理框架通常需要两个基础架构:处理器和队列. 处理器从队列中读取事件,执行用户的处理代码,如果要继续对结果进行处理,处理器还会把事件写到 另外一个队列. 队列做为处理器之间的缓冲,传输数据和事件,这样处理器可以单独操作和扩展. 例如,一个web 服务访问日志处理应用,可能是这样的:. 框架之间的主要区别在于队列语义,通常不同之处有以下几点:.

HBase入门笔记(四)--完全分布式HBase集群安装配置

- - 学着站在巨人的肩膀上
HBase 是一个开源的非关系(NoSQL)的可伸缩性分布式数据库. 它是面向列的,并适合于存储超大型松散数据. HBase适合于实时,随机对Big数据进行读写操作的业务环境. 关于HBase的更多介绍请参见 HBase项目官网.     本文环境与上一讲-- 完全分布式Hadoop集群配置一致.

分布式集群环境hadoop、hbase、zookeeper搭建(全)

- - CSDN博客云计算推荐文章
集群环境至少需要3个节点(也就是3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面举例说明,配置节点IP分配如下:. 三个节点均使用centos 6.3系统,为了便于维护,集群环境配置项最好使用相同用户名、用户密码、相同hadoop、hbase、zookeeper目录结构.

HBase – 基于Hadoop的分布式数据库

- - ITeye博客
  修改:dataDir=/home/ysc/zookeeper. mkdir /home/ysc/zookeeper(注:dataDir是zookeeper的数据目录,需要手动创建). hbase存在系统时间同步的问题,并且误差要再30s以内. HBase是数据库,会在同一时间使用很多的文件句柄,大多数linux系统使用的默认值1024是不能满足的,还需要修改 hbase 用户的nproc,在压力很大的情况下,如果过低会造成 OutOfMemoryError异常.

非关系性分布式数据库:HBase

- - 标点符
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”. 就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力.

hbase完全分布式安装与配置

- - CSDN博客系统运维推荐文章
hbase 完全分布式安装,2个节点,分别为:. 192.168.1.67 MasterServer (作为hbase的master和regionserver节点[可选]). 192.168.1.241 SlaveServer  (作为hbase的regionserver节点). 安装hadoop,具体安装见: http://blog.csdn.net/hwwn2009/article/details/39889465.

Apache HBase v1.0 发布,分布式数据库

- - 开源中国社区最新新闻
Apache HBase v1.0 发布了,这是 HBase 一个主要的里程碑. 1.0 版本经过 7 年的开发,有超过 1500 次的更改和升级. 与上一个版本 0.98.0 比较,1.0 版本值得关注的改进有:. 性能提升,同时保持之前的稳定性. 全新 API 以及重新组织客户端 API. 新的可用性保证 —— 用时间表一致地区副本读取可用性.

hbase介绍

- AreYouOK? - 淘宝数据平台与产品部官方博客 tbdata.org
hbase是bigtable的开源山寨版本. 是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统. 它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作). 主要用来存储非结构化和半结构化的松散数据.

Riak对比HBase

- - NoSQLFan
文章来自 Riak官方wiki,是一篇Riak与HBase的对比文章. Riak官方的对比通常都做得很中肯,并不刻意偏向自家产品. 对比的Riak版本是1.1.x,HBase是0.94.x. Riak 与 HBase 都是基于 Apache 2.0 licensed 发布. Riak 的实现是基于 Amazon 的 Dynamo 论文,HBase 是基于 Google 的 BigTable.

[转]HBase简介

- - 小鸥的博客
   Hbase是一个分布式开源数据库,基于Hadoop分布式文件系统,模仿并提供了基于Google文件系统的Bigtable数据库的所有功能. 其目标是处理非常庞大的表,可以用普通的计算机处理超过10亿行数据,并且有数百万列元素组成的数据表. Hbase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥Hbase处理大数据量等功能,需要使用Hadoop作为文件系统.