我有一个运行Mongo和Rails应用程序的Web服务器(40gig hd,1 gig ram)。
Mongo DB是Twitter推文和用户的文档存储,拥有数百万条记录。我对数据执行map-reduce查询,以提取最常见的主题标签,单词,提及等内容(非常标准的东西)。每条推文的元数据已经存储,因此map-reduce与单个收集一样高效。
然而,由于它是在一个(相当)大的数据集上运行的,所以它不能再实时完成 - 例如我有一个报告生成器可以计算出一大堆这些映射 - 连续减少2万条推文大约需要2分钟。
缩放mongo的最快捷,最便宜的方法是什么,特别是在地图缩减性能方面?我可以设置一个额外的服务器并拆分负载,但想知道我是否应该使用分片,复制或两者兼而有之?对于这种情况,分片可能有点过分。
会喜欢我的mysql-mongo连接上的一些输入。 mysql包含为每个配置文件存储twitter ID的twitter配置文件。每次完成地图缩小时,它会将所有要作为选项输入的ID收集到mapreduce中,即:
@profile_tweet_ids = current_profile_tweet_ids # array of ids
@daily_trend = TwitterTweet.daily_trend :query => {:twitter_id => {"$in" => @profile_tweet_ids}}
TwitterTweet中的mapreduce函数如下所示:
def daily_trend(options={})
options[:out] = "daily_trend"
map = %Q( function(){
if (this.created_at != null)
{
emit(this.created_at.toDateString(), 1);
}
})
result = collection.map_reduce(map, standard_reduce, options)
normalize_results(result)
end
感谢任何建议!
答案 0 :(得分:2)
如果您正在进行简单的计数,求和,独特等,您可以完全避免使用map-reduce。您可以使用$ inc运算符来实时获取所需的大部分内容。 我在real-time analytics with MongoDB的博文中详细解释了这一点。
答案 1 :(得分:2)
听起来您的用例更多的是在线流/事件处理。 您可以使用mongo或其他数据库/缓存产品来存储参考数据,以及用于接收和处理事件的事件处理框架。有一些工具可以帮助你解决这个问题 - 我的脑子里有几个:Twitter Storm,Apache S4,GigaSpaces XAP(免责声明 - 我为GigaSpaces工作)和GridGain。
答案 2 :(得分:0)
使用像MongoLab这样的云服务之一..取决于您对便宜的定义,但是..
答案 3 :(得分:0)
关于使用运算符而不是MapReduce的答案具有优点,并且可能对您获得实时响应的努力更有益。在mongodb上映射Reduce不适合产生实时响应。
除此之外,一旦在下一版本中可用,您也可以从新的聚合框架(http://www.mongodb.org/display/DOCS/Aggregation+Framework)中受益。
要回答有关如何扩展MapReduce的更一般性问题,如果您只是将其添加为辅助服务器,添加新服务器可能无济于事,作为辅助服务器,它将无法存储您的M / R结果是一个集合,所以内联是你唯一的选择。如果您不需要将结果存储在集合中,那么这是您最简单的方法。有关详细信息,请参阅此处的深入讨论:http://groups.google.com/group/mongodb-user/browse_thread/thread/bd8f5734dc64117a
Sharding可以帮助扩展,但请记住,您需要通过mongos进程运行所有内容,拥有配置服务器并且mongos需要最终确定从每个分片返回的结果集,因此您添加了一个新的潜在的瓶颈取决于您的数据,您需要的不仅仅是一台额外的机器才能使其以可靠的方式运行。
答案 4 :(得分:0)
不同数据项之间的联系对他们来说最有价值(他们让公众进行数据分类以使其有价值),因此对您来说也是最危险的http://indresult.com