究Mahout平台第三天

来源:互联网 发布:ubuntu 修改用户密码 编辑:程序博客网 时间:2024/05/22 00:43
研究Mahout平台第三天
   今天目标:
         研究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( "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。

今日总结:
      尝试新的版本总会带来新的问题。