zoukankan      html  css  js  c++  java
  • [b0012] Hadoop 版hello word mapreduce wordcount 运行(二)

    目的:

    学习Hadoop mapreduce 开发环境eclipse windows下的搭建

    环境:

    Winows 7 64 eclipse 直接连接hadoop运行的环境已经搭建好,结果输出到eclipse

    Hadoop2.6.4环境

    相关:

    [0004] Hadoop 版hello word mapreduce wordcount 运行

    [0011] windows 下 eclipse 开发 hdfs程序样例 (三)

    [0008] Windows 7 下 hadoop 2.6.4 eclipse 本地开发调试配置

    说明:

    这种方式的mapreduce不是在集群上跑。8080web查询不到。 

    程序是把hdfs上的数据下载到windows本地,执行程序,再将输出结果上传到hdfs。

    [遗留:待解决]

    1.新建项目

    1.1 新建项目、导入hadoop开发包

    详细参考

    [0007] windows 下 eclipse 开发 hdfs程序样例  1 新建项目

    1.2 可选,如果后续执行报错,回头执行这一步

    将hadoop下的一个源码包导入,参考 [0008]  Y.2.1.b步骤    ,如果还有其他问题 参考[0008]整个搭建过程涉及的设置。

    2 新建wordcount类

    代码如下

     1 package hdfs;
     2 
     3 import java.io.IOException;
     4 import java.util.*;
     5 
     6 import org.apache.hadoop.fs.Path;
     7 import org.apache.hadoop.conf.*;
     8 import org.apache.hadoop.io.*;
     9 import org.apache.hadoop.mapreduce.*;
    10 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    11 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    13 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    14 
    15 /**
    16  * 描述:WordCount explains by xxm
    17  * @author xxm
    18  */
    19 public class WordCount {
    20 
    21  /**
    22  * Map类:自己定义map方法
    23  */
    24  public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    25     /**
    26     * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类
    27     * 都能够被串行化从而便于在分布式环境中进行数据交换,可以将它们分别视为long,int,String 的替代品。
    28     */
    29     private final static IntWritable one = new IntWritable(1);
    30     private Text word = new Text();
    31     /**
    32     * Mapper类中的map方法:
    33     * protected void map(KEYIN key, VALUEIN value, Context context)
    34     * 映射一个单个的输入k/v对到一个中间的k/v对
    35     * Context类:收集Mapper输出的<k,v>对。
    36     */
    37     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    38         String line = value.toString();
    39         StringTokenizer tokenizer = new StringTokenizer(line);
    40         while (tokenizer.hasMoreTokens()) {
    41             word.set(tokenizer.nextToken());
    42             context.write(word, one);
    43         }
    44     }
    45  } 
    46 
    47  /**
    48  * Reduce类:自己定义reduce方法
    49  */       
    50  public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    51 
    52     /**
    53     * Reducer类中的reduce方法:
    54     * protected void reduce(KEYIN key, Interable<VALUEIN> value, Context context)
    55     * 映射一个单个的输入k/v对到一个中间的k/v对
    56     * Context类:收集Reducer输出的<k,v>对。
    57     */
    58     public void reduce(Text key, Iterable<IntWritable> values, Context context) 
    59       throws IOException, InterruptedException {
    60         int sum = 0;
    61         for (IntWritable val : values) {
    62             sum += val.get();
    63         }
    64         context.write(key, new IntWritable(sum));
    65     }
    66  }
    67 
    68  /**
    69  * main主函数
    70  */       
    71  public static void main(String[] args) throws Exception {
    72 
    73     Configuration conf = new Configuration();//创建一个配置对象,用来实现所有配置
    74 //    conf.set("fs.defaultFS", "hdfs://ssmaster:9000/");
    75     
    76     Job job = new Job(conf, "wordcount");//新建一个job,并定义名称
    77 
    78     job.setOutputKeyClass(Text.class);//为job的输出数据设置Key类
    79     job.setOutputValueClass(IntWritable.class);//为job输出设置value类
    80     
    81     job.setMapperClass(Map.class); //为job设置Mapper类
    82     job.setReducerClass(Reduce.class);//为job设置Reduce类
    83     job.setJarByClass(WordCount.class);
    84 
    85     job.setInputFormatClass(TextInputFormat.class);//为map-reduce任务设置InputFormat实现类
    86     job.setOutputFormatClass(TextOutputFormat.class);//为map-reduce任务设置OutputFormat实现类
    87 
    88     FileInputFormat.addInputPath(job, new Path(args[0]));//为map-reduce job设置输入路径
    89     FileOutputFormat.setOutputPath(job, new Path(args[1]));//为map-reduce job设置输出路径
    90     job.waitForCompletion(true); //运行一个job,并等待其结束
    91  }
    92 
    93 }
    View Code

    3 执行

    eclipse指定 输入输出,执行 ,可以参考[0008] 4.3,4.4执行过程

    hdfs://ssmaster:9000/input
    hdfs://ssmaster:9000/output

    正常控制台的输出结果,和在linux上 hadoop jar执行的输出结果一致。

    其他:

    可以在eclipse中直接导出成jar,指定main入口, 上传到hadoop linux服务器上,执行hadoop jar xxxx.jar   /input /output

    总结:

     最好的eclipse开发调试方式。  没问题了就打包导出、上传到真实服务器。

  • 相关阅读:
    程序人生2008年(49)
    多种方式实现字符串/无符号数反向输出_栈_递归_头尾指针
    Ebusiness suite system service management ( EBS服务管理)
    文件系统FatFsR0.09a翻译(三):ff.h
    cocurrent request,program,process 并发请求,程序,进程的概念
    Laravel 5.* 执行seeder命令出现错误的解决方法
    Laravel修改配置后一定要清理缓存 "php artisan config:clear"!
    laravel构造函数和中间件执行顺序问题
    Laravel5.3使用学习笔记中间件
    laravel 是怎么做到运行 composer dumpautoload 不清空 classmap 映射关系的呢?
  • 原文地址:https://www.cnblogs.com/sunzebo/p/5996123.html
Copyright © 2011-2022 走看看