Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。
在上篇blog中的最后终端的信息可以看到,svd算法一共有5个Job任务。下面通过Mahout中DistributedLanczosSolver源代码来一个个分析:
为了方便后面的数据随时对照,使用wine.dat修改后的数据,如下(5行,13列):
14.23,1.71,2.43,15.6,127,2.8,3.06,0.28,2.29,5.64,1.04,3.92,1065 13.2,1.78,2.14,11.2,100,2.65,2.76,0.26,1.28,4.38,1.05,3.4,1050 13.16,2.36,2.67,18.6,101,2.8,3.24,0.3,2.81,5.68,1.03,3.17,1185 14.37,1.95,2.5,16.8,113,3.85,3.49,0.24,2.18,7.8,0.86,3.45,1480 13.24,2.59,2.87,21,118,2.8,2.69,0.39,1.82,4.32,1.04,2.93,735
1.首先,算法使用main方法进行调用,看到main方法中只用一句:
ToolRunner.run(new DistributedLanczosSolver().job(), args);
所以直接去找run方法,进入96行的run方法,这里都是初始化我们设置的参数了,这里有一些参数是相对好理解的,比如数据的输入、输出以及输入数据的行数、列数,但是,这里有一个working dir参数,不知道是干什么的,还有symmetric,这个应该是说输入数据是否是对称的?rank参数,这个不理解。cleansvd,好像是对输出结果的一个修饰还是什么的,看官网上面设置为true,那这里也按照设置为true的思路来分析。如果cleansvd是true的话,那么接下来就有一个if条件判断了,就会进入:
if (cleansvd) { double maxError = Double.parseDouble(AbstractJob.getOption(parsedArgs, "--maxError")); double minEigenvalue = Double.parseDouble(AbstractJob.getOption(parsedArgs, "--minEigenvalue")); boolean inMemory = Boolean.parseBoolean(AbstractJob.getOption(parsedArgs, "--inMemory")); return run(inputPath, outputPath, outputTmpPath, workingDirPath, numRows, numCols, isSymmetric, desiredRank, maxError, minEigenvalue, inMemory); }
这里先初始化三个参数,这里都是按照默认的,maxError是0.05,minEigenvalue是0,inMemory是false;
然后进入run方法,这个run方法是调用142行的方法,这个方法中还有一个run方法以及另外一个Job,如下:
public int run(Path inputPath, Path outputPath, Path outputTmpPath, Path workingDirPath, int numRows, int numCols, boolean isSymmetric, int desiredRank, double maxError, double minEigenvalue, boolean inMemory) throws Exception { int result = run(inputPath, outputPath, outputTmpPath, workingDirPath, numRows, numCols, isSymmetric, desiredRank); if (result != 0) { return result; } Path rawEigenVectorPath = new Path(outputPath, RAW_EIGENVECTORS); return new EigenVerificationJob().run(inputPath, rawEigenVectorPath, outputPath, outputTmpPath, maxError, minEigenvalue, inMemory, getConf() != null ? new Configuration(getConf()) : new Configuration()); }
这里看到有一个run方法,所以应该是这个run方法调用了三个Job,然后最后调用EigenVerificationJob.run()方法最后运行一个job,然后一共四个job,这个只是猜测。先看run方法里面的吧。进入181行的run方法,额,好吧,还在这个类中。这个run方法中才有点实质的内容:
public int run(Path inputPath, Path outputPath, Path outputTmpPath, Path workingDirPath, int numRows, int numCols, boolean isSymmetric, int desiredRank) throws Exception { DistributedRowMatrix matrix = new DistributedRowMatrix(inputPath, outputTmpPath, numRows, numCols); matrix.setConf(new Configuration(getConf() != null ? getConf() : new Configuration())); LanczosState state; if (workingDirPath == null) { state = new LanczosState(matrix, desiredRank, getInitialVector(matrix)); } else { HdfsBackedLanczosState hState = new HdfsBackedLanczosState(matrix, desiredRank, getInitialVector(matrix), workingDirPath); hState.setConf(matrix.getConf()); state = hState; } solve(state, desiredRank, isSymmetric); Path outputEigenVectorPath = new Path(outputPath, RAW_EIGENVECTORS); serializeOutput(state, outputEigenVectorPath); return 0; }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索path
, 方法
, running job
, run
inmemory
mahout 自定义job、lanczos算法、lanczos、lanczos算法原理、block lanczos,以便于您获取更多的相关知识。