第五周
WordCount 作为 MapReduce 的经典案例,是理解分布式计算流程的入门示例,其核心是通过 Mapper 和 Reducer 类的重写实现单词计数功能。在 Mapper 类中,需继承org.apache.hadoop.mapreduce.Mapper类,并重写map方法。map方法的输入键值对为<LongWritable, Text>,其中LongWritable表示输入数据的行偏移量,Text表示每行的文本内容;输出键值对为<Text, IntWritable>,Text表示单词,IntWritable表示单词出现次数(初始为 1)。在map方法内部,首先将输入的文本内容按空格分割为单词数组,然后遍历数组,对每个单词输出<单词, 1>的键值对。例如,输入文本 “Hello World Hello Hadoop”,经过 Mapper 处理后,会输出<Hello,1>、<World,1>、<Hello,1>、<Hadoop,1>四个键值对。
Reducer 类同样需要继承org.apache.hadoop.mapreduce.Reducer类,并重写reduce方法。reduce方法的输入键值对为<Text, Iterable
在 MapReduce 编程中,掌握高级技巧可显著提升任务执行效率。Combiner 作为本地 Reducer,能在 Mapper 节点本地对输出结果进行聚合,减少 Map 阶段到 Reduce 阶段的网络数据传输量。例如在 WordCount 任务中,若某个 Mapper 节点输出大量重复的<Hello,1>键值对,通过设置 Combiner,可在该节点本地先将这些键值对聚合为<Hello, n>,再发送到 Reduce 节点,大幅降低网络带宽占用,提升任务执行速度。
自定义 Partitioner 则可解决数据倾斜问题,默认情况下,MapReduce 采用HashPartitioner,根据键的哈希值将数据均匀分配到不同 Reduce 节点。但当数据分布不均时,可能出现部分 Reduce 节点处理的数据量过大,而其他节点处理的数据量过小,导致整体任务执行延迟。此时可自定义 Partitioner,根据业务需求合理分配数据。例如在日志分析任务中,若某些日志类型数据量极大,可根据日志类型设置 Partitioner,将不同类型的日志数据分配到不同 Reduce 节点,确保每个 Reduce 节点处理的数据量相对均衡,提高任务执行效率。
性能监控是 MapReduce 任务优化的重要环节,通过 JobTracker 可实时监控任务执行状态,分析任务瓶颈。JobTracker 提供了任务执行的详细统计信息,包括每个 Map 和 Reduce 任务的执行时间、CPU 使用率、IO 读写量等指标。通过查看 CPU/IO 占比统计表,若发现某个任务的 CPU 使用率过高,可能是计算逻辑过于复杂,需优化代码;若 IO 读写量过大,则可能是数据处理过程中存在大量冗余数据,需通过 Combiner 或数据过滤等方式减少 IO 操作。此外,JobTracker 还可查看任务执行过程中的错误日志,帮助快速定位问题,确保任务顺利执行。

浙公网安备 33010602011771号