很早之前就用过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. 1.8 range

    哈哈,前边忘了介绍这个知识点了,老是用人家,不介绍一下都不好意思了. range()函数是一个用来创建数字序列的函数. 问题来了,为什么要写函数? 封装代码啊,让使用者不需要关心具体业务逻辑是如何实现 ...

  2. day1(变量、常量、注释、用户输入、数据类型)

    一.变量 name = "SmallNine" 等号前面是变量名(标识符),等号后面是变量值 变量的主要作用:就是把程序运算的中间结果临时存到内存里,已备后面的代码继续调用. 变量 ...

  3. AWS EC2 通过Linux终端:使用ssh连接到Linux实例

    AWS的ubuntu主机登录用户是ubuntu 只能通过秘钥的方式登录 如果在linux终端通过ssh远程登录步骤如下: 假如申请EC2主机的时候下载的key名称叫my-key.pem,并保存在本地l ...

  4. mysql打不开表问题解决方案

    做开发时候某一表怎么也打不开,数据也不多,网上查了按下面这篇文章完美解决,但是要记得用root登录mysql: 记一次MySQL中Waiting for table metadata lock的解决方 ...

  5. R语言︱list用法、批量读取、写出数据时的用法

    列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可 以是任意对象,不同元素不必是同一类型.元素本身允许是其它复杂数据类型,比如,列表 的一个元素也允许是列表.例如: > ...

  6. Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in

    1.错误描述 严重: Exception sending context initialized event to listener instance of class org.springframe ...

  7. 你的变量究竟存储在什么地方 && 全局内存

    我相信大家都有过这样的经历,在面试过程中,考官通常会给你一道题目,然后问你某个变量存储在什么地方,在内存中是如何存储的等等一系列问题.不仅仅是在面试中,学校里面的考试也会碰到同样的问题.  如果你还不 ...

  8. SQL语句异常导致项目报错

    1.错误描述 严重:Exception occurred during processing request:Statement Callback;SQL[   ];OALL8处于不一致状态; nes ...

  9. ORA-00900: invalid SQL statement

    1.错误描述 SQL> startup;        startup        ORA-00900: invalid SQL statement 2.错误原因 3.解决办法

  10. Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...