HBase架构帮助

时间:2010-05-11 18:42:38

标签: hbase

来自SQL Server背景,我是HBase的新手,但该技术看起来非常适合我们正在做的事情,而且成本肯定是正确的!

我需要维护一个日志条目列表,通常我会在RDBS中创建:

创建表日志 (     UserID int,SiteID int,Page varchar(50),Date smalldatetime )

其中一个用户在此简单表中可能有0或1000行。典型的查询是查找一个用户的所有行或一个站点上一个用户的所有行。

这如何转换为HBase中的“地图”,其中没有“行键”并且相同(SiteID,Page)可能多次出现。我的第一个想法是UserID是一个行键,但我仍然不理解“列族”和其他术语,足以理解如何设置表来保存这个数据,其中一个UserID可以有很多(SiteID,Page ,日期)“行”。

任何方向表示赞赏!

3 个答案:

答案 0 :(得分:1)

我的建议是将 UserId 作为Rowkey,为任何单个列系列提供不必要的多列系列只会增加搜索所需的时间,并提供 siteId | date 作为列限定符,以便它始终是唯一的,并且该限定符的值将是您的页面

RowKey Qualifier                       Value

001    C:site001|25/01/2013:6:17:17    www.example123.com/home
001    C:site001|25/01/2013:6:17:18    www.example123.com/about
001    C:site002|25/01/2013:6:30:17    www.example1123.com/
001    C:site003|25/01/2013:6:32:18    www.example1123.com/contact
002    C:site001|25/01/2013:2:22:17    www.example123.com/home
003    C:site001|25/01/2013:3:12:18    www.example123.com/about
003    C:site003|25/01/2013:5:30:17    www.example1223.com/
003    C:site004|25/01/2013:6:32:18    www.exampleABC.com/contact

`

希望它有效!

答案 1 :(得分:1)

最初只是将其视为

  • RowKey:限定符:值,

代表 - 12_Aug_2013_00:00 :* - Temp = 24, - 湿度 = 15, - FileghtsDelayed = 17

  • RowKey:限定符:值,
  • 12_Aug_2013_00:00 :温度:24
  • 12_Aug_2013_00:00 :湿度:15

现在,看一下,如果我们可以将限定符分组到列族中,该怎么办。

例如:

  • Temprature,Humidity,AirPresure 分组为 WeatherDetails
  • 让小组,小组* No_FileghtsDelayed *,* No_FlightsCancelled *, eventsConts

  • 我们有WeatherDetails,& eventsConts,为列族

我们有 - Date_Hour:WeatherDetails:EventDetails: 例如,对于12_Auguest_2013,FirstHour Data Recorded可以表示为

  • 12_Aug_2013_00:00 WeatherDetails - Temp = 24, WeatherDetails - 湿度 = 15, eventsConts - FileghtsDelayed = 17

此分组用于优化获取操作。

答案 2 :(得分:0)

一种方法是从您的用户ID + siteid

中创建复合行键

设置表以维护给定页面所需的多个日志条目,并且每次都将数据存储为新版本(如有必要,手动设置时间戳)。

由于HBase维护每个单元格的时间戳,因此访问时间不需要单独的列。

因此,您将拥有一个内容类似于

的表格
Row             Page

user1:site1     www.example.com/index.html@1234567890
                www.example.com/somepage.html@123456800
                www.example.com/someotherpage.html@123456900
                www.example.com/index.html@123457123

user1:site2     blahblah

user2:site1     etc...

处理您的两个示例请求:

要查找所有用户行,您将从userx:0到userx + 1:0进行扫描(确保设置maxVersion),然后从每个结果行中解析出站点ID

要获取特定用户/站点的所有页面,只需从userx:sitex到userx:sitex + 1进行扫描。最后我检查了你不能在get上设置maxVersions,所以这不是一个选项。

简而言之,列族表示您希望一起存储的数据组... 据推测,你会经常同时从他们那里读取数据。将列放在不同的族中会导致数据单独存储,因此当您只需要一列时,您可以获得更快的读取,但是您需要读取2个不同的位置才能获得这两列。

当然,根据您的其他需求,您可能需要采取不同的方法。我强烈建议阅读大表纸,以便更好地理解HBase的结构(因为它强烈基于bigtable)。

为了更好地理解HBase的内部结构,Lars George's blog也很棒。