Hadoop权威指南4
- 第2章 关于MapReduce
- 2.1 气象数据集
- 2.2 使用Unix工具来分析数据
- 2.3 使用Hadoop来分析数据
- 2.3.1 map和reduce
- 2.3.2 Java MapReduce
- 2.3.2.1 运行测试
- 2.4 横向扩展
- 2.4.1 数据流
- 2.4.2 combiner 函数
- 2.4.3 运行分布式的MapReduce作业
- 2.5 Hadoop Streaming
第2章 关于MapReduce
2.1 气象数据集
- 文本数据
- 一行代表一条记录,包括了各方面的天气信息,地点,日期,温度,等等
- 很多小文本
2.2 使用Unix工具来分析数据
- 可以使用按行处理数据工具 awk 写shell脚步
2.3 使用Hadoop来分析数据
2.3.1 map和reduce
- MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段,每个阶段都以健-值对作为输入输出,健-值对的类型由程序员来确定
- map阶段的输入key-value为:
- key:是文件中的行偏移量,map函数一般不用这个数据
- value:是文件中的一行文本信息
- map输出为:
- key:年份
- value:气温
- map的输出由MapReduce框架处理后,发送给reduce函数key-value为:
- key:年份
- value:该年份的一系列温度数据,如下图所示
- 整个数据流如下图
2.3.2 Java MapReduce
- java代码实现需要3样:一个map函数,一个reduce函数和一些用来运行作业的代码
- map函数,由Mapper类来表示,声明一个抽象的map()方法
- reduce函数,由Reduce类来表示,声明一个抽象的reduce()方法
- 还需要实现一个main函数,负责运行MapReduce作业,进行一系列作业运行的设置
2.3.2.1 运行测试
- 以独立本机的模式安装Hadoop,这种模式下在本地文件系统上运行作业程序
- 安装编译打包程序,命令行运行程序指定输入数据和输出结果存放的目录名,输出数据目录应该不存在,由hadoop运行是创建
- 作业运行会在命令行打印一些信息,比如作业ID,map和reduce的任务id,还会统计任务的输入输出记录
2.4 横向扩展
2.4.1 数据流
- MapReduce作业(job)是客户端需要执行的一个工作单元,包括:输入数据、MapReduce程序和配置信息。
- 作业分成若干任务(task)来执行,包括2类任务:map任务和reduce任务,任务运行在集群的节点上,通过YARN进行调度。
- MapReduce的输入数据被划分池等长的小数据块,称为 输入分片(input split),每个分片一个map任务。
- 分片的合理大小为HDFS中一个 块(block) 的大小,可以更好地实现map任务的 数据本地化,map任务将其输出数据写入本地硬盘
- reduce任务不具备数据本地化优势,单个reduce任务的输入通常来自于所有map任务的输出,一个reduce任务的完整数据流如下图:
- 若由多个reduce任务,每个map任务就会针对输出进行分区,为每一个reduce任务建一个分区。map任务和reduce任务之间的数据流称为 shuffle(混洗),多个reduce任务的数据流如下图:
2.4.2 combiner 函数
- 集群的可用带宽限制MapReduce作业的数量,所以尽量避免map和reduce任务之间的数据传输是有利的。
- 可以通过针对map任务的输出指定一个combiner,来减少reduce函数的输入,同时不影响reduce输出结果。
- combimer是通过Reducer类来实现的,需要在main方法中setcombiner,如下图:
2.4.3 运行分布式的MapReduce作业
- 独立模式下的Java MapReduce程序不用做修改就可以在完整数据集的分布式集群上运行,可以根据数据量的大小和硬件规模进行扩展
2.5 Hadoop Streaming
- Hadoop Streaming使用Unix标准流作为Hadoop和应用程序之间的接口,所以我们可以用任何编程语言通过标准输入/输出来写MapReduce程序。比如python和ruby。