2012-07-31 201 views
5

在我们的map-reduce作业开发过程中,我们的MR代码生成有用的诊断数据结构,而不受地图缩小的影响。是否有一种简单的方法将这些数据发布到名为mapReduce的代码中,或者将它们保存在Mongo中? (a)已经有很多数据,(b)我们的诊断信息是高度结构化的,事实上,我们想运行查询它。MongoDB:mapReduce副作用

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

要清楚,我很感兴趣,这样做在单个节点的发展,因为MongoDB中的日志/调试支持是相当有限。这种类型的副作用在生产环境中不好。

+0

究竟是什么样的数据产生? MR的输出可以保存在一个集合中。在C#中,我将它指定为:MyInputCollection.MapReduce(map,reduce,MapReduceOptions.SetOutput(“MyOutputCollection”));然后您从持久集合“MyOutputCollection”中读取。 – 2012-08-01 07:42:21

+0

我想保存独立于MR输出的信息。将其视为数据耗尽,例如,我想用代码处理详细的结构化日志记录/基准测试信息,因此我不希望它最终在日志文件中出现。 – Sim 2012-08-02 01:07:37

+0

您是否尝试过使用加帽集合进行日志记录..我不太明白为什么coll.insert应该失败.. – 2012-08-02 05:19:45

回答

2

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

不幸离开print()到蒙戈日志作为唯一的“带外”输出选项。

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

  • 加入独特的标记,它会让你在日志输出识别输出(或者甚至输出运行)

  • 序列使用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 } 
+0

这或多或少是我们最终做的。我建立了一个记录器类,记录到一个集合并使用print()。在MR期间,日志收集插入会生成吞下的异常。我希望10gen更注重开发/调试支持。 – Sim 2012-08-25 00:48:59

+0

@Sim:如果您可以在MongoDB跟踪器(SERVER队列,组件'MapReduce/Distinct/Group')中创建一个[Jira issue](https://jira.mongodb.org/browse/SERVER)有关调试需要/有用的更多信息。也许类似于Hadoop [MapReduce计数器](http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/),在运行结束时具有可选的日志输出回调。 – Stennie 2012-08-25 01:48:55