有玩 mongo 的 mapreduce 的吗, 请教个问题。

2015-03-21 11:47:56 +08:00
 no13bus
http://stackoverflow.com/questions/12015064/mongodb-mapreduce-and-sorting?answertab=votes#tab-top 这里面提到mp适合作为放到后台业务数据处理 不适合做查询,这怎么理解?定时跑mp,将结果放到新的表里面吗?然后查询的时候直接查新表的数据?
3511 次点击
所在节点    程序员
14 条回复
nesuk
2015-03-21 12:03:15 +08:00
阿里的ODPS就是这样建议的
micyng
2015-03-21 12:11:43 +08:00
用数据库做mr就是zuo si的节奏,更何况是mongo
gt11799
2015-03-21 13:01:09 +08:00
如果mongo足够大,写入之后立刻查询,得到的基本是写入前的结果。
mongo适合记录一些初始数据,然后跑脚本在后台处理成你想要的数据。
mongo的数据要展示到前台,最好是提前处理好的。
与用户实时交互的数据,一般不能使用mongo。
sujin190
2015-03-21 14:16:47 +08:00
@gt11799 这个mongo默认写入是非安全模式的,有可能会出现这种情况,你打开安全不可以解决这个问题么?
taogogo
2015-03-21 16:44:39 +08:00
最好不要,mongo的速度受内存影响大;分区后mr没有优势;通常mr是单线程的(除非自己构造数据);repair的时候会锁住等等一系列毛病…要是在线使用,很容易服务中断
SevenJ
2015-03-21 17:02:31 +08:00
我以前是定时跑mr,然后把结果放到表里
libook
2015-03-21 17:28:12 +08:00
如果是聚合需求的话,基本上count、distinct、aggregate就完成绝大多的处理功能,而且mongodb本身也对这些方法进行了很好的优化,效率很高,能用这些就不要用mapReduce,虽然mapReduce能实现上述几种聚合方法的功能,但是因为没有进行优化,所以非常慢。通常的建议是,如果你有即时的聚合查询需求,不要用mapReduce。
gt11799
2015-03-22 08:57:56 +08:00
@sujin190 mongodb的写入不阻塞是异步架构中蛮重要的一环,安全模式没试过,感觉是阻塞的。
使用mongodb记录原始数据,重要的数据存入mysql,跟用户直接交互使用一些缓存。物尽其用才是王道,而不是期望一种东西能够满足所有。
notxx
2015-03-22 12:14:42 +08:00
mapReduce是mongodb早期设计了,采用内置的js引擎来实现统计汇总,因此还有js引擎独占锁的问题。从输出方式也能看出来是不建议直接前台用的:要么inline方式输出一个结果集(有大小限制),要么用结果插入一张表,插入表的方式是比较建议的。
aggregation是新的设计,通过流水线实现统计汇总,写起来更难理解,但是性能上面好多了。从输出方式来看,支持游标方式输出,能直接在线输出很大的结果集。
ps,mapReduce的两个函数如果写不好(例如死循环了)是可以把整个服务器拖死的;从2.6的权限模型看,mongodb已经开始尽量限制服务器端脚本的应用,所以还是用aggregation更好。
notxx
2015-03-22 12:19:49 +08:00
@sujin190 如果是在复制集(replication set)中,总不能要求等所有节点都写入了才返回吧,那样随便挂掉一个节点,前台服务就卡死了。如果只要求一两个节点,和非安全写入在上面那个问题的感受上没啥区别。
而且ReadReference一般建议是找最近或者最快的非写入节点,以降低写入节点的压力,这个情况下写入之后要有一个间隔才会读到。
sujin190
2015-03-22 18:07:24 +08:00
@notxx 这个是mongo的问题么?mysql主从也有这个问题啊,当遇到这个问题时,说明你上层没设计好
notxx
2015-03-23 21:58:59 +08:00
@sujin190 可能不是所有人都熟悉这个状况啊,而且我主要的点还是WriteConcern其实不是为了这个用的。
no13bus
2015-03-23 22:16:06 +08:00
@notxx 因为看到好多做监控的提到了mongo,是说也是用mongo来进行存储一些组件的运行情况。他只是适合用来存实时性不那么强的数据?觉得监控应该实行性还行的吧。
当然我操作mongo的时候用的是异步客户端Motor。
notxx
2015-03-24 22:42:48 +08:00
@no13bus 其实我觉得@sujin190 说的没错,更重要的是设计本身。以我的经验来看,如果你能设计出来适合mongodb的数据结构,那么从各个角度(性能、使用弹性和服务弹性)都是很好的。但是反过来来说,如果出现了反设计(或者仅仅是不适合mongodb的设计)就很麻烦了。
或者简单来说,优化mongodb部署的时候你可以要求实时写入,也可以要求实时读取,但是读写都实时,而且要求不会脏读,恐怕不是能够实现的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/178406

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX