「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」。
3. MapReduce 运行模式
本地运行模式
-
MapReduce 程序是被提交给 LocalJobRunner 在本地以单进程的形式运行
-
处理的数据及输出结果可以在本地文件系统, 也可以在hdfs上
-
怎样实现本地运行? 写一个程序, 不要带集群的配置文件, 本质是程序的 conf 中是否有
mapreduce.framework.name=local 以及
yarn.resourcemanager.hostname=local 参数
-
本地模式非常便于进行业务逻辑的 Debug , 只要在 Eclipse 中打断点即可
集群运行模式
-
将 MapReduce 程序提交给 Yarn 集群, 分发到很多的节点上并发执行
-
处理的数据和输出结果应该位于 HDFS 文件系统
-
提交集群的实现步骤: 将程序打成JAR包,然后在集群的任意一个节点上用hadoop命令启动
4. MapReduce 分区
在 MapReduce 中, 通过我们指定分区, 会将同一个分区的数据发送到同一个 Reduce 当中进行处理
例如: 为了数据的统计, 可以把一批类似的数据发送到同一个 Reduce 当中, 在同一个 Reduce 当中统计相同类型的数据, 就可以实现类似的数据分区和统计等其实就是相同类型的数据, 有共性的数据, 送到一起去处理Reduce 当中默认的分区只有一个
- MapReduce 排序和序列化
-
序列化 (Serialization) 是指把结构化对象转化为字节流
-
反序列化 (Deserialization) 是序列化的逆过程. 把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, 就需要序列化对象成字节流, 反之当要将接收到或从磁盘读取的字节流转换为对象, 就要进行反序列化
-
Java 的序列化 (Serializable) 是一个重量级序列化框架, 一个对象被序列化后, 会附带很多额外的信息 (各种校验信息, header, 继承体系等), 不便于在网络中高效传输. 所以, Hadoop自己开发了一套序列化机制(Writable), 精简高效. 不用像 Java 对象类一样传输多层的父子关系, 需要哪个属性就传输哪个属性值, 大大的减少网络传输的开销
-
Writable 是 Hadoop 的序列化格式, Hadoop 定义了这样一个 Writable 接口. 一个类要支持可序列化只需实现这个接口即可
-
另外 Writable 有一个子接口是 WritableComparable, WritableComparable 是既可实现序列化, 也可以对key进行比较, 我们这里可以通过自定义 Key 实现 WritableComparable 来实现我们的排序功能