很早之前就用过Hadoop,但对MapReduce中的具体数据流向过程一直不甚明了,用Python Streamming的方式写了几个MapReduce,对这个过程有了一定的认识。

首先我们知道,MapReduce的输入数据以Block的形式存储在HDFS上,默认是以64MB的大小存放在DataNode上,之所以取这个这么大的值而非磁盘块大小是因为通过这种方式减少磁盘寻道时间所占比例。数据的元信息存储在NameNode上,但这里明显有一个单点问题,如果NameNode出现故障,我们就不知道数据具体存放在哪个DataNode上,为了避免这种问题的出现,我们可以在NameNode上mount一个NFS,同样的,DataNode也可能会出现故障,所以HDFS会为每个存储在其中的Block复制n份(默认为3份)。

HDFS屏蔽了内部这些复杂的数据复制,高可用等逻辑,对外提供给我们一个类似于Linux的简单API,操作HDFS时只需要在命令前加上hadoop fs,例如:

hadooop fs -put 可以将本地文件上传到HDFS

hadoop fs -tail 经常用于监控日志

hadoop fs -cat 可以输出文件

hadoop fs -text类似cat,但可以输出gzip压缩后的文件

.....

MapReduce

在没有MapReduce的情况下,我们会怎么处理大量数据呢?例如数据统计这种任务,很可能我们会选择HashMap,Trie这种数据结构(面试中经常会需要回答海量数据的算法问题,但实际生产环境通常会首选Hadoop来处理的),但一方面单机单个进程处理速度有限,另一方面,数据量过大很可能会OOM。

MapReduce直观上很好理解,比如我有很多扑克牌,想统计所有牌中四种花色分别有多少张,如果所有牌全部交给一个人来统计的话肯定会很慢,那么我们交给几个小伙伴,让他们并行地统计,最后将结果汇总一下即可,这就是Hadoop的核心过程:分而治之->规约。

分治的思想在计算机科学中十分常见,例如二分法等。实际上,如果你熟悉一些有函数式编程思想的语言,如Python,JavaScript的话(当然,如果学过Lisp更好了),相比已经对MapReduce过程有所了解,这里我以Python为例:

#实例来自廖雪峰的官方网站
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

上面的例子中首先定义一个函数f,再将该函数与一个list传入map函数中,这样f会作用到每个list中。

Hadoop 中的MapReduce与之类似,可以分为两步,Map过程可以将输入的键值对(k,v)映射成一个新的键值对(k1,v1),这之后,框架会对数据做shuffle, sort, partition, combine等操作。接下来Map的输出会作为Reduce的输入。

作为用户来讲,我们通常只需要实现其中的map和reduce这两个函数,其它步骤MapReduce框架已经实现好了,我们可以认为MapReduce在运行的过程当中会回调我们的方法,这里利用到了设计模式中的模板方法模式。

MapReduce浅析的更多相关文章

  1. [转]MapReduce浅析

    本文转自http://edisonchou.cnblogs.com/ 一.什么是MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大 ...

  2. Spark性能优化总结

    1. 避免重复加载RDD 比如一份从HDFS中加载的数据 val rdd1 = sc.textFile("hdfs://url:port/test.txt"),这个test.txt ...

  3. MapReduce实例浅析

    在文章<MapReduce原理与设计思想>中,详细剖析了MapReduce的原理,这篇文章则通过实例重点剖析MapReduce 本文地址:http://www.cnblogs.com/ar ...

  4. 大数据入门第七天——MapReduce详解(二)切片源码浅析与自定义patition

    一.mapTask并行度的决定机制 1.概述 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小, ...

  5. MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析

    作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程.Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件. 作业Job的全部状态维 ...

  6. MapReduce源代码浅析

    Thanks @读程序的手艺人 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvemhhbmZlbmc=/font/5a6L5L2T/fontsize ...

  7. Hadoop学习笔记—4.初识MapReduce

    一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来 ...

  8. 浅析mongodb中group分组

    这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定 ...

  9. Hadoop InputFormat浅析

    本文转载:http://hi.baidu.com/_kouu/item/dc8d727b530f40346dc37cd1 在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动 ...

随机推荐

  1. 剑指offer第四天

    25.复杂链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的 ...

  2. qt pro 设置编译参数,支持 xp

    #兼容 XP VS2015 5.01 版本 win32 { QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01 QMAKE_LFLAGS_CONSOLE = ...

  3. uva12325 暴力枚举

    这题刚开始我就贪心,直接wrong了,贪心适合可以取一个物体部分的题. 还是老实枚举吧,注意枚举要分类,不然可能会超时,还有注意答案是long long AC代码: #include<cstdi ...

  4. soj3129: windy和水星 -- 水星数学家 2

    注意int的范围:-2147483648-2147483647 如果输入会出现溢出,这题应该就是卡的这里.其使用long long就不用考虑这个. 加深:如果输入的数是很多位,直接当做字符串处理即可. ...

  5. hdu1242 Rescue bfs+优先队列

    直接把Angle的位置作为起点,广度优先搜索即可,这题不是步数最少,而是time最少,就把以time作为衡量标准,加入优先队列,队首就是当前time最少的.遇到Angle的朋友就退出.只需15ms A ...

  6. 最短路径问题(dijkstra-模板)

    #include<bits/stdc++.h> using namespace std; ][]; ]; ]; ][]; int n,x,y,s,m,e; int k; double mi ...

  7. 企业内部DNS跨国配置案例

    背景介绍:总公司与北京分公司均由总公司进行统一管理.总公司的主从DNS担任解析总公司服务器与北京分公司的服务器解析任务.总公司DNS委派其他两个公司管理自己域下的服务器解析任务.要求任何一个节点都能解 ...

  8. TCP协议的三次握手和四次分手

    HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...

  9. accordion 分类

    <!--accordion--><h1>accordion 分类</h1><div id="accordionId" class=&quo ...

  10. Meet Python

    关于python 入门书<Head First Python>的一些读书笔记,用以备忘. 下载安装Python 下载地址: https://www.python.org/downloads ...