5

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

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

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

4

1 回答 1

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));

示例输出:

$ 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 }
于 2012-08-24T14:15:02.133 回答