gpt4 book ai didi

debugging - MongoDB:mapReduce 的副作用

转载 作者:IT老高 更新时间:2023-10-28 12:31:48 25 4
gpt4 key购买 nike

在我们的 map-reduce 作业的开发过程中,我们的 MR 代码独立于被 map-reduce 的数据生成有用的诊断数据结构。有没有一种简单的方法可以将这些数据导出到调用 mapReduce 的代码中或将它们保存在 Mongo 中?仅仅写入日志文件是非常次优的,因为 (a) 那里已经有很多数据,并且 (b) 我们的诊断信息是高度结构化的,事实上,我们希望针对它。

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

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

最佳答案

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

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

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

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

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

  • 编写脚本到 tail 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 }

关于debugging - MongoDB:mapReduce 的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com