注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

云计算和云存储之五分布式Hadoop的Eclipse开发第一个程序  

2016-03-07 20:42:11|  分类: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

云计算和云存储之五分布式HadoopEclipse开发第一个程序

 

上面的HelloWorld程序不贴,但是得贴一个WordCount程序,这个虽然比较简单,但总归是有的肉在里头。

先看代码:

import java.io.IOException;

import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

 

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.mapreduce.Mapper.Context;

import org.apache.hadoop.mapreduce.Reducer;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.util.GenericOptionsParser;

 

 

public class WordCount {

         public static class TokenizerMapper extends Mapper<Object,Text,Text,IntWritable>{

                   private final static IntWritable one = new IntWritable(1);

                   private Text word = new Text();

                  

                   public void map(Object key,Text value,Context context) throws IOException,InterruptedException{

                           

                            StringTokenizer itr = new StringTokenizer(value.toString());

                           

                            while (itr.hasMoreTokens()){

                                     word.set(itr.nextToken());

                                     context.write(word, one);

                            }

                   }

         }

        

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable>{

                  

                   private IntWritable result = new IntWritable();

                  

                   public void reduce(Text key,Iterable<IntWritable> values,Context context)throws IOException,InterruptedException{

                            int sum = 0;

                            for (IntWritable val:values){

                                     sum += val.get();

                            }

                           

                            result.set(sum);

                            context.write(key, result);

                   }

         }

public static void main(String[] args)throws Exception{

         Configuration conf = new Configuration();

        

         String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();

        

         if (otherArgs.length != 2){

                   System.err.println("Usage:wordcount <int><out>");

                   System.exit(2);

         }

        

         Job job = new Job(conf,"word count");

         job.setJarByClass(WordCount.class);

         job.setMapperClass(TokenizerMapper.class);

         job.setCombinerClass(IntSumReducer.class);

         job.setReducerClass(IntSumReducer.class);

         job.setOutputKeyClass(Text.class);

         job.setOutputValueClass(IntWritable.class);

        

         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

         System.exit(job.waitForCompletion(true)?0:1);

        

        

}

}

这里面的遇到的问题第一个是GenericOptionsParser总报找不到,然后自动添加也无法添加。上网查了下,原来得需要一个commons-cli-1.2.jarJar包,将其找到(可以在Hadoop里搜一下,一般在Build目录下),然后添加到工程里就可以了。添加的方法是点击这个错误下面会有配置,弹出的对话框中添加额外的JAR”,找到路径就可以了。

然后又报

“The method setCombinerClass(Class<? extends Reducer>) in the type Job is not applicable for the argu”这个错误,网上的资料说得好,看一下“你map的输出和reduce的输入是不是对应”,也就是说,你的Reducer是否是正确的,回头一看,没Import相关的包,导致Reducer本身就是错的。引入后就好了。

然后在下面FileOutputFormat.setOutputPath时候报下面的错误。

“The method setOutputPath(JobConf, Path) in the type FileOutputFormat is not applicable for the argum”这个找了会子,还是在网上有人说,是不是引入的Jar包老或者不对。仔细一对,果然,应该是lib.output.FileOutputFormat,改了后就OK了。所以在自动引用是一定要仔细看清当前有几个可引用的包,然后再点击引用。不要盲目的引用第一个。

运行啥都不出,就报一大堆错,主要是说在没有Main,按照网上的说法,点击工程右键,Run As,点击配置,出来一个对话框,在其中选择Java Application下面的WordCount,在ARguments里输入参数:

in  out

这里遇到了个邪乎的,原来死活没有这个东西,不知道后来为什么运行了两下错误后出来了这么个东西,最早是输入的:

hdfs://localhost:9000/user/hadoop/in hdfs://localhost:9000/user/hadoop/out

结果像原来直接操作Hadoop一样,报重连错误,后来才发现,已经测试过localhost是连接不上,改成IP地址,还是不行,可能是相关的文件夹的位置不对,这里也没有再细弄,直接按照in out来配置。报没有这个文件夹,在错误里按照位置生成in即可,如果再生成了out会像下面说得重复运行时的错误。

然后运行的时候儿,又报下面的错误:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

         at org.apache.hadoop.conf.Configuration

引起的原因是缺少 commons-logging.jar,这时候儿只要在项目引用添加新的库的Jar包引用就可以了。在commons-logging-1.0.4.jar(或者更新版本)。

它们都在hadoop-0.20.2/build/ivy/lib/Hadoop/common下面。

到这时候儿,基本上就可以运行起来,虽然会报下面的错误,但是基本的数据就出来。

Exception in thread "Thread-10"

java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpMe

这个错误的解决办法从网上查到,需要引用log4j高版本的Jar包和HttpClient相关的Jar包,这里把长得模样差不多的都添加到引用了。

再编译就完成OK了。如果报out已经存在,就得重新删除这个文件夹然后再运行就OK了。

16/03/07 04:28:48 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=

16/03/07 04:28:48 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).

16/03/07 04:28:48 INFO input.FileInputFormat: Total input paths to process : 2

16/03/07 04:28:48 INFO mapred.JobClient: Running job: job_local_0001

16/03/07 04:28:48 INFO input.FileInputFormat: Total input paths to process : 2

16/03/07 04:28:48 INFO mapred.MapTask: io.sort.mb = 100

16/03/07 04:28:48 INFO mapred.MapTask: data buffer = 79691776/99614720

16/03/07 04:28:48 INFO mapred.MapTask: record buffer = 262144/327680

16/03/07 04:28:48 INFO mapred.MapTask: Starting flush of map output

16/03/07 04:28:48 INFO mapred.MapTask: Finished spill 0

16/03/07 04:28:48 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting

16/03/07 04:28:48 INFO mapred.LocalJobRunner:

16/03/07 04:28:48 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.

16/03/07 04:28:48 INFO mapred.MapTask: io.sort.mb = 100

16/03/07 04:28:48 INFO mapred.MapTask: data buffer = 79691776/99614720

16/03/07 04:28:48 INFO mapred.MapTask: record buffer = 262144/327680

16/03/07 04:28:48 INFO mapred.MapTask: Starting flush of map output

16/03/07 04:28:48 INFO mapred.MapTask: Finished spill 0

16/03/07 04:28:48 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting

16/03/07 04:28:48 INFO mapred.LocalJobRunner:

16/03/07 04:28:48 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.

16/03/07 04:28:48 INFO mapred.LocalJobRunner:

16/03/07 04:28:48 INFO mapred.Merger: Merging 2 sorted segments

16/03/07 04:28:48 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 53 bytes

16/03/07 04:28:48 INFO mapred.LocalJobRunner:

16/03/07 04:28:48 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting

16/03/07 04:28:48 INFO mapred.LocalJobRunner:

16/03/07 04:28:48 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now

16/03/07 04:28:48 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to out

16/03/07 04:28:48 INFO mapred.LocalJobRunner: reduce > reduce

16/03/07 04:28:48 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.

16/03/07 04:28:49 INFO mapred.JobClient:  map 100% reduce 100%

16/03/07 04:28:49 INFO mapred.JobClient: Job complete: job_local_0001

16/03/07 04:28:49 INFO mapred.JobClient: Counters: 12

16/03/07 04:28:49 INFO mapred.JobClient:   FileSystemCounters

16/03/07 04:28:49 INFO mapred.JobClient:     FILE_BYTES_READ=39666

16/03/07 04:28:49 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=80936

16/03/07 04:28:49 INFO mapred.JobClient:   Map-Reduce Framework

16/03/07 04:28:49 INFO mapred.JobClient:     Reduce input groups=3

16/03/07 04:28:49 INFO mapred.JobClient:     Combine output records=4

16/03/07 04:28:49 INFO mapred.JobClient:     Map input records=2

16/03/07 04:28:49 INFO mapred.JobClient:     Reduce shuffle bytes=0

16/03/07 04:28:49 INFO mapred.JobClient:     Reduce output records=3

16/03/07 04:28:49 INFO mapred.JobClient:     Spilled Records=8

16/03/07 04:28:49 INFO mapred.JobClient:     Map output bytes=41

16/03/07 04:28:49 INFO mapred.JobClient:     Combine input records=4

16/03/07 04:28:49 INFO mapred.JobClient:     Map output records=4

16/03/07 04:28:49 INFO mapred.JobClient:     Reduce input records=4

这就是成功后的输出。不容易,其实最主要的还是上面说的,没有那个配置界面,后来运行了再次才出来的那个。

  评论这张
 
阅读(260)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017