使用ecplise开发MapReduce

Posted zhan98

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ecplise开发MapReduce相关的知识,希望对你有一定的参考价值。

一、环境准备

  1.添加插件到eclipse plugins目录下就可以了

技术图片

  2.把Window编译后的hadoop的文件放到 hadoop的bin目录下

  技术图片

  3.配置环境变量

  HADOOP_HOME=E:hadoophadoop-2.7.7

  Path=%HADOOP_HOME%in;%HADOOP_HOME%sbin

  4.在eclipse中添加hadoop   Window >> Preferences

  技术图片

  若是找不到Hadoop Map/Reduce  删除eclipse安装目录configuration文件中的org.eclipse.update文件夹,重启eclipse即可。

  5.切换到Map/Reduce视图  >>Window->Show View->Other->MapReduce Tools,双击打开

  技术图片

  6.建立链接

  技术图片

  7.准备数据集  设置为utf-8格式 >> 打开文件 >> 另存为 >> 编码utf-8

技术图片

  8.hadoop-2.7.7sharehadoop 中的common、hdfs、mapreduce、yarn中的jar包导入到项目的lib目录

二、新建Map/Reduce项目

  new >> other >> Map/Reduce Project

  技术图片

  

三、代码

  1.WordCountMapper类

package hdfs;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
            throws IOException, InterruptedException {
        //从文本中读出一行
        String line = value.toString();
        //将这一行字符串变成字符数组
        char[] charArray = line.toCharArray();
        //遍历每一个字符
        for(char a:charArray) {
            //将字符以  字符   1   的格式一行行输出到临时文件中
            context.write(new Text(a+""), new IntWritable(1));
                        //注:MapReduce中有自己的数据类型,需进行转换
        }
    }
}

  2.WordCountReduce类

package hdfs;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable>{

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,
            Reducer<Text, IntWritable, Text, IntWritable>.Context content) throws IOException, InterruptedException {
        //设计一个变量统计总数
        int num = 0;
        //遍历数据中整数部分
        for(IntWritable v:values) {
            //get()获得int类型的整数,然后累加
            num += v.get();
        }
        //以  字符  总数   的格式输出到指定文件夹
        content.write(key, new IntWritable(num));
    }
}

  3.WordCountDriver类

package hdfs;

import java.io.IOException;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountDriver{
    public static void main(String[] arge) {
        //配置访问地址
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.124.26:9000");
        try {
            //获得job任务对象
            Job job = Job.getInstance(conf);
            //设置driver类
            job.setJarByClass(WordCountDriver.class);
            //设置Map类
            job.setMapperClass(WordCountMapper.class);
            //设置Map类输出的key数据的格式类
            job.setMapOutputKeyClass(Text.class);
            //设置Map类输出的value数据的格式类
            job.setMapOutputValueClass(IntWritable.class);
            //设置Reduce类  如果Reduce类输出格式类与Map类的相同,可不写
            job.setReducerClass(WordCountReduce.class);
            //设置Map类输出的key数据的格式类
            job.setOutputKeyClass(Text.class);
            //设置Map类输出的value数据的格式类
            job.setOutputValueClass(IntWritable.class);
            //设置被统计的文件的地址
            FileInputFormat.setInputPaths(job, new Path("/in/poetry.txt"));
            //设置统计得到的数据文件的存放地址
            //注:文件所在的文件夹需不存在,由系统创建
            FileOutputFormat.setOutputPath(job, new Path("/out/"));
            //true表示将运行进度等信息及时输出给用户,false的话只是等待作业结束
            job.waitForCompletion(true);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  4.权限问题:

    1)关闭访问权限#core-site.xml 

       <property>  
        <name>dfs.permissions</name>
        <value>false</value>
      </property>

    2)授权 hadoop fs -chmod 777 文件路径

  5.结果显示

  技术图片

 

以上是关于使用ecplise开发MapReduce的主要内容,如果未能解决你的问题,请参考以下文章

更新Hadoop代码结构及载入Ecplise方法

Eclipse远程提交MapReduce任务到Hadoop集群

Eclipse远程提交MapReduce任务到Hadoop集群

黑科技:通过 Google Java Style 文件配置 IDEA 和 Ecplise 代码风格

ecplise 使用技巧

Ecplise项目转移到Android Studio,以及Genymotion模拟器介绍