浅谈MapReduce的原理及编程

什么是MapReduce

MapReduce是一个分布式计算框架;
它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务;适用于大规模数据处理场景;每个节点处理存储在该节点的数据;每个 job 包含Map和Reduce两部分

在这里插入图片描述

MapReduce的设计思想

1、分而治之

  • 简化并行计算的编程模型

2、构建抽象模型

  • 开发人员专注于实现 Mapper 和 Reduce 函数

3、隐藏系统层细节

  • 开发人员专注于业务逻辑实现

MapReduce特点

1、优点

  • 易于编程
  • 可扩展性
  • 高容错性
  • 高吞吐量

2、不适用领域

  • 难以实时计算
  • 不适合流式计算

MapReduce实现WordCount

在这里插入图片描述

MapReduce执行过程

1、数据定义格式

  • map: (K1,V1) → list (K2,V2)
  • reduce: (K2,list(V2)) → list (K3,V3)

2、MapReduce执行过程

  • Mapper
  • Combiner
  • Partitioner
  • Shuffle and Sort
  • Reducer
    在这里插入图片描述

Hadoop MR引擎

1、Job Tracker

  • 运行在Namenode
  • 接受客户端Job请求
  • 提交给Task Tracker

2、Task Tracker

  • 从Job Tracker接受任务请求
  • 执行map、reduce等操作
  • 返回心跳给Job Tracker

在这里插入图片描述

Hadoop YARN

分布式资源管理系统

  • 支持更多的计算引擎,兼容 MapReduce
  • 更好的资源管理,减少 Job Tracker 的资源消耗
  • 将 Job Tracker 的资源管理分为 ResourceManager
  • 将 Job Tracker 的作业调度分为 ApplicationMaster
  • NodeManager 成为每个节点的资源和任务管理器

在这里插入图片描述

Hadoop及YARN架构

在这里插入图片描述

Hadoop2 MR在Yarn上运行流程

在这里插入图片描述

InputSplit(输入分片)

1、在map之前,根据输入文件创建inputSplit

  • 每个InputSplit对应一个Mapper任务
  • 输入分片存储的是分片长度和记录数据位置的数组

2、block和split的区别

  • block是数据的物理表示
  • split是块中数据的逻辑表示
  • split划分是在记录的边界处
  • split的数量应不大于block的数量(一般相等)

在这里插入图片描述

Shuffle阶段

  • 数据从Map输出到Reduce输入的过程

在这里插入图片描述

Key&Value类型

1、必须可序列化(serializable)

  • 作用:网络传输以及持久化存储
  • IntWritable、LongWriteable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等

2、都继承了Writable接口

  • 并实现write()和readFields()方法

3、Keys必须实现WritableComparable接口

  • Reduce阶段需要sort
  • keys需要可比较

MapReduce编程模型

在这里插入图片描述

InputFormat接口

1、定义了如何将数据读入Mapper

  • InputSplit[] getSplits
  • InputSplit表示由单个Mapper处理的数据
  • getSplits方法将一个大数据在逻辑上拆分为InputSplit
  • RecordReader<K,V> getRecordReader

2、常用InputFormat接口实现类

  • TextInputFormat
  • FileInputFormat
  • KeyValueInputFormat
    在这里插入图片描述

Mapper类

Mapper主要方法

  • void setup(Context context)
    org.apache.hadoop.mapreduce.Mapper.Context
  • void map(KEY key, VALUE value, Context context)
    为输入分片中的每个键/值对调用一次
  • void cleanup(Context context)
  • void run(Context context)
    可通过重写该方法对Mapper进行更完整控制

Combiner类

1、Combiner相当于本地化的Reduce操作

  • 在shuffle之前进行本地聚合
  • 用于性能优化,可选项
  • 输入和输出类型一致

2、Reducer可以被用作Combiner的条件

  • 符合交换律和结合律

3、实现Combiner

  • job.setCombinerClass(WCReducer.class)

Partitioner类

1、用于在Map端对key进行分区

  • 默认使用的是HashPartitioner
    获取key的哈希值
    使用key的哈希值对Reduce任务数求模
  • 决定每条记录应该送到哪个Reducer处理

2、自定义Partitioner

  • 继承抽象类Partitioner,重写getPartition方法
  • job.setPartitionerClass(MyPartitioner.class)

Reducer类

Reducer主要方法

  • void setup(Context context)
    org.apache.hadoop.mapreduce.Reducer.Context
  • void reduce(KEY key, Iterable values, Context context)
    为每个key调用一次
  • void cleanup(Context context)
  • void run(Context context)
    可通过重写该方法来控制reduce任务的工作方式

OutputFormat接口

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值