eclipse+hadoop2.7.5的map-reduce的API的配置

1.环境配置:
a.将map reduce所需架包全部加载到eclipse下,
b.将
键:HADOOP_USER_NAME
值:hadoop
配置到系统环境中,需要重新启动。
c.将架包hadoop-eclipse-plugin-2.7.1.jar放入eclipse安装目录的plugin下。
下载winutils.exe将下载下的hadoop.dll和winutils.exe放到hadoop-2.7.5/bin下
下载地址
d.配置eclipse。windows–>pref..–>hadoop map/reduce–>在路径下添加hadoop-2.7.1的路径
e pre…–>show –>mapreduce tool—>点击小象–>配置ip和端口(9000)
这里写图片描述
f hadoop.tmp.dir :/tmp/hadoop-hadoop
将hadoop下的上传的文件夹的权限修改为777
hadoop fs -chmod 777 /wcin

2.Java代码进行操做
——————————-map类的API操作——————–

package www.oeacle.wc;

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;
/*
 * KEYIN:输入键的类型,者一行的开始的偏移量:long(每一行的第一个的字,位于第几个,就是此行的偏移量)
 * VALUEIN, 输入的值的类型。在这里当前行的内容,String
 * KEYOUT, 输出的键值对的类型,每一个单词,String
 * VALUEOUT,输出的值的类型,表示单词标记一个1,int
 * map干的事就是,将单词分隔出来,然后进行将每个单词标记1
 * map的数据要网路传输,所以需要序列化,实现接口Serializabler,
 * 但是这个方式的序列化太过冗余,所以Hadoop提供了自己的序列化方式
 * 序列化接口叫:Writable,并且常用数据类型帮你序列化了。
 * 常用数据烈性对应的序列化格式
 * byte--ByteWritable
 * short--ShortWirtable
 * int IntWirtable
 * long--同上
 * double--同上
 * String--Text
 * null--同上
 * 就String不一样
 * 
 */
public class WorldCountMap extends Mapper<LongWritable, Text, Text, IntWritable>{
    /**
     * 这个函数一行调用一次
     * LongWritable key;输入键,偏移量
     * Text value:输入的值,一行的内容
     * Context:是上下文的对象,用育传输map的处理结果,提供Write方法
     */
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        //1.取到一行的内容
        String line=value.toString();
        //2.切分
        String [] words=line.split(" ");
        //3.循环遍历打标记并发送
        for (String w : words) {
            context.write(new Text(w), new IntWritable(1));
        }
    }
}
-----------------------reduce类的API操作------------------------------
package www.oeacle.wc;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/*
 * reduce的输入其实是map的输出
 * 
 */
public class WordCoountReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
    /**
     * ruduce处理的最终结果保存在hdfs
     * 多久调用一次这个方法:一组调用一次方法
     * 啥是一组:把key相同一类就是一组
     * Text arg0:这一组的第一个key
     * Iterable<IntWritable> arg1,这一组所有key对应的value值封装在迭代器中
     * Iterable<IntWritable> arg1,上下文对象,也是传输作用,往hdfs进行写
     * 
     */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,
            Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        //1.定义一个求和变量
        int sum=0;
        //循环遍历迭代器进行求和
        for (IntWritable value : values) {
            sum+=value.get();
        }
        context.write(key,new IntWritable(sum));
    }
}
--------------------------------主函数的类--------------------
package www.oeacle.wc;

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 Driver {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //1.获取Configuration对象
        Configuration conf=new Configuration();
        //2.需要创建一个任务,启动一个job,一个程序就是一个作业
        Job job=Job.getInstance(conf);
        //3.设置job提交的jar包
        job.setJarByClass(Driver.class);//内部是一个反射机制
        //4.设置map和reduce对应的类
        job.setMapperClass(WorldCountMap.class);
        job.setReducerClass(WordCoountReduce.class);
        //5.设置map输出的键和值的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        //6.最终结果输出的值
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //7.指顶输入路径和输出路径
        FileInputFormat.addInputPath(job, new Path("/wcin"));//指定一个路径
        //最终输出路径要求不能存在,怕覆盖原始文件
        FileOutputFormat.setOutputPath(job, new Path("/wcout"));
//      job.submit();
        job.waitForCompletion(true);
    }

}

猜你喜欢

转载自blog.csdn.net/qq_33202508/article/details/78701022