V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
no13bus
V2EX  ›  程序员

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

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