Hbase架构设计

时间:2013-04-14 23:29:05

标签: hadoop nosql query-optimization hbase

我必须设计一个 Hbase 表来存储用户信息,这些信息针对社交网络,如:年龄,性别,教育,爱好,阅读书籍,旅行国家...... 注意:我们将来可以添加更多信息,我们现在不知道所有信息。

例如: 姓名:Olha,年龄:25岁,性别:女,教育:学士信息技术,教育:掌握计算机科学,爱好:篮球,爱好:乒乓球,书:随风而去,书:达芬奇密码,语言:英语,语言:法语,国家:德国

主要想法是能够进行如下查询: 归还所有女性,年龄:22岁,说话:英语,说话:法语,读书随风而去,像乒乓球,像篮球和德国人。

因此您可以向搜索查询添加任何条件。

您对优化此类搜索查询的HBASE表架构(行键,列族...)的建议是什么(考虑到我们将来会添加更多信息) 编写此类查询的最佳方法是什么(scan,get,MapReduce)。

谢谢

2 个答案:

答案 0 :(得分:1)

我同意Ian Varley的观点,Solr / Lucene以及它的分面查询和连接允许您以您想要的方式转动数据 - 但是 - 我也认为您的问题可能是一个“计数”问题或者“会员”问题......

这听起来像是在列出匹配(N)属性的人员列表之后 - 您遇到的问题是每个属性可能有数百万用户ID吗?

当您尝试做的只是计算交集/联合大小时,HBase非常适合。您的键/值对可以放入Hbase,您可以将用户的ID“编码”为Bloom Filter和HyperLogLog。准确性和记忆的交易速度。可能每小时/每晚在某种类型的日志聚合的点击流上运行map / reduce样式作业。

其他人已经在广告空间和在线空间中完成了这项操作,以确定您正在运行的查询类型(“找到喜欢住在佛罗里达州的红牛和流行挞的人

<强>参考

使用Apache Hive和Amazon EMR进行内容相关广告http://aws.amazon.com/articles/2855

扩展分布式计数器:http://whynosql.com/scaling-distributed-counters/

Google:Sharding counter https://developers.google.com/appengine/articles/sharding_counters

HBase中的分布式计数器性能 - 第1部分http://palominodb.com/blog/2012/08/24/distributed-counter-performance-hbase-part-1

Facebook新的实时分析系统:HBase每天处理200亿个事件http://highscalability.com/blog/2011/3/22/facebooks-new-realtime-analytics-system-hbase-to-process-20.html

使用Hadoop和HBase进行实时分析 - http://www.slideshare.net/larsgeorge/realtime-analytics-with-hadoop-and-hbase

使用HBase http://tellapart.com/log-event-processing-with-hbase

记录事件处理

BazaarVoice的点击流分析http://www.slideshare.net/bazaarvoice_engineering/austin-scales-clickstream-analytics

使用HBase进行实时分析 - http://www.slideshare.net/alexbaranau/realtime-analytics-with-hbase-long-version

答案 1 :(得分:0)

这不是HBase的一个很好的用途,因为这正是搜索索引(如Lucene)有用的东西。

存储用户及其信息的一个普通模式可能看起来很像关系数据库,因为每个用户只有1行,并将所有属性存储为列和列。值(年龄= 22,语言=法语等)。这适用于您提到的可扩展性(您不需要更改任何模式以存储新属性)。使用此架构,您可以通过唯一的用户ID查找任何一个用户(及其所有属性)。无论你有多少用户,这都要快得多。

但是,使用该模式,如果您想以您描述的方式进行搜索(“返回所有年龄为22岁的用户”),则每个查询最终都将扫描整个表,因为仅限HBase允许您通过主键访问内容;它没有任何类型的二级索引。这将是非常低效的(每次你想要进行任何单个查询时,图片必须扫描一百万行)。

如何解决这个问题?您可以“反转”数据的顺序,并将值放在行键中,然后指向具有该值的所有用户。例如,行键可以是“年龄:22”,然后在行的列中可以是22岁的所有用户ID。这有很多原因是有问题的,其中最重要的是它将是非常昂贵和棘手的更新。但它对那些特定的查询表现良好。

诀窍?这正是搜索索引(如Lucene)的作用,并且通过使用HBase滚动自己的功能,它可以做得更好。这听起来像是你想在这里使用的工具。

如果你必须使用HBase(正如你所说,因为它是一个研究项目),可能值得研究一下使用HBase和Lucene;谷歌指点。