大家好,第三次作业的成绩也已经发布在课程网站了。
http://net.pku.edu.cn/~course/cs402/2014/assign/scores3.htm这次大部分同学都非常努力!从你们提交的代码和报告中,都可以看出不少同学费了很多精力去钻研各种方法。从讨论组和平时的答疑中,我们助教也学到了很多新的东西,在此点32个赞!
几个常见问题:
1. reducer 和 combiner 混用。在wordcount和"wordpaircount"这两个作业中,这个问题比较不明显,但是,如果我们在reducer中想做一些特别的操作,比如统计词项 df 等,这时很可能忘记在统计后输出出来,保证被当成 combiner 调用的reducer函数能把数据传到下一个阶段。
2. 为了应对AP数据集,大部分同学选择把可用内存调大,其实,这个挺trick的...这里引用一下Huo Haoyan同学的建议:
"实际测试中,在数据量非常大的时候(例如运行AP数据) ,reduce环节会发生Java Heap溢
出的情况。为了避免溢出,程序最终放弃了Hadoop自带的Context write 方法,而是选择了
另一种方法将数据写入HDFS。在reducer 初始化环节,它的 setup方法会被调用,此时程序
会获得reduce的 worker id, 然后根据这个id创建一个 HDFS文件, 同时用GZIPOutputStream
进行包装,将数据压缩;Reduce环节程序不再使用Context的写入方法,而是直接操作之前
创建的文件;最终reducer结束,cleanup方法被调用,程序将缓存写入文件,然后关闭流。
Hadoop默认生成的reduce 输出数据被用NullOutputFormat取消。这样程序可以处理任意大
的数据而不可能发生内存溢出的情况了。"
然后是几个后续建议吧:
1. pagerank的调试是比较麻烦的,正如先前建议的,希望大家先在小数据集上测试好了,然后再转到较大的数据集循序渐近。除了我在组里提到的minwiki-test.xml,你们还可以试一试这个:
/cs402/jh/tinywiki-test.xml
只有 3 个结点的闭集,同时pagerank已经算好可以验证了。不妨一试。
2. 在调试中出现奇怪的问题时,其实是可以用System.err.println()直接打印出来的,输出的内容可以在changping11对应的job中,把日志调出来看,比如 :
http://changping11:50030/jobfailures.jsp?jobid=job_201407221030_4169&kind=map&cause=killed
中的"logs"链接。(上面这个链接可能过不久就会失效)
3. 希望大家或多或少关注一下自己写的程序能否在时间性能上有所改进。
嗯,好好加油吧!
--
Han Jiang
Team of Search Engine and Web Mining,
School of Electronic Engineering and Computer Science,
Peking University, China