思考题

  • 并行化思想
  • 批量计算特点
  • MapReduce算法的架构
  • MapReduce算法设计思想
  • 算法调优
  • MapReduce运行过程中的各种参数及其作用
  • 参数调优

    引言

  • 求解问题的难度

    • 问题本身的难度
    • 问题规模的难度
  • 处理问题规模的难度,这时,问题简单但是计算本身是很困难的,需要并行分布式计算
  • 批量计算的特点

    • 最为常见的一类数据计算问题
    • 数据规模不变
    • 数据已经保存,用户驱动计算
    • 计算实时性要求不高,但尽可能快
    • 可能存在重复性问题,尽可能优化
    • 计算逻辑相对简单
    • 数据规模巨大时会导致计算框架本身产生问题
    • 怎么做到弹性可扩展能够应对理论上的无限量数据
    • 涉及存储、计算逻辑、计算执行过程控制等一系列问题

      MapReduce

  • 存储位置

    • 源文件:GFS
    • Map处理结果:本地存储
    • Reduce处理结果:GFS
    • 日志:GFS
  • Word Count
    • 自动对文本进行分割
    • 在分割之后的每一个KV进行用户定义的Map操作,生成新的KV对
    • 对输出的结果集归拢并排序(系统自动完成)
    • Reduce对结构进行归纳
  • Shuffle:从Map输出到Reduce输入的整个过程可以广义地称为Shuffle。Shuffle横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和sort过程。Shuffle

    • Map端Shuffle
      • Partition
      • Spill
      • Merge
    • Reduce端Shuffle
      • Copy
      • Merge Sort

        算法调优

  • 更加优化的KeyValue对设置

  • Map算法
    • Map函数开始产生输出时,不是直接写入磁盘,二是通过缓冲方式写入内存,进行预排序
      • 缓冲区大小
      • 缓冲区容量阈值,什么情况下算Spill一次
    • 在写磁盘之前,线程根据最终要传送到的reducer对数据 进行partition,每个partition内数据按照key进行键内排 序,如果有combiner,则在排序后的输出上运行
      • 一次最多合并的流数
      • spill次数的最小值,满足最小值时,combiner才会执行
    • Reducer上文件分区的线程数
  • Combiner算法
  • Partition算法
  • Reduce算法
    • Map输出文件位于运行map任务的tasktracker的本地磁盘, reduce任务需要集群上若干map任务的输出作为输入,每 个map任务完成时间可能不同,因此只要有一个map任务完成,reduce任务就开始复制其输出
      • reduce任务复制线程:mapred.reduce.parallel.copies,默认5
      • Reduce获取一个map输出最大时间: mapred.reduce.copy.backoff,默认300s,在声明失败之前,如 果超时,可以尝试重传
    • 如果map输出很小,则复制到reduce的tasktracker的内 存中,否则则先写入内存缓冲区,当超过缓冲区溢出阈值, 或达到map输出阈值时,再合并后溢出写到磁盘中
    • 合并因子,一次合并的文件数
    • 合并策略
  • 调优原则
    • 给shuffle过程尽可能多的内存空间
    • Map和reduce函数尽量少用内存
    • 运行map和reduce任务的JVM的内存尽量大
    • Map端尽量估算map输出的大小,减少溢出写磁盘的次数
    • Reduce端的中间数据尽可能的多驻留在内存
    • 增加Hadoop的文件缓冲区