初学MapReduce离线计算(eclipse实现)

一、导入jia包

需要导入common,hdfs以及mapreduce下的所有jar包

二、代码实现诗词出现字数统计

先在桌面上创建一个文本文档(明月几时有.txt),内容为一首诗词

在eclipse新建三个类:WordCountMapper、WordCountReducer、WordCountDriver。

在我们用MAPREDUCE编程的时候 MAPREDUCE有一套自己的数据类型
字符串 Text 提供Java的数据类型可以和MapReduce的类型做一个数据转换
整数 IntWritable ShortWritable LongWritbale
浮点数 FloatWritable DoubleWritable
字符串类型 Text Text.toString转换为字符串 new Text("") 把字符串转换为Text
整数类型 IntWritable get() 转换为int new IntWritable(1) 把Java类型转换为MapReduce的类型

WordCountMapper类:

Map类会输出成一个文件 temp.html
Map类 规范 必须得 继承Mapper类 并且重写mapper方法

Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>:
KEYIN :表示我们当前读取一个文件[xxx.txt] 读到多少个字节了 数量词
VALUEIN :表示我们当前读的是文件的多少行 逐行读取 表示我们读取的一行文字
KEYOUT: 我们执行MAPPER之后 写入到文件中KEY的类型
VALUEOUT :我们执行MAPPER之后 写入到文件中VALUE的类型

package com.blb.core;

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


    protected void map(LongWritable key,Text value,Mapper<LongWritable,Text,Text,IntWritable>.Context context) throws IOException, InterruptedException
    {
        String replace = value.toString().replace(" ", "");
        char[] array=replace.toCharArray();
        for (char c : array) {
            context.write(new Text(c+""), new IntWritable(1));
        }

    }



}

Mapper阶段 产生一个临时文件
Reduce 读取Mapper生成的那个临时文件

WordCountReducer类:

Reduce类 规范 必须得 继承Reducer类 并且重写Reducer方法
Reducer会把我们Mapper执行后的那个临时文件 作为他的输入,使用之后会把这个临时文件给删除掉

Reducer<Text,IntWritable, Text,IntWritable>:
KEYIN Text
VALUEIN IntWritbale
KEYOUT Text :我们Reduce之后 这个文件中内容的 Key是什么
VALUEOUT IntWritable :这个文件中内容Value是什么

package com.blb.core;

import java.io.IOException;

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

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

    @Override
    protected void reduce(Text key,Iterable<IntWritable> values,Reducer<Text,IntWritable,Text,IntWritable>.Context context) throws IOException, InterruptedException
    {
        int sum=0;
        for(IntWritable value:values)
        {
            sum+=value.get();
        }
        context.write(key, new IntWritable(sum));
    }

}

WordCountDriver类:

Driver这个类 用来执行一个任务 Job
任务=Mapper+Reduce+HDFS把他们3者 关联起来

package com.blb.core;

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[] args) {
        Configuration conf=new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.0.32:9000");
        try {
            Job job=Job.getInstance(conf);
            job.setJarByClass(WordCountDriver.class);  //要给当前的任务取一个名称

            job.setMapperClass(WordCountMapper.class);    //我当前的任务的Mapper类是谁
            job.setMapOutputKeyClass(Text.class);      //我们Mapper任务输出的文件的Key值类型
            job.setMapOutputValueClass(IntWritable.class); //我们Mapper任务输出的文件的Value值类型

            job.setReducerClass(WordCountReducer.class);  //我们当前任务的Reducer类是谁
            job.setOutputKeyClass(Text.class);        //我们Reducer任务输出的文件的Key值类型
            job.setOutputValueClass(IntWritable.class);  //我们Reducer任务输出的文件的Value值类型

            FileInputFormat.setInputPaths(job,new Path("/words"));  

        //关联我们HDFS文件 HDFS文件的绝对路径
        //输入的路径是文件夹 把这个文件夹下面的所有文件 都执行一遍

            FileOutputFormat.setOutputPath(job, new Path("/out"));

        //最终要有一个结果 我最终计算完成生成的结果存放在HDFS上的哪里
        //Mapper执行的后的结果是一个临时文件 这个文件存放在本地
        //Reducer执行后的结果自动的上传到HDFS之上 并且还会把Mapper执行后的结果给删除掉

            job.waitForCompletion(true);  //我们关联完毕后  我们要执行了
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

三、执行

写完之后,将程序导出成jar包:WordCount.jar

1、在hdfs上新建文件夹words

hadoop fs -mkdir /words

2、将要计算的文件(明月几时有.txt)上传到hdfs上。

先rz上传到linux上,再用命令hadoop fs -put 明月几时有.txt  /words

3、将jar包上传到linux上。

4、开启服务

start-all.sh

5、运行jar包(hadoop jar jar包名称 主类[带main方法的那个类])

hadoop jar WordCount.jar  com.blb.core.WordCountDriver

最后成功后会在hdfs的/out目录下生成最终的结果的文件part-r-00000

可以将文件下载下来查看

posted @ 2020-03-04 15:20  羊想蓝天  阅读(488)  评论(0编辑  收藏  举报