很早之前就用过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. 聚类-K均值

    数据来源:http://archive.ics.uci.edu/ml/datasets/seeds 15.26 14.84 0.871 5.763 3.312 2.221 5.22 Kama 14.8 ...

  2. 《android开发进阶从小工到专家》读书笔记--HTTP网络请求

    No1: 客户端与服务器的交互流程: 1)客户端执行网络请求,从URL中解析出服务器的主机名 2)将服务器的主机名转换成服务器的IP地址 3)将端口号从URL中解析出来 4)建立一条从客户端与Web服 ...

  3. 吾八哥学Selenium(四):操作下拉框select标签的方法

    我们在做web页面自动化测试的时候会经常遇到<select></select>标签的下拉框,那么在Python里如何实现去操作这种控件呢?今天就给大家分享一下这个玩法.为了让大 ...

  4. Mybatis入门1

    关于Mybatis的快速入门可以分为这样几步: 1.引入依赖或者引入jar包 2.编写全局配置文件(Mybatis-config.xml) <?xml version="1.0&quo ...

  5. python 小练习之删除文件夹下的所有文件,包括子文件夹中的文件

    先屡一下思路 一步步怎么实现 1  要求是要删除所有文件(只是删除文件 而不是文件夹),所以 我们肯定要遍历这个文件目录 (for  in遍历) 2 每遍历一个元素时(文件),我们要判断该元素的属性是 ...

  6. asp.net动态网站repeater控件使用及分页操作介绍

    asp.net动态网站repeater控件使用及分页操作介绍 1.简单介绍 Repeater 控件是一个容器控件,可用于从网页的任何可用数据中创建自定义列表.Repeater 控件没有自己内置的呈现功 ...

  7. 项目使用EntityFramework需要做的几项工作

    1..新项目引用创建好的其他项目,比如实体类库.数据库业务.实体数据模型等需要用到的项目进行引用. 2.新项目使用NuGet获取AutoMapper和EntityFramework程序包进行安装引用, ...

  8. stm32开发之标准库的介绍

    1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描 ...

  9. 用DriverStudio开发USB驱动程序

    很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的.但是,现在也有不少人都开始借助一些辅助工具.笔者去年开始接触到DriverStudio,发现它 ...

  10. java.lang.NoClassDefFoundError: org/apache/jsp/jsp/Container_jsp

    1.错误描述 八月 20, 2014 7:10:18 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.servi ...