MapReduce

MapReduce Map

  • 确定map任务数时依次优先参考如下几个方面:

    • 每个map任务使用的内存不超过800M,尽量在500M以下
    • 每个map任务运行时间控制在大约20分钟, 最好1-3分钟
    • 每个map任务处理的最大数据量为一个HDFS块大小,一个map任务处理的输入不能跨文件
    • map任务数总数不超过平台可用的任务槽位
  • map个数为split的份数

  • 压缩文件不可切分

  • 非压缩文件和sequence文件可以切分

  • dfs.block.size决定block大小,默认64

  • 修改配置 vi ./config/hdfs-site.xml

  • 配置加载问题

    • 简单配置通过提交作业是-file分发
    • 复杂较大的配置
      • 传入hdfs
      • map中打开文件读取
      • 建立内存结构

Reduce

  • 确定reduce任务数时依次优先参考如下几个方面:

    • 每个reduce任务使用的内存不超过800M,尽量在500M以下
    • 每个reduce任务运行时间控制在大约20分钟, 最好1-3分钟
    • 整个reduce阶段的输入数据总量
    • 每个reduce任务处理的数据量控制在500M以内
    • map任务数与reduce任务数的乘机
    • 输出数据要求
  • reduce个数设置

    • mapred.reduce.tasks
    • 默认1
  • reduce个数太少

    • 单词执行慢
    • 出错再试成本高
  • reduce个数太多

    • shuffle开销大

    • 输出大量小文件

    • 多个reduce任务输入的数据都属于不同的partition,因此结果数据的key不会重复。

    • 合并reduce的输出文件即可得到最终结果

  • MapReduce 三要素

    • copy、排序、计算
  • 6个map+2个reduce = 8个进程空间

  • 进程算子可能在一台机器,也可能在多台机器

  • MapReduce采用多进程而非多线程

    • 优点:多进程方便资源控制调配
    • 缺点:消费更多启动时间、时效性不高
    • 适合批量操作、高通吐情况下、离线情况下
    • 对比spark:spark更快、缺点:高并发难保证多任务运行在同一个进,会导致多个线程严重资源竞争,你那控制资源运行情况,相比spark没有MapReduce稳定

MapReduce物理配置

  • 文件句柄数:
    • ulimit
  • cpu:
    • 多核
  • 内存
    • 8G以上
  • 合适的slot:
    • 可理解为槽位
    • 单机map、reduce个数
    • mapred.tasktracker.map.tasks.masimum (默认2)
    • mapreduce.tasktracker,tasks,reduce.maximum (默认2)
    • 内存限制
    • cpu合数-1
    • 多集群分离
  • 磁盘情况
    • 合适单机多磁盘
    • mapred.local.dir和dfs.data.dir

MapReduce InputFormat

  • MR框架基础类之一
  • 数据分割(Data Splits)
    • mapReduce启动个数依赖于Split个数
    • 切割保证句子完整性
  • 记录读取器(Record Reader)
    • 每读取一条记录,调用一次map函数

      当有一个记录横跨两个block时会被阶段放到前面block去
      会出现,有的split比block大,有的split比block小

Shuffle

  • 包含: Partion,sort,Spill,Meger,Combiner,Copy,Memery,Disk…
  • 性能优化大有可能的地方
  • Partitioner:
    • 决定数据由那个Reducer处理,从而分区
    • 比如采用hash法,有n个Reducer,那么数据{"area" : 1}的key"area"对n进行取模,返回m,而生成{partition,key,value}

###MemoryBuffer

  • 内存缓存区,每个map的结果和partition处理的key value结果都保存在缓存中
  • 缓冲区大小:默认100M
  • 溢写阈值:100M*0.8 = 80M
  • 缓冲区 Partition key value 三元组数据
    1
    2
    3
    {“1”,“area”:1} ##第一个值是位置 reduce
    {“2”,“at”:1}
    {“1”,“we”:1}

Spil

  • 内存缓冲区达到阈值时,溢写spill线程锁住这80M的缓冲区,开始将数据写出到本地磁盘中,然后释放内存
  • 每次溢写都生成一个数据文件。
    1
    溢出的数据到磁盘都会对数据进行Key排序sort,以及合并combiner
  • 发送相同Reduce的key数量,会拼接到一起,减少partition的索引数量。

Spilt

  • 实际上每个split包含后一个block中开头部分的数据(解决记录跨Blokc问题)
    • 例:比如记录we are studying at hom.\n 跨越存储在两个Block中,那么这条记录属于前一个block对应的split

Sort

  • 缓冲区数据按照key进行排序

Spill & Sort

  • 和map一样,内存缓冲满时,也通过sort和combiner,将数据溢写到硬盘文件中
  • Reduce端的缓存设置更灵活,此时reduce函数未运行,也可以占用较大的内存

Combiner

  • 数据合并,相同的key的数据,value值合并,减少输出传输量
  • ComBiner函数事实上是reducer函数,满足combiner处理不影响{sum,max等}最终reduce的结果是,可以极大提升性能
  • 部分的reducer提前在Combiner做了