mongo-mapreduce测试(11)——跟踪调试
mongo-mapreduce测试(1)——count/sum/where条件
mongo-mapreduce测试(2)——列转行与finalize函数
mongo-mapreduce测试(3)——group by having
mongo-mapreduce测试(7)——使用js存储过程
mongo-mapreduce测试(9)——python调用
mongo-mapreduce测试(10)——阶段总结(2)
前面介绍了一些比较简单的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
>
参考这里。