我必须设计一个 Hbase 表来存储用户信息,这些信息针对社交网络,如:年龄,性别,教育,爱好,阅读书籍,旅行国家...... 注意:我们将来可以添加更多信息,我们现在不知道所有信息。
例如: 姓名:Olha,年龄:25岁,性别:女,教育:学士信息技术,教育:掌握计算机科学,爱好:篮球,爱好:乒乓球,书:随风而去,书:达芬奇密码,语言:英语,语言:法语,国家:德国
主要想法是能够进行如下查询: 归还所有女性,年龄:22岁,说话:英语,说话:法语,读书随风而去,像乒乓球,像篮球和德国人。
因此您可以向搜索查询添加任何条件。
您对优化此类搜索查询的HBASE表架构(行键,列族...)的建议是什么(考虑到我们将来会添加更多信息) 编写此类查询的最佳方法是什么(scan,get,MapReduce)。
谢谢
答案 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;谷歌指点。