本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
MapReduce 编程模型开发简单且功能强大,专门为并行处理大规模数据量而设计,接下来,通过一张图来描述 MapReduce 的工作过程,如图所示。
关于 MapReduce 编程模型的更多细节请参考我的这篇博客——MapReduce 编程模型到底是怎样的?
在上图中, MapReduce 的工作流程大致可以分为5步,具体如下:
输入 Map 阶段的数据源,必须经过分片和格式化操作。
每个 Map 任务都有一个内存缓冲区(缓冲区大小 100MB ),输入的分片( split )数据经过 Map 任务处理后的中间结果会写入内存缓冲区中。
如果写人的数据达到内存缓冲的阈值( 80MB ),会启动一个线程将内存中的溢出数据写入磁盘,同时不影响 Map 中间结果继续写入缓冲区。
在溢写过程中, MapReduce 框架会对 key 进行排序,如果中间结果比较大,会形成多个溢写文件,最后的缓冲区数据也会全部溢写入磁盘形成一个溢写文件,如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。
MapReduce 工作过程中, Map 阶段处理的数据如何传递给 Reduce 阶段,这是 MapReduce 框架中关键的一个过程,这个过程叫作 Shuffle 。
Shuffle 会将 MapTask 输出的处理结果数据分发给 ReduceTask ,并在分发的过程中,对数据按 key 进行分区和排序。
输入 ReduceTask 的数据流是<key, {value list}>形式,用户可以自定义 reduce()方法进行逻辑处理,最终以<key, value>的形式输出。
MapReduce 框架会自动把 ReduceTask 生成的<key, value>传入 OutputFormat 的 write 方法,实现文件的写入操作。
将数据写入本地磁盘前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
写入磁盘之前,线程会根据 ReduceTask 的数量,将数据分区,一个 Reduce 任务对应一个分区的数据。
这样做的目的是为了避免有些 Reduce 任务分配到大量数据,而有些 Reduce 任务分到很少的数据,甚至没有分到数据的尴尬局面。
如果此时设置了 Combiner ,将排序后的结果进行 Combine 操作,这样做的目的是尽可能少地执行数据写入磁盘的操作。
合并的过程中会不断地进行排序和 Combine 操作,
其目的有两个:一是尽量减少每次写人磁盘的数据量;二是尽量减少下一复制阶段网络传输的数据量。
最后合并成了一个已分区且已排序的文件。
为了将 key 相同的数据聚在一起, Hadoop 采用了基于排序的策略。
由于各个 MapTask 已经实现对自己的处理结果进行了局部排序,因此, ReduceTask 只需对所有数据进行一次归并排序即可。
合并的过程中会产生许多的中间文件(写入磁盘了),但 MapReduce 会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到 Reduce 函数。
导读: 记得数年前,当ASP.NET刚出现时,天下间Web开发框架中似乎出现了一个“巨人”,WebForms这种似乎人人都能掌握的开发框架几乎瞬间流行起来。如果谁还在用传统ASP这种控制与表现混合的开发方式,似乎立即变得低俗了许多。于是乎许许多多人都学会了拖控件+绑定的方式,“Web开发人员”也越来越多,一片红火,好不热闹。 风水轮流转,不知从什么时候开始Rails框架随着RoR忽
SCN的问题一旦出现,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用。在2012年第一季度的CPU补丁中,包含了一个关于SCN修正的重要变更,这个补丁提示,在异常情况下,Oracle的SCN可能出现异常增长,使得数据库的一切事务停止,由于SCN不能后退,所以数据库必须重建,才能够重用。我曾经在以下链接中描述过这个问题:Oracle使用6 Bytes记录SCN,也就是4...
GS-00001 : Failed to allocate 4592381952 bytes for sga在安装GaussDB 100,执行python install时发现如下错误:Error: Can not get instance '/opt/gaussdb/data' process pid,The detailed information: 'instance startup...
在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again”,网上一般说需要配置maxInMemorySize,自己测试发现,maxInMemorySize确实会影响结果,并且项目还跟写入文件到文件夹的transferTo(File dest)方法也有关系,...
要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行。而打包成jar包可以直接使用java命令执行。在linux系统中运行jar包主要有以下几种方式。一、java -jar XXX.jar这是最基本的jar包执行方式,但是当我们用ctrl+c中断或者关闭窗口时,程序也会中断执行。二、java -jar XXX.jar &&代表在后台运行,使用ctrl+c不会中断程序的运行,但是关闭窗口会中断程序的运行。三、no
本文假设hive已经做了基础安装,基础配置参考《Hive安装》配置hive-site.xml启动HiveServer2还需要下面的设置hive.support.concurrencytruehive.zookeeper.quorume3basestorage1,e3basestorage2,e3basestorage3hive.zookeeper.client.port9501hive.zooke...
本文收集整理关于linux执行命令在哪的相关议题,使用内容导航快速到达。内容导航:linux6和7版本修改默认启动级别是不相同的,那么我们来说一说,怎么修改默认启动级别?linux6的修改方法,修改文件/etc/inittab里面的文件,修改成级别3,就可以直接进入命令行模式。linux7版本采用 targets 来定义运行级别,通过 vim /etc/inittab 可看到定义: 1 2 mul...
摘 要:人类社会文明的进步与发展过程中,数学在社会各领域中的应用越来越广泛,作用越来越大,已成为当代高新技术的重要组成部分。现代文明技术在计算机高度发展的今天,计算机科学技术在数学中应用越来越受到人们的关注。关键词:计算机科学技术;数学;应用在现代科学技术领域中,随着计算机的诞生和日益普及,教育教学也在不断发展,因此教育技术也有了翻天覆地的变化。计算机科学技术把教学媒体与传统教育相结合,不但深化教...
本文为 10 月 29 日,圣何塞州立大学——刘遥行的论文共读直播分享实录。Google DeepMind 团队在 Nature 上发表的最新论文,阐述了新版 AlphaGo 是如何从空白状态学起,不使用任何人类棋谱,通过自对弈强化学习,仅用 3 天训练时间就以 100:0 击败了上一版本的 AlphaGo,并用 21 天达到 AlphaGo Master 水平。A
前言一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210421。7、为项目添加日志logging模块介绍 logging格式输出 为项目添加log日志logging.basicConfig()函数说明logging模块的格式字符串实例1:import loggingmy_format='%(asctime)s-%(filename)s-%(module)s-%(lineno)d'# 输出的格式内容logging.basi..
本科毕业论文基于MFC的局域网聊天工具Instant Messaging of LAN Based on MFC姓名:学号:院系:指导教师:摘要关键字:局域网;即时通讯;Win32;API;MFC;SOCKET;多线程AbstractKeywords: LAN; Instant Messaging(IM); MutiThread; Win32; API; MFC; SOCKET目录第一章 引言- ...
本文从网上搜集了一些 Django 定义属性的知识并进行整理,大家可以及时收藏方便随时查看。内容包括概述、库、逻辑删除、字段类型、字段选项、关系