研究Mahout平台第三天
![](https://img-blog.csdn.net/20130506175253491)
今天目标:
研究k-means算法的调用方式和代码:
1.首先建一个map/reduce工程。
2.建一个包mahoutTest,在包下建一个类:kMeans.java。现在什么也没有。
3.看看mahout的例子程序,找到源代码。
3.1在工程下建一个包,将mahout-core-0.5-cdh3u6.jar,mahout-core-0.5-cdh3u6-job.jar,mahout-examples-0.5-cdh3u6.jar,mahout-examples-0.5-cdh3u6-job.jar,mahout-math-0.5-cdh3u6.jar,mahout-utils-0.5-cdh3u6.jar拷贝到lib文件夹中。配置到工程,并配置每个jar包的源代码。
3.1.1 在配置 mahout-core-0.5-cdh3u6-job.jar的源代码时发现了以下问题:
1.com包和javax包下的类不能找到源代码?一个googole的源代码,一个是javax的源代码。还有thoutworks.xstream的源代码。
2.只有 org.apache.mahout下的源代码可以在mahout包中的core的src下找到?
3.1.2 在配置mahout-examples-0.5-cdh3u6-job.jar包的源代码时和3.1发现的问题一样,可能是打包时将所引用的包类自动打包到当前jar包导致。另外有很多不明白的问题:
1.meta问价夹下有一个maven包。里面有很多的文件夹,都是一些公用程序包,包中有两个文件:
1.pom.xml xmlns指向了:http://maven.apache.org/POM/4.0.0
2.pom.properties
2.这个和maven有关,有机会学习一下!
3.2.查看org.apache.mahout.clustering.syntheticcontrol.kmeans.Job的源代码:
3.2.1 必须找出指定的haoop的地址代码段。
查看到以下代码:
public
static
void
main(String[] args)
throws
Exception {
if
(args.
length
> 0) {
log
.info(
"Running with only user-supplied arguments"
);
ToolRunner. run(
new
Configuration(),
new
Job(), args);
}
else
{
//先看没有参数的情况
log
.info(
"Running with default arguments"
);
Path output =
new
Path(
"output"
);
//hadoop服务地址是在这里默认的
Configuration conf =
new
Configuration();
//删除已经生成的结果
HadoopUtil. delete(conf, output);
//运行k-means算法处理数据
new
Job().run(conf,
new
Path(
"testdata"
), output,
new
EuclideanDistanceMeasure(), 6, 0.5, 10);
}
}
3.2.2 新建我自己的
KMeansJob类,将job中的代码粘贴!
3.2.2.1 修改
Configuration
中的配置项。
1.我先运行一下,看看错误!意料之中出现错误,但是是shell错误,可能是程序试图将haoop平台在本机启动起来。
2.使用
conf.set(name,String )方法,设置配置项。
String hostIp =
"191.168.2.26"
;
conf.set(
"hadoop.job.ugi"
,
"glw"
);
conf.set( "mapred.job.tracker" , hostIp + ":9001" );
conf.set( "mapred.job.tracker" , hostIp + ":9001" );
conf.set(
"fs.default.name"
,
"hdfs://"
+ hostIp +
":9000"
);
试验!
出现了以下错误:
13/05/06 10:58:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
ERROR security.UserGroupInformation:
PriviledgedActionException
as:Administrator (auth:SIMPLE)
1.可能是服务器和客户端版本不对导致的问题,将程序包更换后发现不是这个问题。
2.可能还是ip设置的问题,和以前写的程序进行比对,发现不是这个问题。
3.注意第三个异常,
1.上网搜索,有说是因为直接使用ip的原因,试着修改为hostname,程序修改后没有解决问题。
4.还是因为应用在本地执行导致的问题,如何将程序提交到服务器执行。
初步查看到代码的这一句:
log
.info(
"Preparing Input"
);
InputDriver.
runJob
(input, directoryContainingConvertedInput,
"org.apache.mahout.math.RandomAccessSparseVector"
);
runJob方法中new了一个
Configuration里面没有Ip配置导致的问题。
好吧!再运行一次,这次好了,看来就是代码的问题。
5.如果我不管当前的问题,只是定义算法调用的webservice接口。可将当前问题规避过去。
6.我需要知道输入格式,和输出格式。如何将输出文件下载到本地。
7.使用wordcount 验证目前mahout程序。
当前程序自动提取的用户名不对。 把本地windows的administrator提取到了?
使用以下代码:
conf.set(
"hadoop.job.user"
,
"glw"
);这一句在我的程序中不起作用。我通过这种代码暂时解决问题:
Path output =
new
Path(
"/user/glw/output"
);
出现以下异常:
java.lang.RuntimeException
:
java.lang.ClassNotFoundException
: mahoutTest.WordCount1$TokenizerMapper
应该是和这个警告有
关:
13/05/06 15:13:51 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
网上说增加一句代码:
job.setJarByClass(WordCount1.
class
);
就可以了,可是我的还是不行。
解决方法: 先给自己的程序打成jar包,然后放到工程的根目录下,然后在代码中添加
JobConf conf=new JobConf();
conf.setJar("pr.jar");
异常
总算变了,变成了以下异常:
java.lang.IllegalStateException
: No clusters found. Check your -c path.
悲剧了,网上搜不到了。
整个执行过程是这样的:
13/05/06 16:08:59 INFO mapreduce.Job: Running with default arguments
13/05/06 16:09:00 INFO mapreduce.Job: Preparing Input
13/05/06 16:09:00 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/05/06 16:09:01 INFO input.FileInputFormat: Total input paths to process : 1
13/05/06 16:09:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/05/06 16:09:01 WARN snappy.LoadSnappy: Snappy native library not loaded
13/05/06 16:09:02 INFO mapred.JobClient: Running job: job_201305052023_0010
13/05/06 16:09:03 INFO mapred.JobClient: map 0% reduce 0%
13/05/06 16:09:11 INFO mapred.JobClient: map 100% reduce 0%
13/05/06 16:09:11 INFO mapred.JobClient: Job complete: job_201305052023_0010
13/05/06 16:09:11 INFO mapred.JobClient: Counters: 17
13/05/06 16:09:11 INFO mapred.JobClient: Job Counters
13/05/06 16:09:11 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=7197
13/05/06 16:09:11 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
13/05/06 16:09:11 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
13/05/06 16:09:11 INFO mapred.JobClient: Launched map tasks=1
13/05/06 16:09:11 INFO mapred.JobClient: Data-local map tasks=1
13/05/06 16:09:11 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=0
13/05/06 16:09:11 INFO mapred.JobClient: FileSystemCounters
13/05/06 16:09:11 INFO mapred.JobClient: HDFS_BYTES_READ=288495
13/05/06 16:09:11 INFO mapred.JobClient: FILE_BYTES_WRITTEN=56162
13/05/06 16:09:11 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=335470
13/05/06 16:09:11 INFO mapred.JobClient: Map-Reduce Framework
13/05/06 16:09:11 INFO mapred.JobClient: Map input records=600
13/05/06 16:09:11 INFO mapred.JobClient: Physical memory (bytes) snapshot=36831232
13/05/06 16:09:11 INFO mapred.JobClient: Spilled Records=0
13/05/06 16:09:11 INFO mapred.JobClient: CPU time spent (ms)=260
13/05/06 16:09:11 INFO mapred.JobClient: Total committed heap usage (bytes)=16056320
13/05/06 16:09:11 INFO mapred.JobClient: Virtual memory (bytes) snapshot=375001088
13/05/06 16:09:11 INFO mapred.JobClient: Map output records=600
13/05/06 16:09:11 INFO mapred.JobClient: SPLIT_RAW_BYTES=121
13/05/06 16:09:11 INFO mapreduce.Job: Running random seed to get initial clusters
13/05/06 16:09:11 INFO compress.CodecPool: Got brand-new compressor
13/05/06 16:09:11 INFO kmeans.RandomSeedGenerator: Wrote 6 vectors to /user/glw/output/clusters-0/part-randomSeed
13/05/06 16:09:11 INFO mapreduce.Job: Running KMeans
13/05/06 16:09:11 INFO kmeans.KMeansDriver: Input: /user/glw/output/data Clusters In: /user/glw/output/clusters-0/part-randomSeed Out: /user/glw/output Distance: org.apache.mahout.common.distance.EuclideanDistanceMeasure
13/05/06 16:09:11 INFO kmeans.KMeansDriver: convergence: 0.5 max Iterations: 10 num Reduce Tasks: org.apache.mahout.math.VectorWritable Input Vectors: {}
13/05/06 16:09:11 INFO kmeans.KMeansDriver: K-Means Iteration 1
13/05/06 16:09:11 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/05/06 16:09:12 INFO input.FileInputFormat: Total input paths to process : 1
13/05/06 16:09:13 INFO mapred.JobClient: Running job: job_201305052023_0011
13/05/06 16:09:14 INFO mapred.JobClient: map 0% reduce 0%
13/05/06 16:09:22 INFO mapred.JobClient: Task Id : attempt_201305052023_0011_m_000000_0, Status : FAILED
java.lang.IllegalStateException
: No clusters found. Check your -c path.
at org.apache.mahout.clustering.kmeans.KMeansMapper.setup(
KMeansMapper.java:60
)
at org.apache.hadoop.mapreduce.Mapper.run(
Mapper.java:142
)
at org.apache.hadoop.mapred.MapTask.runNewMapper(
MapTask.java:648
)
at org.apache.hadoop.mapred.MapTask.run(
MapTask.java:322
)
at org.apache.hadoop.mapred.Child$4.run(
Child.java:266
)
at java.security.AccessController.doPrivileged(
Native Method
)
at javax.security.auth.Subject.doAs(
Subject.java:396
)
at org.apache.hadoop.security.UserGroupInformation.doAs(
UserGroupInformation.java:1278
)
at org.apache.hadoop.mapred.Child.main(
Child.java:260
)
可以看到,第一次迭代是成功的,但是算法处理结果的聚类个数为0。将程序在服务器本地运行,也是该问题。
难道是cdh3u6的bug?好吧,我换回来试试!
果然是版本问题!
我去:
插件崩溃了!找找原因!我需要使用插件源代码工程运行插件,这样我就能看到运行时的控制台了。
重新启动后看不到错误了,原因是由于导致该错误的文件夹已经不存在了,看来是插件的bug。
今日总结:
尝试新的版本总会带来新的问题。