wordCount功能实现

    说来惭愧,从学习到完成wordCount这个程序,差不多用了三天的时间。一方面是在学习的过程中总是遇见这样那样要处理的事情,二是自己的学习知识和解决问题的能力需要提高。我是跟着吴超老师的视频学的,但是应用的环境不一样,我是在hadoop2.4.0环境中应用的。hadoop2.x和hadoop1.x还是有许多差别的。
    在遇到问题的时候我总是绕老绕去,但最终还是要面对。在以后的学习过程中一定要暗示自己遇到问题时少绕圈子,直面问题。言归正传,谈一下这几天我在学习的过程中遇到的问题吧。

    1. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  
在hadoop2.4.0中确实没有winutils.exe 这个文件,我就疯狂的百度,找到了一个解决方法,就是在程序中添加几行代码:

点击(此处)折叠或打开

  1. File workaround = new File(".");
  2.      System.getProperties().put("hadoop.home.dir", workaround.getAbsolutePath());
  3.      new File("./bin").mkdirs();
  4.      new File("./bin/winutils.exe").createNewFile();
     伪造出winutils.exe出这个文件,确实,错误没有了。但是真的解决了吗?(刚刚验证了一下,在其他地方都配置好的前提下,把真实存在的winutils.exe删掉,用这行代码代替,程序也是可以完成        的,那 winutils.exe的作用是什么呢?)

   2. hadoop Cannot run program "cygpath": CreateProcess error=2, ?????????
   这是一个搞笑的问题,为什么这么说呢?吴超老师的视频上因为出现文件权限问题,导入了一个程序包,我也跟着导入了。这是搞笑之一,因为我的程序并没有出现权限问题,那我为什么还要导入这个程序包呢,怪我墨守成规。导入之后就一直提示这个问题,然后我就百度,百度上也有一些类似的问题,给出的答案是安装一个cygwin,配置下环境,然后问题就解决了。这是搞笑之二,出现这个问题,我没有思考就直接百度,纠结了太长时间,就想找个最佳答案,网上有步骤,比如装个cygwin,我也没有试试。最后我终于安装了cygwin,配置好环境,然而问题并没有解决,网上说这些做好就成功了额。饶了这么久,我终于想起要看问题提示的代码了,问题代码的核心竟是之前导入的那个程序包中的,这还有什么好说的。我把导入的程序包删除了,果然没了这个提示,但是,又出现了新的问题。

  3. java.lang.ClassCastException: org.apache.hadoop.conf.Configuration cannot be cast to org.apache.hadoop.mapred.JobConf
    
 前面的问题算是环境问题,这个问题是代码问题,而且正是解决我这些谜团的引子。
  因为在编写wordCount这个程序时有 文件输入这个过程,而且是必须的过程。老师所讲的视频中是通过这行代码实现的 FileInputFormat.setInputPaths(job, IN_PATH)。而我敲出了这样的代码FileInputFormat.setInputPaths((JobConf)conf, IN_PATH); 这两行代码看起来就只有第一个参数不一样,我就认为是hadoop2.x和hadoop1.x中源码的差别,就这样敲了下去,大错特错额。
解决这个问题,我就把 FileInputFormat.setInputPaths((JobConf)conf, IN_PATH)改成了FileInputFormat.setInputPaths(new JobConf(conf), IN_PATH);接着第四个问题出来了

    4.  java.io.IOException: No input paths specified in job
 这明明就是文件输入的代码,为什么提示没有输入呢。这时我想到了是不是我导入的类不对,便抓紧看了视频核对一样,果然,我导入的包不对。正确的应该导入入org.apache.hadoop.mapreduce.lib.input.FileInputFormat这个类,而我却导入了org.apache.hadoop.mapred.FileInputFormat这个类。这两个类的方法名一样误导了我,参数的不同我凭“经验”误认为是版本差异,哎,这是有多坑。

   5. org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 
    出现了这个问题,还是百度,有几篇博客上说的 把hadoop.dll和winutils.exe放入到windows下hadoop的bin目录下,配置下环境变量便成功了 。 我便下载了hadoop2.2版本中的这两个文件,重启eclipse,可是并没有成功,又试了几次,还是失败。这时候我在咒怨这些博客,说的啥啊,准都不准。纠结了一会,又下载了个hadoop2.6版本的,重启eclipse,程序竟然运行了,我真是太棒了。

    6.将文件中一行中的每个单词分开
  运行结果出来后我脸瞬间黑了,并没有实现统计每个单词个数的功能,而是把每一行当做一个单词来处理。我检查了好多遍,越检查越着急。到底为什么呢。原来是分割问题。这是所写的分割单词的代码:String[] split = value.toString().split("\t");但在用vi编辑文件时,两个单词之间的间隔是空格,并不是敲的tab键。将代码改为 String[] split = value.toString().split(" ") ;运行,单词统计数目出来了。

    将所敲的代码记录下来,方面以后的学习。
 MyMapper.java

点击(此处)折叠或打开

  1. public class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
  2.     protected void map(LongWritable key, Text value, Context context)
  3.             throws IOException, InterruptedException {
  4.         String[] split = value.toString().split(" ");
  5.         System.out.println("the splist size is "+split.length );
  6.         for (String word : split) {
  7.             System.out.println("the word is "+word);
  8.             context.write(new Text(word), new LongWritable(1L));
  9.         }

  10.     }

  11. }
MyReaducer.java

点击(此处)折叠或打开

  1. public class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
  2.     protected void reduce(Text k2, Iterable<LongWritable> v2s, Context context)
  3.             throws IOException, InterruptedException {
  4.         Long sum = 0L;
  5.         for (LongWritable v2 : v2s) {
  6.             sum+=v2.get();
  7.         }
  8.         context.write( k2, new LongWritable(sum));
  9.     }

  10. }
WordCount.java

点击(此处)折叠或打开

  1. public class WordCount {
  2.     
  3.     static String IN_PATH = "hdfs://192.168.15.100:9000/test";
  4.     static String OUT_PATH = "hdfs://192.168.15.100:9000/test1";
  5.     public static void main(String[] args) throws Exception {
  6.         // TODO Auto-generated method stub
  7.         
  8.          /*File workaround = new File(".");
  9.      System.getProperties().put("hadoop.home.dir", workaround.getAbsolutePath());
  10.      new File("./bin").mkdirs();
  11.      new File("./bin/winutils.exe").createNewFile();*/
  12.         Configuration conf = new Configuration();
  13.         /*JobConf jobConf = new JobConf(conf);*/
  14.         Job job = new Job(conf,WordCount.class.getSimpleName());
  15.         
  16.         //文件输入
  17.         org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPaths(job, IN_PATH);
  18.     //    FileInputFormat.setInputPaths(new JobConf(conf), IN_PATH);
  19.         //指定对输入数据进行格式化管理的类
  20.         job.setInputFormatClass(TextInputFormat.class);
  21.         
  22.         //指定自定义的Maper类
  23.         job.setMapperClass(MyMapper.class);
  24.         
  25.         //指定map的key、value输出类型
  26.         job.setMapOutputKeyClass(Text.class);
  27.         job.setMapOutputValueClass(LongWritable.class);
  28.         
  29.         //分区
  30.         job.setPartitionerClass(org.apache.hadoop.mapreduce.lib.partition.HashPartitioner.class);
  31.         job.setNumReduceTasks(1);
  32.         
  33.         //指定自定义的reducer类
  34.         job.setReducerClass(MyReducer.class);
  35.         
  36.         //指定reducer的输出类型
  37.         job.setOutputKeyClass(Text.class);
  38.         job.setOutputValueClass(LongWritable.class);
  39.         
  40.         //指定输出的路径
  41.         FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
  42.         //指定输出的格式化类
  43.         job.setOutputFormatClass(TextOutputFormat.class);
  44.         
  45.         //提交任务
  46.         job.waitForCompletion(true);
  47.         // System.exit(job.waitForCompletion(true) ? 0:1);
  48.         

  49.     }





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29876573/viewspace-1814318/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29876573/viewspace-1814318/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值