入门Hadoop---MapReduce-API操做

一.环境html

  Hadoop部署环境:java

  Centos3.10.0-327.el7.x86_64git

  Hadoop2.6.5github

  Java1.8.0_221apache

  代码运行环境:服务器

  Windows 10app

  Hadoop 2.6.5eclipse

  Java11.0.2  oop

二.安装Hadoop-Eclipse-Pluginui

   在Eclipse中编译和运行Mapreduce程序,须要安装hadoop-eclipse-plugin,可下载Github上的 hadoop2x-eclipse-plugin 。

   下载后将release中的hadoop-eclipse-plugin-2.6.0.jar放在eclipse下面plugins目录下。

三.配置Hadoop-Plugin

  运行eclipse后,点击Window->Preferences在Hadoop Map/Reduce中填上计算机中安装的hadoop目录。

        

四.在Eclipse中操做HDFS中的文件

  咱们以前一直使用命令操做Hdfs,接下来再配置几步就能够在Eclipse中可视化操做啦。

      选择Window下面的Show View->Other... ,在弹出的框里面展开MapReduce Tools,选择Map/Reduce Locations点击Open。

  

 

   而后在弹出的栏目右键,点击New Hadoop location在弹出框General下面填上活跃的NameNode和端口号信息。

  

 

   

   配置好后,能够在左侧刷新便可看到HDFS文件(Tips:对HDFS不少操做后,插件不会自动帮咱们刷新内容,须要咱们手动刷新)

    

五.在Eclipse中建立MapReduce项目

   选择File->New->Project...  选择Map/Reduce Project ,选择Next,填写项目名称,这里我起名MapReduceFirstDemo。

   而后将服务器上的core-site.xml和hdfs-site.xml复制到项目根目录下,并在根目录下建立一个log4j.properties,填上以下内容:

  hadoop.root.logger=DEBUG, console
  log4j.rootLogger = DEBUG, console
  log4j.appender.console=org.apache.log4j.ConsoleAppender
  log4j.appender.console.target=System.out
  log4j.appender.console.layout=org.apache.log4j.PatternLayout
  log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

     在src中右键建立一个Package,起名MapReduceFirstPack,而后在MapReduceFirstPack下面建立一个WordCount类。大体结构以下图:

   

   将下面的代码复制到WordCount里面  

package MapRedoceFirstPack;

import java.io.IOException;
import java.util.Iterator;
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.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 void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Configuration conf=new Configuration();
        String[] otherArgs=(new GenericOptionsParser(conf, args)).getRemainingArgs();
        if(otherArgs.length<2) {
            System.err.println("Usage:wordcount");
            System.exit(2);
        }
        Job job=Job.getInstance(conf,"word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCount.TokenizerMapper.class);
        job.setCombinerClass(WordCount.IntSumReducer.class);
        job.setReducerClass(WordCount.IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        for(int i=0;i<otherArgs.length-1;++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length-1]));
        System.exit(job.waitForCompletion(true)?0:1);
        
    }
    
    
    private static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable>{
        public IntSumReducer() {}
        
        private IntWritable result=new IntWritable();
        public void reduce(Text key,Iterable<IntWritable> values,Reducer<Text,IntWritable,Text,IntWritable>.Context context) throws IOException,InterruptedException{
            int sum=0;
            IntWritable val;
            for(Iterator i$=values.iterator();i$.hasNext();sum+=val.get()) {
                val=(IntWritable)i$.next();
            }
            this.result.set(sum);
            context.write(key, this.result);
        }
    }
    
    public static class TokenizerMapper extends Mapper<Object,Text,Text,IntWritable>{
        private static final IntWritable one=new IntWritable(1);
        private Text word=new Text();
        public TokenizerMapper() {
            
        }
        public void map(Object key,Text value,Mapper<Object,Text,Text,IntWritable>.Context context) throws IOException,InterruptedException {
            StringTokenizer itr=new StringTokenizer(value.toString());
            while(itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
            
        }
        
        
    }

}

 六.在Eclipse中运行MapReduce项目

  在运行上述项目以前,咱们须要配置下运行参数。 在项目右键Run As->Run Configuration。 在弹出的框里面选择Java Applicaton下面的WordCount(Tips:若是没有WordCount,则双击Java Application就有了),在Arguments下面添加input output(Tips:表明了输入目录和输出目录,输入目录放要计算的内容,这个须要本身建立,输出目录必定不要建立,它会自动生成,不然会提示已存在此目录的错误),以下图:

   

  而后点击Run运行。

  运行完毕后,在左侧刷新,在output目录能够看到两个文件,_SUCCESS是标识文件,表明执行成功的意思。part-r-00000存放的执行结果。

 

 

 

另外推荐一篇不错的教程: http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

系列传送门

相关文章
相关标签/搜索