Debugging MongoDB:mapReduce副作用

Debugging MongoDB:mapReduce副作用,debugging,mongodb,logging,mapreduce,serverside-javascript,Debugging,Mongodb,Logging,Mapreduce,Serverside Javascript,在地图缩减作业的开发过程中,我们的MR代码生成有用的诊断数据结构,与地图缩减数据无关。有没有一种简单的方法可以将这些数据输出到调用mapReduce的代码中,或者将它们持久化到Mongo中?仅仅写入日志文件就变得非常不理想,因为(a)那里已经有很多数据,(b)我们的诊断信息是高度结构化的,事实上,我们希望对其运行查询 到目前为止,我的调查表明MR数据结构是按值传递的(通过序列化),因此任何内存中的数据结构都会丢失,包括那些连接到“全局”范围的数据结构。名称空间与主JS服务器端名称空间隔离,因此d

在地图缩减作业的开发过程中,我们的MR代码生成有用的诊断数据结构,与地图缩减数据无关。有没有一种简单的方法可以将这些数据输出到调用mapReduce的代码中,或者将它们持久化到Mongo中?仅仅写入日志文件就变得非常不理想,因为(a)那里已经有很多数据,(b)我们的诊断信息是高度结构化的,事实上,我们希望对其运行查询

到目前为止,我的调查表明MR数据结构是按值传递的(通过序列化),因此任何内存中的数据结构都会丢失,包括那些连接到“全局”范围的数据结构。名称空间与主JS服务器端名称空间隔离,因此
dbeval
似乎无法访问它们(或者,至少,我不知道从哪里查找)。最后但并非最不重要的一点是,尽管所有数据库对象和函数都存在,但10gen正在生成(混淆)错误消息以阻止它们的使用,例如,关于
coll.insert
不是函数,而
typeof coll.insert===“function”
true


明确地说,我对在单个节点中进行开发感兴趣,因为MongoDB中的日志记录/调试支持非常有限。这种类型的副作用在生产环境中并不好。

据推测,不可能(在MongoDB 2.2中)从Map/Reduce函数中访问另一个DB。除了潜在的性能影响外,还有可能造成死锁和其他不必要的副作用

不幸的是,这将把
print()
作为唯一的“带外”输出选项留给mongo日志

根据您的诊断输出,可以尝试以下方法:

  • 添加一个唯一的标记,允许您在日志输出中标识输出(甚至是输出运行)

  • 使用
    tojson()
    序列化您的输出,这样它会以某种可解析的结构记录下来,理想情况下,当您
    print()时,它会在一行中发出

  • 在mongod.log日志中编写脚本,查找与唯一标记匹配的行,并将这些行插入另一个集合中进行报告

将在M/R功能中运行的代码示例:

var diag = {
    'run' : diagrun,
    'phase': 'map',
    'key'  : z
}   
print("MAPDIAG:" + tojson(diag));
示例输出:

$ tail -f mongo.log | grep "^MAPDIAG"
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" }
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" }
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" }
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "mouse" }
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" }
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" }
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "cat", "total" : 3 }
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "dog", "total" : 2 }

它究竟生成了什么样的数据?MR的输出可以持久保存在集合中..在C#中,我将其指定为:MyInputCollection.MapReduce(map,reduce,MapReduceOptions.SetOutput(“MyOutputCollection”);然后读取持久性集合“MyOutputCollection”。我希望保存独立于MR输出的信息。可以将其视为数据耗尽,例如,对于我想用代码处理的详细结构化日志记录/基准测试信息,因此我不希望它最终出现在日志文件中。您是否尝试过使用封顶集合进行日志记录。。我不太明白为什么coll.insert会失败。@AafreenSheikh insert()会失败,因为在map reduce期间禁用了临时数据库操作。10gen一定是为了控制环境才这么做的。这或多或少就是我们最终要做的。我构建了一个logger类,它记录到一个集合并使用print()。在MR期间,日志集合插入会生成异常,这些异常会被吞没。我希望10gen更多地关注开发/调试支持。@Sim:如果您能在MongoDB跟踪器(服务器队列,组件“MapReduce/Distinct/Group”)中创建一个包含调试所需/有用内容的详细信息,将非常有帮助。可能类似于Hadoop,在运行结束时有一个可选的日志输出回调。