`

MapReduce(3)

阅读更多
一、Mapper分区数量

1.Mapper 分区数量 = 文件大小 / 128M

2.输出结果数量 = Reducer 的数量

二、设置 Reducer 数量

计算每月利润总和

源文件:
1 280
1 560
2 234
2 264
3 873
3 2323

/*
 * 1.Map任务的数量问题,Map任务取决切面的数量,Spilts。切片里封装了处理的数据长度以及处理数据位置所在信息。
 * 2.切片的数量取决于:文件总大小/BlockSize =128MB
 * 假如一个文件是129MB>128MB,最后是2个切片=》两个map任务
 * 
 * 3.Reduce任务数量,Hadoop默认就是1个Reduce。此外,结果文件的数量=Reduce任务数量
 * 4.分区的概念,Hadoop默认分区用的是HashPartioner,根据Mapper输出的key的hashcode进行分区。
 * 
 */
public class ProfitMapper 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(" ");
		context.write(new Text(datas[0]), new IntWritable(Integer.valueOf(datas[1])));
	}
}


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

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



public class ProfitDriver {

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

		// 配置文件
		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf);
		
		// 设置运行入口,Mapper,Reducer 
		job.setJarByClass(ProfitDriver.class);
		job.setMapperClass(ProfitMapper.class);
		job.setReducerClass(ProfitRecducer.class);
		
		job.setNumReduceTasks(3);
		
		// 设置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, new Path("hdfs://192.168.76.131:9000/profit"));
		FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.76.131:9000/profit/result1"));
		
		job.waitForCompletion(true);

	}

}


运行 run as --> hadoop

结果:
在 result1 文件夹内有三个结果文件:
是 根据 Map 的key 的hashCode 进行分配运行

三、自定义分区

public class ProfitPartioner extends Partitioner<Text, IntWritable>{

	@Override
	public int getPartition(Text key, IntWritable value, int numCount) {
		// 默认实现
//		key.hashCode() & Integer.MAX_VALUE % numCount;
		
		// 当前 reduce num = 3 ,三个分区 0 1 2 
		if (key.toString().equals("1") || key.toString().equals("2") ){
			return 0 ;
		}else if( key.toString().equals("3")){
			return 1 ; 
		}else{
			return 2;
		}
	}

}


package com.study.profit.day01;

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

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

		// 配置文件
		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf);
		
		// 设置运行入口,Mapper,Reducer 
		job.setJarByClass(ProfitDriver.class);
		job.setMapperClass(ProfitMapper.class);
		job.setReducerClass(ProfitRecducer.class);
		
		job.setNumReduceTasks(3);
		// 设置自定义分区类
		job.setPartitionerClass(ProfitPartioner.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, new Path("hdfs://192.168.76.131:9000/profit/profit.txt"));
		FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.76.131:9000/profit/result4"));
		
		job.waitForCompletion(true);

	}

}




运行:result 三个结果
1 2 分区有结果 3 分区无内容

即:1 与 2 的结果在 1 分区 ; 3的结果在 2分区 ;3分区无内容

备注:Reducer 先分区再按照key合并
分享到:
评论

相关推荐

    hadoop/mapreduce-矩阵乘法 mapreduce的实现(代码)

    最近在研究hadoop与mapReduce,网上教程只有个wordcount程序示范,太简单,故写了个相对复杂点的涉及到多个文件之间同时运算的矩阵乘法的代码用于实验与测试,上传供大家学习与参考。 调用方法: 执行:hadoop jar ...

    基于神经网络与MapReduce的科技云数据清洗模型.pdf

    3. 基于神经网络与MapReduce的科技云数据清洗模型 3.1 模型架构 3.2 模型实现 4. 实验结果 5. 结论 在本文中,我们首先介绍了相关技术背景,包括神经网络和MapReduce。然后,我们提出了基于神经网络与MapReduce的...

    实验项目 MapReduce 编程

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

    基于MapReduce实现决策树算法

    3. MapReduce框架在决策树算法中的应用:MapReduce框架可以对大规模数据进行并行处理,使得决策树算法的计算速度和效率大大提高。在基于MapReduce实现决策树算法中,MapReduce框架可以对输入数据进行分区和处理,...

    mapreduce mapreduce mapreduce

    MapReduce是一种分布式计算模型,由Google开发,用于处理和生成大量数据。这个模型主要由两个主要阶段组成:Map(映射)和Reduce(规约)。MapReduce的核心思想是将复杂的大规模数据处理任务分解成一系列可并行执行...

    MapReduce编程之求Top3(TopN)

    本案例中,我们面临的问题是利用MapReduce来找出分布在多个文件中的正整数的最大三个值,即求解“Top 3”。这个问题在数据分析、推荐系统等领域有广泛应用,比如找出最受欢迎的产品、热门搜索关键词等。 MapReduce...

    Hadoop mapreduce实现wordcount

    3. **Map 阶段**: 在 Map 阶段,输入数据被分割成多个块(Block),每个块会分配到集群中的一个节点上进行处理。Mapper 类负责处理这些数据块,它接收键值对(key-value pair)作为输入,通常键是文件块的偏移量,...

    MapReduce基础.pdf

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

    学生mapreduce成绩分析

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

    MapReduce 设计模式

    3. MapReduce案例分析:通过“Hadoop Example: WordCount”展示了如何使用MapReduce编程模型来实现一个简单的词频统计程序。这是一个经典的MapReduce入门案例,通过它可以理解MapReduce框架的基本工作原理。 4. Pig...

    Hadoop原理与技术MapReduce实验

    (3)调试和运行MepReduce程序 (4)完成上课老师演示的内容 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 二、实验内容 1.单词计数实验(wordcount) (1)输入start-all.sh启动hadoop...

    基于MapReduce的Apriori算法代码

    3. MapReduce框架:MapReduce框架是一个分布式计算框架,用于处理大规模数据集的计算任务。 4. Mapper和Reducer:Mapper和Reducer是MapReduce框架中的两个主要组件,Mapper负责将输入数据集映射成键值对,Reducer...

    hadoop mapreduce编程实战

    Hadoop MapReduce 编程实战 Hadoop MapReduce 是大数据处理的核心组件之一,它提供了一个编程模型和软件框架,用于大规模数据处理。下面是 Hadoop MapReduce 编程实战的知识点总结: MapReduce 编程基础 ...

    mapreduce项目 数据清洗

    3. **Reduce阶段**: Reduce阶段负责聚合Map阶段产生的中间结果。在这个族谱清洗项目中,Reducer可能会收集所有与特定人物相关的键值对,然后合并这些信息,例如,汇总一个人的所有家庭成员,确保每个角色只出现一...

    MapReduce发明人关于MapReduce的介绍

    ### MapReduce:大规模数据处理的简化利器 #### 引言:MapReduce的诞生与使命 在MapReduce问世之前,Google的工程师们,包括其发明者Jeffrey Dean和Sanjay Ghemawat,面临着一个共同的挑战:如何高效地处理海量...

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

    3. **编写main方法**:设置MapReduce作业的配置信息,如指定输入输出路径、Mapper和Reducer类等,并启动作业执行。 ##### 实验目的 1. **掌握基本的MapReduce编程方法**:理解MapReduce的基本原理和编程流程,学会...

    大数据 hadoop mapreduce 词频统计

    3. **编写Reduce函数**:Reduce函数接收一系列具有相同键(即同一个单词)的键值对,将所有的值相加,得到该单词的总出现次数。 4. **运行Job**:配置好MapReduce作业后,提交到Hadoop集群进行执行。集群会自动调度...

    kmeans(mapreduce)

    这个过程可以视为“更新”步骤,但因为MapReduce模型不支持原地更新,所以需要再次运行MapReduce作业,将新的质心作为输入,开始下一轮迭代。 4. **迭代过程**:重复上述过程,直到质心不再明显变化或者达到预设的...

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

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

Global site tag (gtag.js) - Google Analytics