Hadoop之MapReduce

MapReduce 总结

  • 1:mapReduce 优点

    《具有 易于编程、高容错性和高扩展性等优点》

  • 1:高容错性:Mapreduce的设计初衷就是使程序能够部署在廉价的pc机器上,这就要求它具有很高的容错性。比如一个机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由hadoop内部完成的

  • 2:高扩展性: 项目当你的计算资源得不到满足的时候,你可以通过简单的通过增加机器来扩展它的计算能力

  • 3:易编程:它简单的实现一些接口,就可以完成一个分布式程序,这个程序可以分布到大量的廉价的pc机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特性使的Mapreduce编程变得非常流行。

  • 2:mapReduce 缺点:

    《不擅长实时计算 不擅长流式计算 不擅长DAG(有向图)计算》

  • 1:不擅长实时计算:Mapreduce无法做到像Mysql那样做到毫秒或者秒级的返回结果

  • 2:不擅长流式计算:流式计算的输入数据是动态的,而Mapreduce的输入数据集是静态的,不能流态变化。这是Mapreduce自身的设计特点决定了数据源必须是静态的。

  • 3:不擅长DAG: 多个应用程序存在依赖关系,后一个应用程序的输入为前一个应用程序的输出,在这种情况下,Mapreduce并不是不能做,而是使用后每个Mapreduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下。

3:分布式计算框架MapReduce

  • 分布式计算框架(计算向数据移动)
  • 理解MapReduce

    1:map
    — 读懂数据,映射为KV模型,并行分布式。
    2:Reduce
    — 数据全量/分量加工 Reduce中可以包含不同的key
    — 相同的Key汇聚到一个Reduce中
    — 相同的Key调用一次reduce方法
    — 排序实现key的汇聚
  • 3:MapReduce

1:Hadoop核心之MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。这个定义里面有着这些关键词,一是软件框架,二是并行处理,三是可靠且容错,四是大规模集群,五是海量数据集。因此,对于MapReduce,可以简洁地认为,它是一个软件框架,海量数据是它的“菜”,它在大规模集群上以一种可靠且容错的方式并行地“烹饪这道菜”。
2:MapReduce的思想就是“分而治之”。Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。

客户端,用来提交MapReduce作业。
JobTracker,用来协调作业的运行。
Tasktracker,用来处理作业划分后的任务。
HDFS,用来在其它实体间共享作业文件。
MapReduce整个工作过程有序地包含如下工作环节:
作业的提交
作业的初始化
任务的分配
任务的执行
进程和状态的更新
作业的完成

  • Reduce Key.Value自定义

    1:K,V使用自定义数据类型
    — 作为参数传递,节省开发成本,提高程序自由度
    — Writable序列化:使能分布式程序数据交互
    — Comparable比较器:实现具体排序(字典序,数值序等)

4:MapReduce 角色

  • JobTracker:
    — 核心,主,单点
    — 调度所有的作业
    — 监控整个集群的资源负载

  • TaskTracker
    — 从,自身节点资源管理
    — 和JobTracker心跳,汇报资源,获取Task

  • Client
    — 作业为单位
    — 规划作业计算分布
    — 提交作业资源到HDFS
    — 最终提交作业到JobTracker

  • 弊端:
    — JobTracker:负载过重,单点故障
    — 资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
    — 不同框架对资源不能全局管理

5:MapReduce 序列化

  • 序列化:是指把结构化对象转化为字节流。
  • 反序列化:是序列化的逆过程。把字节流转为结构化对象。
    — 当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,
    — 反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化。
    — Java 的序列化(Serializable)是一个重量级序列化框架,一个对象被序列
    化后,会附带很多额外的信息(各种校验信息,header,继承体系…),不便于
    — 在网络中高效传输;所以,hadoop 自己开发了一套序列化机制( Writable),
    — 精简,高效。不用像 java 对象类一样传输多层的父子关系,需要哪个属性就传输
    — 哪个属性值,大大的减少网络传输的开销。
  • 实现接口:Writable 是 Hadoop 的序列化格式,
  • — hadoop定义了这样一个Writable接口。
    — 一个类要支持可序列化只需实现这个接口即可。

6:InputFormat :

  • <FileInputFormat切片机制:>
    ① 简单地按照文件的内容长度进行切片
    ② 切片大小,默认等于block大小
    切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
    比如待处理数据有两个文件
    a1.txt 320M
    a2.txt 10M
    经过FileInputFormat的切片机制运算后,形成的切片信息如下:
    a.txt.split1-- 0~128
    a1.txt.split2-- 128~256
    a1.txt.split3-- 256~320
    a2.txt.split1-- 0~10M
  • <CombineTextInputFormat切片机制:>
    1:— 框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,
    — 这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下
    2:—CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值