【笔记】大数据技术之MapReduce介绍(七)

MapReduce

概述

  1. Map函数
  • 原始输出
    • <key,value>包含重复项
  1. Reduce函数
  • 输入
    • <key,value-list>
  • 输出
    • <key,value>

体系结构

  1. Client
    • 可以提交编写的应用程序
    • 可以通过它提供的一些接口去查看当前提交作业的
  2. JobTracker
    • 负责资源的监控和作业的调度
    • 监控底层和其他的TaskTracker以及当前运行的Job健康状况
    • 一旦探测失败的情况,就把这个任务转移到其他节点继续执行任务实现
  3. TaskTracker
    • 执行具体的相关任务一般接受JobTracker发送过来的命令
    • 把一些自己的资源使情况,以及任务的运行进度通过heartbeat发送给JobTracker
    • slot
      • reduce类型->reduce任务
      • map类型->map任务
  4. Task
    * map
    * reduce
  5. 设计理念:计算向数据考虑
  6. 归并:值的list化,合并:值的改变,但是要确保不能改变结果
  7. 采用"分而治之"的策略,大规模数据集会被切分成许多独立的分片

工作流程

  • shuffle
  • 执行的各个阶段
    • 最优Reduce任务个数取决于集群中可用的reduce任务槽(slot)数目
    • 但是个数要少于任务槽

Shuffle

  1. Map端和Reduce端的shuffle
  2. Map端的Shuffle是对输出结果进行分区、排序、合并等处理,并交给Reduce

Map端

  • 过程
  1. 输入数据和执行Map任务
  2. 写入缓存
  3. 溢写(分区、排序、合并)
    • 缓存满了就会进行
    • 需要设置溢写比例
    • 合并:减少写入磁盘的数据量,需要用户定义启动
  4. 文件归并
    • 键值分区、且归并

Reduce端

  1. "领取"数据
  2. 归并数据:将数据进行合并为list等
  3. 把数据输入给Reduce任务

应用执行过程

  1. 程序部署
  2. 执行reduce任务或者执行map任务
  3. 读数据:<key,value>键值对
  4. 本地写数据
  5. 远程读数据
  6. 写数据

WordCount

  1. 输入大量单词文本文件
  2. 输出每个单词出现频率
  3. Map输出shuffle以后,键值对,值变成list集合,Reduce输出统计值list集合结果

具体应用

  1. 自然连接:Map映射生成key-value,Reduce对key值相同的进行汇总

  2. 编程实现

    • Map处理逻辑
      <key,value>输出
    • Reduce处理逻辑
      <key,value-list>输入Iterable容器
  3. 打包编译

MapReduce执行过程

输入分片,执行Map任务,通过shuffle操作之后进行Reduce操作

输入和输出过程

  • 数据从文件中读取并形成键值对
  • 依赖关系:TextInputFormat -> FileInputFormat -> InputFormat:getSplites&createRecordReader
    • 主要功能:获取分片列表,创建记录读取器

输入

定义数据是如何从HDFS的文件中读取并转换为map函数能够处理的<key,value>形式

  • getSplites思路(FileInputFormat类)
    • getFormatMinSplitSize() & getMaxSpiltSize() & getgetMinSplitSize() 设置分片最大值和最小值的方法,三个方法分别对应以下解释
      • 返回固定值1
      • 读取配置的值(默认为Long 类型的最大值)
      • 读取配置的值(默认为0)
    • 存储分片结果
    • 对文件进行分片 | 不可切片则退回整片数据 | 长度为零则设置空Hosts列表
      • 获取文件block信息列表:位置/文件中偏移量/大小
      • isSplitable() (from FileInputFormat) –
      • splitSize 由 computeSplitSize(block大小,分片分片最大值,分片最小值)决定
      	if(blockSize<maxSize&&minSize<blockSize) splitSize=blockSize;
      	else splitSize=maxSize;
      
      • while循环切片操作:文件比切片大小大(一般1.1产量决定值)
        • 改变block索引值
        • 切片列表添加切片的内容(由block索引值决定切片文件范围):非物理划分
          • 偏移量:length-bytesRemaining
        • 改变剩余量
      • 剩余量处理
        • 将剩余的按照while循环中的切片操作处理
    • 根据原始文件的大小设置输入文件数量
    • 返回切片集合
读取分片转化数据
  • LineRecordReader思路(TextInputFormat类)
    • extends RecordReader
      • initialize:初始化
        • 主要:不是第一个分片则丢弃第一行同时会多读取一行(设置pos值)
      • nextKeyValue:读取并返回下一个键值对
        • 初始化key(此行数据在文件中的偏移量:pos值),value值
        • 循环读取每一行数据,通过回车换行等读取一行数据到value
          • maxLineLength作为临界值进行读取分割
        • 下一分片第一行数据是否存在的判断结果
      • getCurrentKey & getCurrentValue:只有在nextKeyValue返回true调用
      • getProgress:读取记录的进度
      • close:清理创建的RecordReader对象
自定义输入
  • extends InputFormat
    • 实现getSplits & createRecordReader
  • createRecordReader
    • 自定义RecordReader类,重载initialize & nextKeyValue

输出

将reduce函数的输出写到HDFS文件

  • TextOutputFormat -> FileOutputFormat -> OutputFormat:
    • getRecordWrite() : 返回write对象(写记录)
    • checkOutputSpecs() : 检查输出设置是否合法
      • 输出目录是否被设置
        • y:检查输出目录是否存在
          • y:抛出异常
    • getOutputCommitter() : 传入输出流
      • 对临时文件和文件的创建删除移动等操作,由TextOutputFormat实现
  • TextOutputFormat实现
    • 提供了getRecordWrite()操作的实现(主要实现的方法)
      • 返回LineRecordWriter类(内部类,传入了写入流)实例
  • LineRecordWriter实现 -> RecordWriter:获取输出文件的路径,创 建写入数据到文件的输出流,通过输出流创建
    • write
    • close
  • LineRecordWriter的writer(继承RecordWrite)
    • synchronized 与写互斥
    • 判断key和value是否为空进行写入操作
      • key
      • 分隔符
      • value
      • 分行符
    • Text类型的判断:获取字节数组
自定义输出格式
  • 实现OutputFormat方法中的三个方法,主要重载getOutputCommitter()
  • 重载getRecordWriter:RecordWriter(ouputstream)
    • 自定义新的输出格式:自定义新的RecordWriter()类型
      • 键值对写入所传入的输出流
      • 继承RecordWrite,需要实现wirte&close

注:&代表和,->代表继承

补充知识:yarn

  1. facebook发布的取代npm的包管理工具

    • 快、安全、可靠
  2. 具体操作

实验室传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值