从0开始学大数据
李智慧
同程艺龙交通首席架构师,前Intel大数据架构师,《大型网站技术架构》作者
立即订阅
14333 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么说每个软件工程师都应该懂大数据技术?
免费
预习模块 (3讲)
预习 01 | 大数据技术发展史:大数据的前世今生
预习 02 | 大数据应用发展史:从搜索引擎到人工智能
预习 03 | 大数据应用领域:数据驱动一切
模块一 Hadoop大数据原理与架构 (7讲)
04 | 移动计算比移动数据更划算
05 | 从RAID看垂直伸缩到水平伸缩的演化
06 | 新技术层出不穷,HDFS依然是存储的王者
07 | 为什么说MapReduce既是编程模型又是计算框架?
08 | MapReduce如何让数据完成一次旅行?
09 | 为什么我们管Yarn叫作资源调度框架?
10 | 模块答疑:我们能从Hadoop学到什么?
模块二 大数据生态体系主要产品原理与架构 (7讲)
11 | Hive是如何让MapReduce实现SQL操作的?
12 | 我们并没有觉得MapReduce速度慢,直到Spark出现
13 | 同样的本质,为何Spark可以更高效?
14 | BigTable的开源实现:HBase
15 | 流式计算的代表:Storm、Flink、Spark Streaming
16 | ZooKeeper是如何保证数据一致性的?
17 | 模块答疑:这么多技术,到底都能用在什么场景里?
模块三 大数据开发实践 (8讲)
18 | 如何自己开发一个大数据SQL引擎?
19 | Spark的性能优化案例分析(上)
20 | Spark的性能优化案例分析(下)
21 | 从阿里内部产品看海量数据处理系统的设计(上):Doris的立项
22 | 从阿里内部产品看海量数据处理系统的设计(下):架构与创新
23 | 大数据基准测试可以带来什么好处?
24 | 从大数据性能测试工具Dew看如何快速开发大数据系统
25 | 模块答疑:我能从大厂的大数据开发实践中学到什么?
模块四 大数据平台与系统集成 (6讲)
26 | 互联网产品 + 大数据产品 = 大数据平台
27 | 大数据从哪里来?
28 | 知名大厂如何搭建大数据平台?
29 | 盘点可供中小企业参考的商业大数据平台
30 | 当大数据遇上物联网
31 | 模块答疑:为什么大数据平台至关重要?
模块五 大数据分析与运营 (5讲)
32 | 互联网运营数据指标与可视化监控
33 | 一个电商网站订单下降的数据分析案例
34 | A/B测试与灰度发布必知必会
35 | 如何利用大数据成为“增长黑客”?
36 | 模块答疑:为什么说数据驱动运营?
模块六 大数据算法 (6讲)
37 | 如何对数据进行分类和预测?
38 | 如何发掘数据之间的关系?
39 | 如何预测用户的喜好?
40 | 机器学习的数学原理是什么?
41 | 从感知机到神经网络算法
42 | 模块答疑:软件工程师如何进入人工智能领域?
智慧写给你的寄语 (1讲)
所有的不确定都是机会——智慧写给你的新年寄语
结束语 (2讲)
结束语 | 未来的你,有无限可能
第2季回归丨大数据之后,让我们回归后端
从0开始学大数据
登录|注册

08 | MapReduce如何让数据完成一次旅行?

李智慧 2018-11-15
上一期我们聊到 MapReduce 编程模型将大数据计算过程切分为 Map 和 Reduce 两个阶段,先复习一下,在 Map 阶段为每个数据块分配一个 Map 计算任务,然后将所有 map 输出的 Key 进行合并,相同的 Key 及其对应的 Value 发送给同一个 Reduce 任务去处理。通过这两个阶段,工程师只需要遵循 MapReduce 编程模型就可以开发出复杂的大数据计算程序。
那么这个程序是如何在分布式集群中运行起来的呢?MapReduce 程序又是如何找到相应的数据并进行计算的呢?答案就是需要 MapReduce 计算框架来完成。上一期我讲了 MapReduce 既是编程模型又是计算框架,我们聊完编程模型,今天就来讨论 MapReduce 如何让数据完成一次旅行,也就是 MapReduce 计算框架是如何运作的。
首先我想告诉你,在实践中,这个过程有两个关键问题需要处理。
如何为每个数据块分配一个 Map 计算任务,也就是代码是如何发送到数据块所在服务器的,发送后是如何启动的,启动以后如何知道自己需要计算的数据在文件什么位置(BlockID 是什么)。
处于不同服务器的 map 输出的 <Key, Value> ,如何把相同的 Key 聚合在一起发送给 Reduce 任务进行处理。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《从0开始学大数据》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(55)

  • 张贝贝
    有个问题,为什么mapper计算完的结果要放到硬盘呢?那再发送到reducer不是还有个读取再发送的过程吗?这中间不就有一个重复的写和读的过程吗?

    作者回复: 是的,主要为了可靠性,spark就不写硬盘,所以快。

    2018-11-15
    44
  • 冬冬
    老师您好,有个问题,当某个key聚集了大量数据,shuffle到同一个reduce来汇总,考虑数据量很大的情况,这个会不会把reduce所在机器节点撑爆?这样任务是不是就失败了?

    作者回复: 会的,数据倾斜,会导致任务失败。严重的数据倾斜可能是数据本身的问题,需要做好预处理

    2018-11-16
    38
  • 格非
    MapReduce的思想有点类似分而治之,将一个大任务分割成小任务,分发给服务器去处理,然后汇总结果,这是MapReduce的优势,但是MapReduce也就限制在了只能处理这种可以分割的任务上,比如,统计文本中的不同单词的个数,不知道我这种想法是否正确,还想请老师指教,另外,能否分享一下MapReduce这种技术的局限性呢?

    作者回复: 是的,比如MapReduce没法计算斐波那契数列,因为不能分片计算。
    但是大数据场景几乎都是可以分片计算的。

    2018-11-15
    27
  • 清清
    老师讲得很好,同学问的问题也很好,有些疑问翻评论区就解决了
    2018-11-22
    13
  • 星辰
    1.数据从PC/Mobile端发动给服务器端
    2.服务器端收到数据后在分布式集群下会进入到某个Server端,数据经过一系列的业务操作后可能会被记录下来
    3.这些记录下来的数据会以文件形式存放于某个固定位置
    4.数据推送工具可将这些固定位置的文件推送到大数据平台
    5.大数据平台的Map Reduce框架会根据程序应用主动读取数据作为Map/Reduce的数据输入
    6.大数据平台清晰完数据后以文件形式输出
    7.服务器端去大数据平台存放文件的位置获取文件,并进行解析入库。
    8.最终,数据以图形形式展示在报告上。
    2018-11-17
    13
  • hunterlodge
    老师,您给出的Partitioner的代码所反映的算法不会影响集群的扩展性吗?为什么不是采用一致性哈希算法呢?

    作者回复: 不会,调用partitioner是一个job的任务分配,动态的,结束了就完成了,不存在扩展性问题。

    2018-11-19
    8
  • 桂浩晋
    请问JobTracker和之前讲到的NameNode是在同一个服务器上的吗?

    作者回复: 通常不会

    2018-12-28
    7
  • hua168
    实际操作中是不是通过hive去完成MapReduce 的?
    如果有一台机子一直卡在那里,整个job就差它一个返回数据,是不是整个job在等待状态?这种怎么处理?

    作者回复: 如果是SQL操作,就用hive,不用自己编程MapReduce。

    如果机器故障导致某个任务很慢,MapReduce框架会启动多个任务进程在多个服务器同时计算同一个数据块,那个算完输出那个,不会一直等。
    需要一直等的是数据偏移,某个key聚集了太多数据,大量数据shuffle到一个reduce计算,job一直等这个任务。

    2018-11-15
    6
  • 细小软也会有梦想
    shuffle过程中的两次排序。这个很重要吧,需要提一下啊,我就被网易的面试官问过。
    2019-02-15
    5
  • slam
    想问下,在Hadoop上跑计算任务,在极端异常的条件下(数据机器down,网络隔离,namenode切换),能保证计算要么返回失败要么给出可信的结果吗?背景是这样的,考量在大数据平台上做资金的清算,非程序的错误,计算结果不能有错有漏,在单机db上这个肯定ok,不考虑事务前提下,Hadoop计算是否也毫无问题?可能考量数据一致性、任务状态一致性等方面,我了解太浅,想请教下老师,这种要求绝对计算准确的场景,hadoop目前胜任吗?

    作者回复: 没有问题,一般宕机也能计算完成,MapReduce有容错能力。计算结果不会有问题。

    2018-11-15
    5
  • still0007
    有一个疑问,之前讲到“移动计算而不是移动数据”,但是在shuffle的过程中,涉及到大量的移动数据,这又是为什么呢?

    作者回复: 移动计算主要是map阶段,reduce阶段数据还是要移动数据合并关联,不然很多计算无法完成

    2018-11-15
    4
  • 三木子
    文中第一幅图,map输入 中 0 hello world 12 Byte world ,这里数字代表什么意思了?是map 输入顺序下标吗?

    作者回复: map输入数据在文件中的偏移量

    2018-11-15
    4
  • shawn
    JobTracker创建JobInProcess ,JobinPrcess根据分片数目和设置reduce数目创建TaskInprocess。 那么它是如何决定具体在哪些服务器创建 task tracker呢?我觉得需要了解这个过程,才能明白大数据如何分配和使用资源的。 请老师解答下,谢谢!

    作者回复: 所有服务器都启动tasktracker,等待jobtracker分配任务,跟NameNode一样

    2018-11-19
    3
  • hua168
    hadoop可以通过实验去练习吧?一般什么配置?官网的说明文档能当扩展阅读吗?选择那个版本?

    作者回复: 可以,普通笔记本就可以,能,最新版

    2018-11-15
    3
  • 老男孩
    这个思考题感觉问的很开放,我只能按照我的理解回答一下。不管是手机端还是pc端发起的请求都是http或者https的请求,协议下层(tcp/ip)会根据请求地址建立连接把请求的数据(字节流)传输到服务端对应处理方法中。当然服务端需要对请求的地址url和对应的响应方法做映射。响应方法从request中读取对应的请求数据然后处理,最后把结果通过response返回给用户。响应完成后,不会保留之前的状态数据,但连接不一定就会断开,下次请求的时候就不用再重新建立连接了。
    2018-11-15
    3
  • 星极
    请问一下,map和reduce有绝对的先后关系吗,还是说可以一边map一边reduce

    作者回复: 绝对先后关系,一个reduce必须要他前置的所有map执行完才能执行。

    MapReduce框架会在85%的map程序执行完成时,开始启动reduce程序,reduce程序一边shuffle已完成的map数据,一边等待未完成的map继续执行,直到全部map完成,reduce才开始执行计算。

    2019-10-05
    2
  • 落叶飞逝的恋
    java程序用于合并mapper和reducer的代码。
    public class WordCountApp {
        public static void main(String[] args) throws Exception {
            //创建配置信息
            Configuration configuration = new Configuration();

            //创建Job
            Job worldCountJob = Job.getInstance(configuration, "WorldCount");

            //设置Job的处理类
            worldCountJob.setJarByClass(WordCountApp.class);

            //设置作业的输入路径
            FileInputFormat.setInputPaths(worldCountJob, new Path(args[0]));

            //设置map相关参数
            worldCountJob.setMapperClass(MyMapper.class);
            worldCountJob.setMapOutputKeyClass(Text.class);
            worldCountJob.setMapOutputValueClass(LongWritable.class);

            //设置reduce相关参数
            worldCountJob.setReducerClass(MyReducer.class);
            worldCountJob.setOutputKeyClass(Text.class);
            worldCountJob.setOutputValueClass(LongWritable.class);

            //设置作业的输出路径
            FileOutputFormat.setOutputPath(worldCountJob, new Path(args[1]));

            System.out.println(worldCountJob.waitForCompletion(true) ? 0 : 1);
        }
    }
    2019-03-04
    2
  • 杰之7
    通过这一节的复习,这节内容主要解决MR的启动和运行,数据的合并和连接机制。在这一节中,涉及到了大数据技术的核心技术,调用JAR包,执行机制中会将HDFS中的数据块联系起来,通过HTTP通信发送给相对应的reduce。这些内容设计到了Java编程,网络通信,Linux多服务器的知识,对这些基础知识的掌握是做数据技术的前提。

    在MR的启动和连接步骤中,首先通过应用程序将JAR包存储在HDFS中供将来服务器执行MR计算。
    应用程序提交Job给JobTrack,JobTrack创建Jobinprocess,Jobinprocess根据数据快和设置reduce数目创建TaskInprocess,这部也就将HDFS和MR关联了起来。TaskTracker与JobTracker通信,分配任务,然后TaskTracker根据任务类型和参数启动相应的Maop或者redece,找到JAR包执行任务。

    上述就完成了作业的启动和运行,对于数据的联合和合并,用到的是Shuffle,通过调用partiton接口,对Map产生的<key,value>分区选择,通过HTTP通过发送给对应的reduce执行。

    通过复习,这一节的内容贯穿了整个大数据技术的核心,涉及到了计算机的JAR,HTTP,Linux, 数据库的joinw,HDFS和MR的主从架构模式,值得我多次重复复习。
    2019-02-08
    2
  • 落叶飞逝的恋
    思考题:以百度搜索关键词为例:
    1.用户端与服务端三次握手
    2.服务端返回相关网页
    3.用户浏览器接受响应结果
    2018-11-16
    2
  • 滴答
    map进程快要计算完成的时候将执行分区并发送给reduce进程进行排序和合并,那请问老师map完全计算完成的时候是会再次发送给reduce然后reduce再做排序合并计算吗?那这两部分的排序如何保证整体排序,如果是reduce之后再排序的话那之前排序会不会不需要?

    作者回复: 所谓的快完成是指很多个map进程已经完成,一小部分map进程还没完成,这个时候启动shuffle,将完成的map输出发送给reduce,直到所有map都完成

    2018-11-15
    2
收起评论
55
返回
顶部