`

MapReduce

阅读更多
WordCount
统计文本单词的数量
源文件内容:
word.txt
hello world
hello hadoop
hello 1606
hello world

一、Map 处理

1.在 hdfs 上新增 path -- wordCount , 上传 word.txt

选中 hadoop 连接 --> 右键 -->
新增path :create new dictory
上传文件 :upload file

2.新建 MapReduce 工程



3.新增 Mapper.java

package com.study.wordcount.day01;

import java.io.IOException;

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,LongWritable, Text> {

	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, LongWritable, Text>.Context context)
			throws IOException, InterruptedException {
		context.write(key, value);
	}
}



4.新增 WordCountDriver

package com.study.wordcount.day01;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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) throws IOException, ClassNotFoundException, InterruptedException {

		Configuration conf = new Configuration();
		
		Job job = Job.getInstance(conf);
		// 设置Job运行的类
		job.setJarByClass(WordCountDriver.class);
		
		job.setMapperClass(WordCountMapper.class);
		// 设置Mappre 组件输出的KEY的类型
		job.setMapOutputKeyClass(LongWritable.class);
		job.setMapOutputValueClass(Text.class);
		
		
		FileInputFormat.setInputPaths(job, new Path("/wordCount/words.txt"));
		FileOutputFormat.setOutputPath(job, new Path("/wordCount/result"));
	
		job.waitForCompletion(true);
	}

}




5.导出 jar 包

export --> jar file -->




不勾选配置文件




选择运行入口


6.上传文件到 linux 上

7.运行

hadoop jar wordCount.java

8.运行结果



9.异常处理




解决:
hdfs-site.xml 与 core-site.xml 中 需要配置数据路径且需要一致

http://blog.sina.com.cn/s/blog_61d8d9640102whof.html

10.结果分析

Path : wordCount/result 中生成的文件

0 hello world
13 hello hadoop
27 hello 1606
39 hello world

相比与源文件,多了一行 key 值,key 是字符串的偏移量
对应Map 的 key 与 value 的格式,key 是 LongWritable 类型 ,value 是 Text 类型

二、Reducer

1.未统计单词数量,欲将输出结果改为

hello world 1
hello hadoop 1
hello 1606 1
hello world 1

即:将原来的value 作为 key ,也就是单词作为 key 处理

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();
		String [] datas = line.split(" ");
		for(String word : datas){
			context.write(new Text(word), new IntWritable(1));
		}
	}
}


		Configuration conf = new Configuration();
		
		Job job = Job.getInstance(conf);
		// 设置Job运行的类
		job.setJarByClass(WordCountDriver.class);
		
		job.setMapperClass(WordCountMapper.class);
		// 设置Mappre 组件输出的KEY的类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		
		
		FileInputFormat.setInputPaths(job, new Path("/wordCount/words.txt"));
		FileOutputFormat.setOutputPath(job, new Path("/wordCount/result1"));
	
		job.waitForCompletion(true);



修改 Key 与value的类型,并修改输出路径,否则,报错:路径已存在的异常

2.
导出 jar 包 、 上传 jar 包并运行 hadoop jar wordCount.jar

再次处理后的结果为:

1606 1
hadoop 1
hello 1
hello 1
hello 1
hello 1
world 1
world 1




3.添加 reducer 处理

package com.study.wordcount.day01;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
 * 
 * Map组件可独立运行,Reducer组件需在Map基础上运行
 * 
 * 独立运行 Map ,结果为 Map 组件输出结果
 * 添加reducer 后,结果 reducer 处理的结果
 *
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, Text> {

	@Override
	protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, Text>.Context context)
			throws IOException, InterruptedException {
		StringBuilder sb = new StringBuilder();
		for(IntWritable intw : values){
			sb.append(",").append(intw.get());
		}
		context.write(key, new Text(sb.toString()));
		
	}
}




public class WordCountDriver {

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

		Configuration conf = new Configuration();
		
		Job job = Job.getInstance(conf);
		// 设置Job运行的类
		job.setJarByClass(WordCountDriver.class);
		job.setMapperClass(WordCountMapper.class);
		job.setReducerClass(WordCountReducer.class);
		
		// 设置Mappre 组件输出的KEY的类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		
		// 设置 reducer 的key 与 value 
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		FileInputFormat.setInputPaths(job, new Path("/wordCount/words.txt"));
		FileOutputFormat.setOutputPath(job, new Path("/wordCount/result2"));
	
		job.waitForCompletion(true);
	}

}


导出 jar 包 ,上传 并 运行

reducer 处理结果为:

1606 ,1
hadoop ,1
hello ,1,1,1,1
world ,1,1

即:reducer 将 mapper 中相同的 key 的value进行了合并

4.统计单词数量

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

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


public class WordCountDriver {

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

		Configuration conf = new Configuration();
		
		Job job = Job.getInstance(conf);
		// 设置Job运行的类
		job.setJarByClass(WordCountDriver.class);
		job.setMapperClass(WordCountMapper.class);
		job.setReducerClass(WordCountReducer.class);
		
		// 设置Mappre 组件输出的KEY的类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		
		// 设置 reducer 的key 与 value 
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.76.131:9000/wordCount/words.txt"));
		FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.76.131:9000/wordCount/result3"));
	
		job.waitForCompletion(true);
	}

}



配置文件 log4j.properties

###\u8BBE\u7F6E ###
log4j.rootLogger = info,stdout
###\u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n



右键,选择 WordCountDriver
run as hadoop
无需上传 jar包 ,在本地客户端运行

运行结果:

1606 1
hadoop 1
hello 4
world 2


三、总结

Map:
将 TXT 中的文件按照 key 与 value 的格式输出

Reduce
将 Map 传递过来的数据,按照 key 值相同,进行 value 数据的整合

Mapper.java 中  value 的 类型 与
Reducer.java 中 value 的类型 要对应
  • 大小: 17.5 KB
分享到:
评论

相关推荐

    实验项目 MapReduce 编程

    实验项目“MapReduce 编程”旨在让学生深入理解并熟练运用MapReduce编程模型,这是大数据处理领域中的核心技术之一。实验内容涵盖了从启动全分布模式的Hadoop集群到编写、运行和分析MapReduce应用程序的全过程。 ...

    基于MapReduce实现决策树算法

    基于MapReduce实现决策树算法的知识点 基于MapReduce实现决策树算法是一种使用MapReduce框架来实现决策树算法的方法。在这个方法中,主要使用Mapper和Reducer来实现决策树算法的计算。下面是基于MapReduce实现决策...

    学生mapreduce成绩分析

    MapReduce是一种分布式计算模型,由Google在2004年提出,主要用于处理和生成大规模数据集。这个模型将复杂的计算任务分解成两个主要阶段:Map(映射)和Reduce(化简),使得在大规模分布式环境下处理大数据变得可能...

    Hadoop mapreduce实现wordcount

    【标题】Hadoop MapReduce 实现 WordCount MapReduce 是 Apache Hadoop 的核心组件之一,它为大数据处理提供了一个分布式计算框架。WordCount 是 MapReduce 框架中经典的入门示例,它统计文本文件中每个单词出现的...

    大数据实验四-MapReduce编程实践

    ### 大数据实验四-MapReduce编程实践 #### 一、实验内容与目的 ##### 实验内容概述 本次实验的主要内容是使用MapReduce框架来实现WordCount词频统计功能,即统计HDFS(Hadoop Distributed File System)系统中多个...

    【MapReduce篇07】MapReduce之数据清洗ETL1

    MapReduce之数据清洗ETL详解 MapReduce是一种基于Hadoop的分布式计算框架,广泛应用于大数据处理领域。数据清洗(Data Cleaning)是数据处理过程中非常重要的一步,旨在清洁和转换原始数据,使其更加可靠和有用。...

    MapReduce实例分析:单词计数

    单词计数是最简单也是最能体现 MapReduce 思想的程序之一,可以称为 MapReduce 版“Hello World”。单词计数的主要功能是统计一系列文本文件中每个单词出现的次数。本节通过单词计数实例来阐述采用 MapReduce 解决...

    基于MapReduce的Apriori算法代码

    基于MapReduce的Apriori算法代码 基于MapReduce的Apriori算法代码是一个使用Hadoop MapReduce框架实现的关联规则挖掘算法,称为Apriori算法。Apriori算法是一种经典的关联规则挖掘算法,用于发现事务数据库中频繁...

    大数据 hadoop mapreduce 词频统计

    【大数据Hadoop MapReduce词频统计】 大数据处理是现代信息技术领域的一个重要概念,它涉及到海量数据的存储、管理和分析。Hadoop是Apache软件基金会开发的一个开源框架,专门用于处理和存储大规模数据集。Hadoop的...

    Hadoop原理与技术MapReduce实验

    (2)打开网站localhost:8088和localhost:50070,查看MapReduce任务启动情况 (3)写wordcount代码并把代码生成jar包 (4)运行命令 (1):把linus下的文件放到hdfs上 (2):运行MapReduce (5):查看运行结果 ...

    mapreduce项目 数据清洗

    MapReduce是一种分布式计算模型,由Google在2004年提出,主要用于处理和生成大规模数据集。它将复杂的并行计算任务分解成两个主要阶段:Map(映射)和Reduce(化简)。在这个"MapReduce项目 数据清洗"中,我们将探讨...

    Hadoop之MapReduce编程实例完整源码

    一个自己写的Hadoop MapReduce实例源码,网上看到不少网友在学习MapReduce编程,但是除了wordcount范例外实例比较少,故上传自己的一个。包含完整实例源码,编译配置文件,测试数据,可执行jar文件,执行脚本及操作...

    MapReduce求行平均值--MapReduce案例

    在大数据处理领域,MapReduce是一种广泛使用的分布式计算框架,由Google提出并被Hadoop采纳为标准组件。本案例主要探讨如何使用MapReduce来求取数据集的行平均值,这在数据分析、数据挖掘以及日志分析等场景中非常...

    MapReduce基础.pdf

    ### MapReduce基础知识详解 #### 一、MapReduce概述 **MapReduce** 是一种编程模型,最初由Google提出并在Hadoop中实现,用于处理大规模数据集的分布式计算问题。该模型的核心思想是将复杂的大型计算任务分解成较...

    大数据实验5实验报告:MapReduce 初级编程实践

    【MapReduce初级编程实践】是大数据处理中的一项基础任务,主要应用于大规模数据集的并行计算。在这个实验中,我们关注的是如何利用MapReduce来实现文件的合并与去重操作。MapReduce是一种分布式计算模型,由Google...

    hadoop-mapreduce-client-jobclient-2.6.5-API文档-中文版.zip

    赠送jar包:hadoop-mapreduce-client-jobclient-2.6.5.jar; 赠送原API文档:hadoop-mapreduce-client-jobclient-2.6.5-javadoc.jar; 赠送源代码:hadoop-mapreduce-client-jobclient-2.6.5-sources.jar; 赠送...

    MapReduce: Simplified Data Processing on Large Clusters中文版

    MapReduce 编程模型简介 MapReduce 是一种编程模型,由 Jeffrey Dean 和 Sanjay Ghemawat 于 2004 年提出,用于处理大规模数据集的分布式计算。该模型将计算任务分解成两个主要阶段:Map 和 Reduce。Map 阶段将...

    基于javaweb + mapreduce的小型电影推荐系统

    【标题】"基于javaweb + mapreduce的小型电影推荐系统"揭示了这个项目的核心技术栈,即Java Web和MapReduce。在这个系统中,Java Web技术用于构建前端用户界面和后端服务器逻辑,而MapReduce则被用作大数据处理框架...

Global site tag (gtag.js) - Google Analytics