14mapreduce的流程说明&实现Mapper类&实现Driver以及测试运行——好程序

本文详细介绍了MapReduce的工作流程,包括Job、Task的定义,以及MapTask和ReduceTask的处理过程。Mapper负责数据的读取与逻辑运算,Reduce则根据key进行分组和逻辑处理。此外,还阐述了编写MapReduce程序的步骤,包括Mapper、Reducer和Driver的编程。示例展示了Mapper的输出和Reduce的输入排序情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

mapreduce核心名词
job:用户的一个计算请求称为一个作业。
task:每一个作业,都需要分拆成多个的task,交由多个主机来完成,拆分出来的执行单元就叫任务。
task又分为3种类型:
map:负责map阶段的整个的数据处理流程(需要资源)
reduce:负责reduce阶段的整个数据处理流程(需要资源)
appMaster:负责整个程序的过程调度以及状态协调(需要资源,ResourceManager首先分给它)

mapreduce的程序运行流程
1、一个mr程序启动的时候,最先启动的时mrAppMaster,mrAppmaster启动后根据本次job的描述信息(job:split分片信息),计算出需要的maptask的实例数量,然后向集群申请机器来启动maptask任务。
2、maptask任务启动之后,根据给定的数据切片范围进行数据处理,主要流程:
    根据客户端指定的inputformat来获取recordreader来读取数据,形成输入kv对。
    将输入的kv对传递给客户自定义的map方法,做逻辑运算,并将map方法的输出的kv对进行收集到缓存。
    
  将缓存中的kv对按照k进行分区排序后不断的溢写到磁盘文件(什么样的数据分到哪个reduce里面)
   到此maptask任务已经完成了
3、mrappmaster监控所有的maptask任务完成情况,会根据客户指定的参数启动相应数量的reduce任务,把那个告知reducetask要处理的数据范围(数据分区)(reduce任务是客户端人为指定的,数据分成多少个task,就会分成多少个分区)

4、reducetask任务启动之后,根据mrappmaster告知的数据范围所在的位置,从若干台maptask运行的主机上获取若干个maptask的输出结果文件,并在本机进行重新归并排序。然后按照相同key的kv分为一组(有多少k就分多少组),调用客户定义的reduce方法(业务逻辑),进行逻辑运算,并将运算结果输出成kv,然后调用客户指定的outputformat将结果输出到外部存储设备。

(map将资源分到磁盘的分区里,然后reduce被告知所做的任务,及任务所在的磁盘文件位置信息,则就可以主动去拉去资源)

 

编写一个mapreduce程序编程步骤(框架都是接口,只要将写好的程序放入接口里)
01、用户编程的程序分成三个部分:Mapper、Reducer、Driver(提交mr程序的客户端,Driver是驱动程序)
02、Mapper的输入数据是KV对形式(KV的类型可以自定义)
03、Mapper的输出数据是KV对形式(KV的类型可以自定义)
04、Mapper中的业务逻辑写在map方法中(对一整行数据进行拆分,然后数组迭代,再进行一个单词一个数量统计)
05、map方法(由maptask进程来调用)对每一个KV对调用一次map方法
06、reduce的输入数据是KV对形式,

### 编写MapReduce程序统计HDFS上的字符数量 为了实现这一目标,可以创建一个简单的Java MapReduce应用程序来计算给定输入文件中的总字符数。此过程涉及定义Mapper和Reducer,在这里不需要复杂的逻辑处理,因为只需关注字符的数量。 #### Mapper设计 Mapper的任务是从每条记录读取数据并输出键值对。对于字符计数问题来说,可以直接忽略Key部分而专注于Value即文本行本身,并假设每个映射阶段产生的中间结果为(任意常量, 字符串长度),这里的字符串长度代表单个输入行内的字符数目。 ```java 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 CharCountMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> { private final static IntWritable one = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); int charNum = line.length(); // 计算当前行的字符总数 context.write(one, new IntWritable(charNum)); } } ``` #### Reducer设计 Reducer负责接收来自多个Mappers的数据并对它们进行汇总操作。在这个例子中,Reducer会接收到形如`(1, N)`这样的键值对集合,其中`N`表示某一行里的字符数量;因此,只需要累加所有的`N`值得到最终的结果——整个文档集里所有字符的总量。 ```java import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.mapreduce.Reducer; public class CharCountReducer extends Reducer<IntWritable,IntWritable,IntWritable,IntWritable> { public void reduce(IntWritable key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values){ sum += val.get(); } context.write(key, new IntWritable(sum)); } } ``` #### 配置Job设置以便于提交至YARN集群执行 为了让上述编写的MapReduce应用能够在真实的生产环境中工作,还需要适当配置作业参数以适应实际部署情况下的需求。特别是当计划让该任务在基于Apache YARN框架管理资源调度器之上运行时,则应确保设置了如下几个重要属性: - `mapreduce.framework.name=yarn`: 指明采用YARN作为MRv2版本下默认的工作模式。 - `yarn.resourcemanager.hostname=hadoop000`: 明确指出ResourceManager服务端口所在主机名或IP地址。 - `mapreduce.app-submission.cross-platform=true`: 启用跨平台提交功能允许远程客户端向不同操作系统环境发起请求。 最后一步就是构建完整的Driver代码用于启动这个特定用途的应用实例并向集群发送指令完成相应运算流程[^2]。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class CharCount { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "char count"); job.setJarByClass(CharCount.class); job.setOutputKeyClass(IntWritable.class); job.setOutputValueClass(IntWritable.class); job.setMapperClass(CharCountMapper.class); job.setCombinerClass(CharCountReducer.class); // 可选:如果希望减少网络传输开销可启用组合器 job.setReducerClass(CharCountReducer.class); FileInputFormat.addInputPath(job, new Path("/wordcount/input")); FileOutputFormat.setOutputPath(job, new Path("/output")); conf.set("mapreduce.framework.name", "yarn"); conf.set("yarn.resourcemanager.hostname", "hadoop000"); conf.set("mapreduce.app-submission.cross-platform", "true"); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值