海量数据处理Proj2的一些问题及解决

这次我们的团队「会议记录」都放在了http://collabedit.com/7e7sb上面。

ReduceTask的互通问题
在执行reduce中我们频繁遇到过reducetask卡在16%的情况,后来我们在访问DataNode的log时浏览器访问了无效域名,而这个无效域名是每个slave的计算机名,而不是我们在设置文件中设定好的域名,所以解决方案很简单,就是将计算机名和我们设定的域名一起写入hosts文件中即可。

DataNode无法启动
在格式化NameNode时,如果没有实现删除掉datastore,则格式化后NameNode和DataNode的版本号会不一致,导致DataNode无法启动,若在格式化后修改NameNode的版本号使其与DataNode一致也可以解决问题,当然,前提是datastore中的内容完整。

堆栈溢出
在执行过程中遇到错误,提示Error: Java heap space。将堆栈上限调高即可解决此问题,mapred-site.xml:

<property>
  <name>mapred.child.java.opts</name>
  <value>-Xmx1024m</value>
</property>

读取文件失效
在程序需要读取文件时,可能读取不到文件,因为我们最初将文件路径设置为master的域名下,而hadoop的文件访问路径是在所有拥有文件拷贝的slave中随机选取的,故程序会访问不到文件,后来我们将域名头删去,hadoop自动在合适的slave中找到了文件,问题解决。

时间复杂度
最开始在迭代过程中我们用rold分别与M中的整行相乘,这样处理每一行需要O(n)的时间复杂度,效率很低,实际运行时map过程极慢,后来经过讨论确定M矩阵的每一行中只有有入度的位置才需要单独计算,其他位置无论是终止点还是非终止点均是重复计算,很浪费系统资源,后来我们在主函数中先将终止点的总rank和非终止点通用的重复rank计算出来,保存在全局变量C(后一个矩阵和rank相乘结果,每行是一样的),在reduce过程中直接将C加到roldnew中,大大提升了效率。

起始点与孤立点
由于我们以被链入的点为key,所以入度为0的node在map结束时不会被输出,而我们在reduce中并没有额外找回这些node,所以在一次Map-Reduce过程中这些node的rank值不会与上一次有任何不同。通过仔细的分析与思考,我们想出了解决方案:我们发现这些入度为0的node在每次Map-Reduce应当得出的值均为C,所以我们在主函数中每轮迭代结束之后再读取rnew后,将rnew中所有的0(每轮迭代之前会将rnew向量初始化为0)赋为C。这样就巧妙地解决了这个起始点和孤立点没有rank值的问题。

Tags : ,

2 thoughts on “海量数据处理Proj2的一些问题及解决”

    1. 没proj也可以写的嘛,我之前瞎扯的好多篇都是无聊的产物。。。
      本来以为放假了可以来个系列文章,现在实习等好多事忙不过来了,过几天准备准备还是写一写

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Click the right image To submit your comment: