MongoDB:mapReduce副作用

Sim*_*Sim 5 debugging logging mapreduce mongodb serverside-javascript

在开发map-reduce作业期间,我们的MR代码生成有用的诊断数据结构,而不依赖于地图缩减的数据.有没有一种简单的方法可以将这些数据输出到调用mapReduce的代码或将它们保存在Mongo中?只是写入日志文件是非常次优的,因为(a)已经有很多数据和(b)我们的诊断信息是高度结构化的,事实上,我们想要运行查询它.

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

为了清楚起见,我有兴趣在单个节点中进行开发,因为MongoDB中的日志/调试支持非常有限.这种副作用在生产环境中并不好.

Ste*_*nie 2

正如猜测的那样,不可能(在 MongoDB 2.2 中)从 Map/Reduce 函数中访问另一个数据库。除了潜在的性能影响之外,还可能造成死锁和其他不需要的副作用。

不幸的是,这使得print()mongo 日志成为唯一的“带外”输出选项。

根据您的诊断输出,尝试的一种方法是:

  • 添加一个唯一的标记,使您能够识别日志输出中的输出(甚至是输出运行)

  • 使用序列化您的输出tojson(),以便使用一些可解析的结构进行记录,并且理想情况下在您使用时在一行上发出print()

  • 将脚本写入tailmongod.log 日志中,以获取与您的唯一标记匹配的行,并将其插入另一个集合中以进行报告

从 M/R 函数中运行的代码示例:

var diag = {
    'run' : diagrun,
    'phase': 'map',
    'key'  : z
}   
print("MAPDIAG:" + tojson(diag));
Run Code Online (Sandbox Code Playgroud)

输出示例:

$ 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 }
Run Code Online (Sandbox Code Playgroud)