现在的位置: 首页 > 综合 > 正文

myeclipse调用mahout KMeansDriver出错

2013年03月02日 ⁄ 综合 ⁄ 共 2134字 ⁄ 字号 评论关闭

hadoop1.0.4,mahout0.7。

最近在更新以前写的那个web调用mahout算法的平台,新增了一些hadoop的基本操作,并且增加了mahout两个算法,预计这两天发布到csdn资源页。有需要的同学可以下载参考下。

今天遇到的问题就是在myeclipse中调用mahout的kmeans算法的时候出现的,先看下出错的信息:

2014-01-01 22:34:37,611  INFO [main] (JobClient.java:1330) - Task Id : attempt_201401011932_0023_m_000000_0, Status : FAILED
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:604)
	at java.util.ArrayList.get(ArrayList.java:382)
	at org.apache.mahout.clustering.classify.ClusterClassifier.readFromSeqFiles(ClusterClassifier.java:215)
	at org.apache.mahout.clustering.iterator.CIMapper.setup(CIMapper.java:36)
	at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
	at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:415)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
	at org.apache.hadoop.mapred.Child.main(Child.java:249)

这个其实可以算是mahout的一个bug吧(额,也不知道算不算)。就是在ClusterClasifier中当获得Configuration的时候,它都会去new一个新的,这个会导致什么问题呢?如果是在命令行(linux)中运行,那么不会有问题,如果是在win7的myeclipse中运行就会出现问题,因为我们已经指定了conf的两个参数:mapred.job.tracker和fs.default.name。我们是靠这两个参数来找到我们的集群的,如果这两个参数没有使用到,那么集群肯定就会有问题(找不到集群)。所以在ClusterClassifier的230的写入就写入不了,但是这里没有报错(写入不了它也没有报错,真是的)。然后它在读取的时候还是去读了,但是没有文件,所以导致读出来的是null,所以size是0,那代码如果去下标是0的话,那么肯定是数组越界了。

下面说说解决方法吧:之前其实也有遇到这个问题,当时也是发现了代码里面重新new了一个Configuration后导致出错,所以当时的做法是在其后面加上conf.set("mapred.job.tracker", "fansyPC:9001"); conf.set("fs.default.name",
"fansyPC:9000");然后就可以了,但是这样很麻烦。有没有更好的方法呢?

额,其实肯定是有的。不过不知道0.9的版本这个问题有没有修改过,如果用的还是0.7的同学,可以下载0.7的Configuration的源码,然后复制到工程中(路径保持一致)。然后修改213行的构造方法,把conf.set("mapred.job.tracker",
"fansyPC:9001"); 
conf.set("fs.default.name", "fansyPC:9000");加在this(true)的后面。然后就可以了,如果你不确定是否ok,那么可以怎么做?直接new一个configuration,然后打印conf.get("mapred.job.tracker")如果有值,那就ok了。

修改之后,再次运行KMeansDriver,运行成功。


如果您觉得lz的blog或者资源还ok的话,可以选择给lz投一票,多谢。(投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013/fansy1990 )

分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990

抱歉!评论已关闭.