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为:
  1. key:是文件中的行偏移量,map函数一般不用这个数据
  2. value:是文件中的一行文本信息
  • map输出为:
  1. key:年份
  2. value:气温
  • map的输出由MapReduce框架处理后,发送给reduce函数key-value为:
  1. key:年份
  2. 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。