(4) Hadoop-MapReduce计算模型

来源:互联网 发布:非常完美知乎 编辑:程序博客网 时间:2024/05/22 04:46

1. MapReduce计算模型理解

  • 因为mapreduce是大型分布式计算框架 ,出先两个关键词 1.分布式 2.计算框架。 可以从名字中解读就是运行在不同服务器上面的负责计算处理数据的框架。 关于MapReduce就是别人的博客出现最多的关键词就 “分而治之” ,分就 想个大的问题 分成若干小问题去解决,最后在合并到一起。 类似与 算1到10的和 可以单独两个数进行运算,最后在合并到一起求和 。 因此这就是对于mapreduce的理解.这部分是我自己的理解。

  • MapReduce是一个分布式运算的框架,核心的功能是将用户编写的代码的业务逻辑同mapreduce自带核心组件共同整个成一个完整的分布式运算框架。将业务与计算分离,从而降低业务人员的开发难度 。

  • mapreduce不适用的场景

  • 对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分
    而治之的策略。并行计算的第一个重要问题是如何划分计算任务或者计算数据以
    便对划分的子任务或数据块同时进行计算。不可分拆的计算任务或相互间有依赖
    关系的数据无法进行并行计算

2. MapReduce 框架的结构

这里写图片描述

这里写图片描述

3. MapReduce程序的运行模式

3.1 本地运行模式

     Configuration conf = new Configuration();     conf.set("mapreduce.framework.name", "local");  // 设置本地模式      /指定本次job待处理数据所在hdfs上的目录,也可以指定本地目录,记住是本地目录,如果输出目录存在的会提示 输出目录必须是不存在的    FileInputFormat.setInputPaths(job, "D:\\wordcount\\input");    //指定本次job输出结果存放的路劲    FileOutputFormat.setOutputPath(job, new Path("D:\\wordcount\\output"));

3.2 集群运行模式

    指定运行模式后 用maven 打成jar 包 丢到 集群中 输出 hadoop jar *.jar 就可以了

4. 深入理解MapReduce运行原理

  • 首先数据是存储在hdfs上面,hdfs上面的数据都是以block块的形式存储,mapreduce框架首先对block进行逻辑上面的分片,每一片都说对应一个maptask任务,在map阶段输出的时候会对数据进行排序,合并,然后数据进行分发到不同的区,当数据到reduce阶段的时候,每次调用reduce函数都是处理每个区的内容,然后在输出到硬盘上面,输出的时候会出现以crc文件结尾的校验文件,还有partition的文件内容,区的数据量是由key的哈希值%以reduce的数据量 如果reduce 是3 分区就是三 。

这里写图片描述

4.1 关于mapreduce运行过程中一些调度问题

5. MapReduce序列化

  • 内存到磁盘的过程 –叫做序列化 或者bean对象在传输的过成叫做序列化
  • 反序列化 就是磁盘到内存 mapper –到 reduce的分区中

6. MapReduce的分区-Partitioner

  • 根据Key的不同在mapper阶段输出后 根据key 进行排序 去重。将内容输出不同的文件中。几个分区对应几个文件。reduce数量可以大于分区数 只是没有数据而已。

7. MapReduce的combiner

8. 实践案例

8.1 案例 1: WordCount

8.2 案例 2: 流量统计

  • 需求 统计每一个用户(手机号)所耗费的总上行流量、总下行流量,总流量

  • 分析

    数据: 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200

    (1.)输出 四个变量 电话号码 – 总上行流量、总下行流量,总流量

    自定义bean对象 ,map -reduce 要进行序列化 需要实现hadoop序列号接口Writable   

    (2.) 在map端 用电话号码作为key 用bean对象作为输出

8.3 案例 3: 流量统计

  • 需求 得出上题结果的基础之上再加一个需求:将统计结果按照总流量倒序排序

    1. map阶段的输出作为key 并且可以排序 注意如果bean对象作为key 可以进行排序,去重
    2. 在reduce阶段在返回

8.4 案例 4: 流量统计

  • 需求 将流量汇总统计结果按照手机归属地不同省份输出到不同文件中

    这里有个分区的问题,分区的实现类中getPartition 这个接受到的类型就mapper阶段输出的内容  reduce 数量可以大于分区的数量,就不是网reduce中传输数据

需要去做的事情

  1. 官网上面有很多配置去了解 可以自己随便看看 看中文版的不看英文版 ,高可用也很重要

mapreduce 思想

  1. 并行 1+ 2 ..
  2. 中位数 依赖关系

map 分布式计算

reduce 聚合阶段 汇总

优化的处理 数据分发 , 一个reduce 统计一个单词

代码动 数据不动 – 移动计算的代价 比移动计算的代价 低

maptask – mrappmaster –reduce

单词统计 必须要练习到手写也能搞定


partitioner 分区

  1. 设置reduce 的数量 会出现 对应数量的文件

    每个文件是有序 整体是无序的
  2. map 分发的数据 数据分发 按照 key哈希值/reducetask 取鱼 分配到对应的reduce中

  3. maptask = 逻辑分片数

    内存溢出到磁盘 combiner

原创粉丝点击