1
nesuk 2015-03-21 12:03:15 +08:00 via iPhone
阿里的ODPS就是这样建议的
|
2
micyng 2015-03-21 12:11:43 +08:00 1
用数据库做mr就是zuo si的节奏,更何况是mongo
|
3
gt11799 2015-03-21 13:01:09 +08:00
如果mongo足够大,写入之后立刻查询,得到的基本是写入前的结果。
mongo适合记录一些初始数据,然后跑脚本在后台处理成你想要的数据。 mongo的数据要展示到前台,最好是提前处理好的。 与用户实时交互的数据,一般不能使用mongo。 |
5
taogogo 2015-03-21 16:44:39 +08:00
最好不要,mongo的速度受内存影响大;分区后mr没有优势;通常mr是单线程的(除非自己构造数据);repair的时候会锁住等等一系列毛病…要是在线使用,很容易服务中断
|
6
SevenJ 2015-03-21 17:02:31 +08:00 1
我以前是定时跑mr,然后把结果放到表里
|
7
libook 2015-03-21 17:28:12 +08:00 1
如果是聚合需求的话,基本上count、distinct、aggregate就完成绝大多的处理功能,而且mongodb本身也对这些方法进行了很好的优化,效率很高,能用这些就不要用mapReduce,虽然mapReduce能实现上述几种聚合方法的功能,但是因为没有进行优化,所以非常慢。通常的建议是,如果你有即时的聚合查询需求,不要用mapReduce。
|
8
gt11799 2015-03-22 08:57:56 +08:00
@sujin190 mongodb的写入不阻塞是异步架构中蛮重要的一环,安全模式没试过,感觉是阻塞的。
使用mongodb记录原始数据,重要的数据存入mysql,跟用户直接交互使用一些缓存。物尽其用才是王道,而不是期望一种东西能够满足所有。 |
9
notxx 2015-03-22 12:14:42 +08:00
mapReduce是mongodb早期设计了,采用内置的js引擎来实现统计汇总,因此还有js引擎独占锁的问题。从输出方式也能看出来是不建议直接前台用的:要么inline方式输出一个结果集(有大小限制),要么用结果插入一张表,插入表的方式是比较建议的。
aggregation是新的设计,通过流水线实现统计汇总,写起来更难理解,但是性能上面好多了。从输出方式来看,支持游标方式输出,能直接在线输出很大的结果集。 ps,mapReduce的两个函数如果写不好(例如死循环了)是可以把整个服务器拖死的;从2.6的权限模型看,mongodb已经开始尽量限制服务器端脚本的应用,所以还是用aggregation更好。 |
10
notxx 2015-03-22 12:19:49 +08:00 1
@sujin190 如果是在复制集(replication set)中,总不能要求等所有节点都写入了才返回吧,那样随便挂掉一个节点,前台服务就卡死了。如果只要求一两个节点,和非安全写入在上面那个问题的感受上没啥区别。
而且ReadReference一般建议是找最近或者最快的非写入节点,以降低写入节点的压力,这个情况下写入之后要有一个间隔才会读到。 |