MapReduce编程规范

博客介绍了用户编写MapReduce程序需分成的三个部分。Mapper要继承父类,输入输出为KV对,业务逻辑在map()方法;Reducer同样继承父类,输入对应Mapper输出,业务在reducer()方法;Driver作为YARN集群客户端,提交封装运行参数的job对象。

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

用户编写的程序需要分成以下三个部分:

  1. Mapper
    - 用户自定义的Mapper需要继承自己的父类
    - Mapper的输入数据是KV对的形式(KV的类型可以自己定义)
    - Mapper中的业务逻辑写在map()方法中
    - Mapper的输出数据也是KV对的形式
    - map()方法(MapTask进程)对每一个<K,V>调用一次
  2. Reducer
    - 用户自定义的Reducer需要继承自己的父类
    - Reducer的输入数据类型对应Mapper的输出数据,也是KV
    - Reducer的业务逻辑写在reducer()方法中
    - ReduceTask今晨对每一组相同k的<K,V>组调用一次reduce()方法
  3. Driver
    - 相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象。
### MapReduce大数据编程实验教程与示例代码 #### 1. MapReduce简介 MapReduce 是一种用于处理大规模数据集的分布式计算模型,广泛应用于 Hadoop 生态系统中。它通过将任务分解为两个主要阶段:`Map` 和 `Reduce` 来实现高效的数据处理[^1]。 #### 2. MapReduce编程规范 在编写 MapReduce 程序时,需遵循一定的编程规范以确保程序能够正确运行于分布式环境中。以下是基本流程: - **Mapper 阶段**: 输入键值对 `(key, value)` 被传递给 Mapper 函数,经过处理后输出中间结果。 - **Reducer 阶段**: 中间结果被聚合到 Reducer 函数中进一步加工,最终生成目标输出。 #### 3. 示例代码:词频统计 (WordCount) 以下是一个经典的 WordCount 示例代码,展示如何利用 MapReduce 统计文本文件中的单词频率。 ```java // 导入必要的类库 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.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line.toLowerCase()); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } public static class SumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text 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)); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(SumReducer.class); job.setReducerClass(SumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 此代码实现了从输入文件读取文本内容,并统计每个单词出现次数的功能[^3]。 #### 4. 数据切片机制 为了提高并行效率,Hadoop 将输入数据划分为多个逻辑上的片段(Split),每一片段由一个独立的 MapTask 进行处理。需要注意的是,这些切片仅存在于内存中,并不涉及实际磁盘操作[^2]。 #### 5. 实验准备 在本地环境或者集群环境下测试上述代码前,需要完成如下准备工作: - 创建 HDFS 上的目标目录结构,例如 `/wordcount/input` 可通过命令 `hdfs dfs -mkdir -p /wordcount/input` 完成。 - 向该目录上传待分析的文本文件。 - 提交编译后的 JAR 文件至 YARN 平台执行作业。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值