mongo-mapreduce测试(11)——跟踪调试

mongo-mapreduce测试(1)——count/sum/where条件

mongo-mapreduce测试(2)——列转行与finalize函数

mongo-mapreduce测试(3)——group by having

mongo-mapreduce测试(4)——avg

mongo-mapreduce测试(5)——max/min

mongo-mapreduce测试(6)——综合测试

mongo-mapreduce测试(7)——使用js存储过程

mongo-mapreduce测试(8)——阶段总结(1)

mongo-mapreduce测试(9)——python调用

mongo-mapreduce测试(10)——阶段总结(2)

mongo-mapreduce测试(11)——跟踪调试

前面介绍了一些比较简单的MR程序,实际应用中,如果编写了复杂的map/reduce函数,如何进行故障的跟踪和调试呢?下面是两个小例子,一个关于map,一个关于reduce。

测试数据如下:

> db.tianyc_test3.find()
{ "_id" : ObjectId("512ac22ace320ef648ce7fa3"), "name" : "xtt", "dic" : 1 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fa4"), "name" : "xtt", "dic" : 2 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fa5"), "name" : "xtt", "dic" : 3 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fa6"), "name" : "xtt", "dic" : 4 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fa7"), "name" : "xtt", "dic" : 5 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fa8"), "name" : "yct", "dic" : 1 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fa9"), "name" : "yct", "dic" : 2 }
{ "_id" : ObjectId("512ac22ace320ef648ce7faa"), "name" : "neu", "dic" : 1 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fab"), "name" : "neu", "dic" : 2 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fac"), "name" : "neu", "dic" : 3 }
{ "_id" : ObjectId("512ac22ace320ef648ce7fad"), "name" : "neu", "dic" : 4 }
{ "_id" : ObjectId("512ae125e8fe989ba464d2ab"), "name" : "neu", "dic" : 10 }
{ "_id" : ObjectId("512ae12ae8fe989ba464d2ac"), "name" : "xjbu", "dic" : 1 }
{ "_id" : ObjectId("512ae13ae8fe989ba464d2ad"), "name" : "xjbu", "dic" : 2 }
>

1. map函数的调试。

#编写map函数

> var map = function() {
... emit(this.name, this.dic);
... };

#编写emit函数,用于打印map函数运行结果。

> var emit = function(key, value) {
... print("emit");
... print("key: " + key + " value: " + tojson(value));
... }

#我们先选择1条数据进行map函数的跟踪,查看map结果:

> var myDoc=db.tianyc_test3.findOne()
> myDoc
{ "_id" : ObjectId("512ac22ace320ef648ce7fa3"), "name" : "xtt", "dic" : 1 }
> map.apply(myDoc)
emit
key: xtt value: 1

#然后编写循环,打印出每个你想查看的document的map结果:

> var myDocs=db.tianyc_test3.find()
> while(myDocs.hasNext()){
... var myDoc=myDocs.next();
... print('doc_id:'+tojson(myDoc._id));
... map.apply(myDoc);
... print();
... }
doc_id:ObjectId("512ac22ace320ef648ce7fa3")
emit
key: xtt value: 1

doc_id:ObjectId("512ac22ace320ef648ce7fa4")
emit
key: xtt value: 2

doc_id:ObjectId("512ac22ace320ef648ce7fa5")
emit
key: xtt value: 3

doc_id:ObjectId("512ac22ace320ef648ce7fa6")
emit
key: xtt value: 4

doc_id:ObjectId("512ac22ace320ef648ce7fa7")
emit
key: xtt value: 5

doc_id:ObjectId("512ac22ace320ef648ce7fa8")
emit
key: yct value: 1

doc_id:ObjectId("512ac22ace320ef648ce7fa9")
emit
key: yct value: 2

doc_id:ObjectId("512ac22ace320ef648ce7faa")
emit
key: neu value: 1

doc_id:ObjectId("512ac22ace320ef648ce7fab")
emit
key: neu value: 2

doc_id:ObjectId("512ac22ace320ef648ce7fac")
emit
key: neu value: 3

doc_id:ObjectId("512ac22ace320ef648ce7fad")
emit
key: neu value: 4

doc_id:ObjectId("512ae125e8fe989ba464d2ab")
emit
key: neu value: 10

doc_id:ObjectId("512ae12ae8fe989ba464d2ac")
emit
key: xjbu value: 1

doc_id:ObjectId("512ae13ae8fe989ba464d2ad")
emit
key: xjbu value: 2

>

2. reduce函数的调试。

reduce函数入参为一个key,和一个value数组。其中value数组中的元素是无序的。

#编写reduce函数,实现avg。

> var reduce = function(key, values) {
... var sum = 0;
... for (var i=0;i<values.length;i++){
... sum+=values[i];
... }
... return sum/values.length;
... };

#构建测试数据
> var test_datas=[5,5,10]

#执行reduce
> reduce('myKey',test_datas)
6.666666666666667
>

参考这里

posted @ 2013-02-26 14:09  醇酒醉影  阅读(2735)  评论(0编辑  收藏  举报