Hadoop学习总结(MapRdeuce的词频统计)

      MapRdeuce编程示例——词频统计

一、MapRdeuce的词频统计的过程

Hadoop学习总结(MapRdeuce的词频统计)_第1张图片

二、编程过程

1、Mapper 组件

WordcountMapper.java

package com.itcast.mrdemo;

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

import java.io.IOException;

/**
 * Map 需要指定四个泛型,用来限定输入和输出的 key 和 value 的类型
 *
 * hadoop 有自己的数据类型,不使用 java 的数据类型,对应的 java 类型名字后面 + Writable 就是 hadoop 类型
 * String 除外,String 对于的 hadoop 类型叫做 Text
 *  <2, "java">
 * */
public class WordcountMapper extends Mapper {
    //重写Ctrl+o
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        /**
         * 1、把一行字符串拆分成单词 "hello java"
         * 2、把单词、数字每一个按照 map 规定的格式输出
         */
        // 把 hadoop 类型转换为 java 类型(接收传入进来的一行文本,把数据类型转换为 String 类型)
        String line = value.toString();
        // 把字符串拆分为单词
        String[] words = line.split(" ");
        //使用 for 循环把单词数组胡每个单词输出
        for (String word : words){
            context.write(new Text(word), new IntWritable(1));
        }
    }
}

2、Reducer 组件

WordcountReducer.java

package com.itcast.mrdemo;

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

import java.io.IOException;

/**
 * Reduce 需要指定四个泛型,用来限定输入和输出的 key 和 value 的类型
 * 1、Map 的输出就是 Reduce 的输入
 * 2、Reduce 的输出是 <"java", 2>
 */
public class WordcountReducer extends Reducer {
    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable value : values){
            sum ++;
        }
        context.write(key,new IntWritable(sum));
    }
}

3、MapRdeuce 运行模式

MapRdeuce 程序的运行模式主要有两种

(1)本地运行模式

      在当前的开发环境模拟 MapRdeuce 执行环境,处理的数据及输出结果在本地操作系统WordcountDriver.java

package com.itcast.mrdemo;

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;

import java.io.IOException;

public class WordcountDriver{
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //通过 Job 来封装本次 MR 的相关信息
        Configuration conf = new Configuration();
        //System.setProperty("HADOOP_USER_NAME","root");
        //配置 MR 运行模式,使用 local 表示本地模式,可以省略
        conf.set("mapreduce.framework.name","local");
        Job job = Job.getInstance(conf);
        //指定 MR Job jar 包运行主类
        job.setJarByClass(WordcountDriver.class);
        //指定本次 MR 所有的 Mapper Reducer 类
        job.setMapperClass(WordcountMapper.class);
        job.setReducerClass(WordcountReducer.class);
        //设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        //设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //使用本地模式指定处理的数据所在的位置
        FileInputFormat.setInputPaths(job,"D:/homework2/Hadoop/mr/input");
        //使用本地模式指定处理完成之后的结果所保存的位置
        FileOutputFormat.setOutputPath(job, new Path("D:/homework2/Hadoop/mr/output"));
        //提交程序并且监控打印程序执行情况
        boolean res = job.waitForCompletion(true);
        //执行成功输出 0 ,不成功输出 1
        System.exit(res ? 0 : 1);
    }
}

运行结果为:

Hadoop学习总结(MapRdeuce的词频统计)_第2张图片

(2)集群运行模式

  • *在HDFS中创建文件

在HDFS中的/input目录下有word.txt文件,且文件中编写有内容(内容随意编写)

Hadoop学习总结(MapRdeuce的词频统计)_第3张图片

  • *对 WordcountDriver.java 修改

 修改WordcountDriver.java中的路径为HDFS上的路径

package com.itcast.mrdemo;

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;

import java.io.IOException;

public class WordcountDriver{
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //通过 Job 来封装本次 MR 的相关信息
        Configuration conf = new Configuration();
        //System.setProperty("HADOOP_USER_NAME","root");
        //配置 MR 运行模式,使用 local 表示本地模式,可以省略
        conf.set("mapreduce.framework.name","local");
        Job job = Job.getInstance(conf);
        //指定 MR Job jar 包运行主类
        job.setJarByClass(WordcountDriver.class);
        //指定本次 MR 所有的 Mapper Reducer 类
        job.setMapperClass(WordcountMapper.class);
        job.setReducerClass(WordcountReducer.class);
        //设置业务逻辑 Mapper 类的输出 key 和 value 的数据类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        //设置业务逻辑 Reducer 类的输出 key 和 value 的数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //使用本地模式指定处理的数据所在的位置
        FileInputFormat.setInputPaths(job,"/input");
        //使用本地模式指定处理完成之后的结果所保存的位置
        FileOutputFormat.setOutputPath(job, new Path("/output"));
        //提交程序并且监控打印程序执行情况
        boolean res = job.waitForCompletion(true);
        //执行成功输出 0 ,不成功输出 1
        System.exit(res ? 0 : 1);
    }
}
  • *对pom.xml添加内容

        
            org.slf4j
            slf4j-log4j12
            1.7.30
        
    
    
    
        org.apache.maven.plugins
        maven-compiler-plugin
        3.6.1
        
            1.8
            1.8
        
    
    
    
        maven-assembly-plugin
        
            
                jar-with-dependencies
            
        
        
            
                make-assembly
                package
                
                    single
                
            
        
    
    
    

 在这个位置进行添加

Hadoop学习总结(MapRdeuce的词频统计)_第4张图片

*在resources创建文件

在resources创建文件log4j.properties

Hadoop学习总结(MapRdeuce的词频统计)_第5张图片

添加以下内容

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

Hadoop学习总结(MapRdeuce的词频统计)_第6张图片

  • *打包成jar包

 双击,进行打包

Hadoop学习总结(MapRdeuce的词频统计)_第7张图片

 结果出现以下字段则打包成功

Hadoop学习总结(MapRdeuce的词频统计)_第8张图片

  • *上传到虚拟机的home目录下

右键打开

Hadoop学习总结(MapRdeuce的词频统计)_第9张图片

重命名为wc 

Hadoop学习总结(MapRdeuce的词频统计)_第10张图片

 随便复制到一个目录下

Hadoop学习总结(MapRdeuce的词频统计)_第11张图片

使用远程连接工具(Xshell或者SecurityCRT)进行上传

Hadoop学习总结(MapRdeuce的词频统计)_第12张图片

  • *进行集群运行

进入home目录

cd /home
ll

Hadoop学习总结(MapRdeuce的词频统计)_第13张图片

 在 WordcountDriver.java下复制路径

Hadoop学习总结(MapRdeuce的词频统计)_第14张图片

hadoop jar wc.jar com.itcast.mrdemo.WordcountDriver

运行结果 

Hadoop学习总结(MapRdeuce的词频统计)_第15张图片

  • *查看HDFS 集群

Hadoop学习总结(MapRdeuce的词频统计)_第16张图片

进行查看

Hadoop学习总结(MapRdeuce的词频统计)_第17张图片

      集群运行成功

4、运行前准备操作

现在目录下创建一个文本

Hadoop学习总结(MapRdeuce的词频统计)_第18张图片

编写内容(随意编写)

Hadoop学习总结(MapRdeuce的词频统计)_第19张图片

5、Error while running command to get file permissions : java.io.IOException: (null) entry in command string: null ls -F D:\homework2\Hadoop\mr\input\word.txt

出现以下错误

Hadoop学习总结(MapRdeuce的词频统计)_第20张图片

解决方法一

下载winutils.exe和hadoop.dll放到C:\Windows\System32

链接:https://pan.baidu.com/s/1XwwUD9j3YT2AJMUNHmyzhw 
提取码:q7i7

解决方法二

输入指定文本路径

然后运行

你可能感兴趣的:(学习)