喻轩Blog - MapReduce
type: channel
link: https://blog.yuxuan.io/tags/mapreduce
items: MapReduce编程框架

MapReduce编程框架
type: item
date: 2020-09-20T01:37:37+08:00
description: MapReduce思想MapReduce思想在生活中处处可见。我们或多或少都曾接触过这种思想。MapReduce的思想核心是分而治之，充分利用了并行处理的优势。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想，而不是自己原创。MapReduce任务过程是分为两个处理阶段：Map阶段：Map阶段的主要作用是“分”，即把复杂的任务分解为若干个“简单的任务”来并行处理。Map阶段的这些任务可以并行计算，彼此间没有依赖关系。Reduce阶段：Reduce阶段的主要作用是“合”，即对map阶段的结果进行全局汇总。再次理解MapReduce的思想官方WordCount案例源码解析经过查看分析官方WordCount案例源码我们发现一个统计单词数量的MapReduce程序的代码由三个部分组成：Mapper类Reducer类运行作业的代码（Driver）Mapper类继承了org.apache.hadoop.mapreduce.Mapper类重写了其中的map方法，Reducer类继承了org.apache.hadoop.mapreduce.Reducer类重写了其中的reduce方法。重写的Map方法作用：map方法其中的逻辑就是用户希望mr程序map阶段如何处理的逻辑；重写的Reduce方法作用：reduce方法其中的逻辑是用户希望mr程序reduce阶段如何处理的逻辑；Hadoop序列化为什么进行序列化？序列化主要是我们通过网络通信传输数据时或者把对象持久化到文件，需要把对象序列化成二进制的结构。观察源码时发现自定义Mapper类与自定义Reducer类都有泛型类型约束，比如自定义Mapper有四个形参类型，但是形参类型并不是常见的java基本类型。为什么Hadoop要选择建立自己的序列化格式而不使用java自带serializable？序列化在分布式程序中非常重要，在Hadoop中，集群中多个节点的进程间的通信是通过RPC（远程过程调用：Remote Procedure Call）实现；RPC将消息序列化成二进制流发送到远程节点，远程节点再将接收到的二进制数据反序列化为原始的消息，因此RPC往往追求如下特点：紧凑:数据更紧凑，能充分利用网络带宽资源快速:序列化和反序列化的性能开销更低Hadoop使用的是自己的序列化格式Writable,它比java的序列化serialization更紧凑速度更快。一个对象使用Serializable序列化后，会携带很多额外信息比如校验信息，Header，继承体系等。Java基本类型与Hadoop常用序列化类型Java基本类型Hadoop Writable类型booleanBooleanWritablebyteByteWritableintIntWritablefloatFloatWritablelongLongWritabledoubleDoubleWritableStringTextmapMapWritablearrayArrayWritableMapReduce编程规范及示例编写Mapper类用户自定义一个Mapper类继承Hadoop的Mapper类Mapper的输入数据是KV对的形式（类型可以自定义）Map阶段的业务逻辑定义在map()方法中Mapper的输出数据是KV对的形式（类型可以自定义）注意：map()方法是对输入的一个KV对调用一次！！Reducer类用户自定义Reducer类要继承Hadoop的Reducer类Reducer的输入数据类型对应Mapper的输出数据类型（KV对）Reducer的业务逻辑写在reduce()方法中Reduce()方法是对相同K的一组KV对调用执行一次Driver阶段创建提交YARN集群运行的Job对象，其中封装了MapReduce程序运行所需要的相关参数入输入数据路径，输出数据路径等，也相当于是一个YARN集群的客户端，主要作用就是提交我们MapReduce程序运行。WordCount代码实现需求在给定的文本文件中统计输出每一个单词出现的总次数输入数据：wc.txt;输出：apache 2clickhouse 2hadoop 1mapreduce 1spark 2xiaoming 1具体步骤按照MapReduce编程规范，分别编写Mapper，Reducer，Driver。新建maven工程导入hadoop依赖<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>or…