MapReduce浅析
很早之前就用过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浅析的更多相关文章
- [转]MapReduce浅析
本文转自http://edisonchou.cnblogs.com/ 一.什么是MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大 ...
- Spark性能优化总结
1. 避免重复加载RDD 比如一份从HDFS中加载的数据 val rdd1 = sc.textFile("hdfs://url:port/test.txt"),这个test.txt ...
- MapReduce实例浅析
在文章<MapReduce原理与设计思想>中,详细剖析了MapReduce的原理,这篇文章则通过实例重点剖析MapReduce 本文地址:http://www.cnblogs.com/ar ...
- 大数据入门第七天——MapReduce详解(二)切片源码浅析与自定义patition
一.mapTask并行度的决定机制 1.概述 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小, ...
- MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析
作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程.Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件. 作业Job的全部状态维 ...
- MapReduce源代码浅析
Thanks @读程序的手艺人 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvemhhbmZlbmc=/font/5a6L5L2T/fontsize ...
- Hadoop学习笔记—4.初识MapReduce
一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来 ...
- 浅析mongodb中group分组
这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定 ...
- Hadoop InputFormat浅析
本文转载:http://hi.baidu.com/_kouu/item/dc8d727b530f40346dc37cd1 在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动 ...
随机推荐
- Angular利用@ViewChild在父组件执行子组件的方法
代码如下: @Component({ selector: 'my-app', template: ` <step-bar #stepBar></step-bar> ` }) e ...
- php 网络爬虫2种方法
1,通过curl进行抓取再进行写入文件当中: $curlobj = curl_init(); // 初始化curl_setopt($curlobj, CURLOPT_URL, "https: ...
- Ceph神坑系列
1. 在使用librbd的过程中,发现一个如果ceph集群异常librbd函数不返回的问题,对librbd的源码进行跟踪,发现了rados接口中的rados_mon_op_timeout(how ma ...
- git 命令和使用场景总结
资料地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 http://w ...
- Docker系统八:Docker的存储驱动
Docker存储驱动 1. Docker存储驱动历史 Docker目前支持的greph driver包括: AUFS device-mapper btrfs overlayfs(重点) 关于各存储驱的 ...
- 转 Caffe学习系列(9):运行caffe自带的两个简单例子
为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...
- iOS.Animations.by.Tutorials.v2.0汉化(三)
第2章:Springs 在前一章中,您学习了如何创建UIKit的基本动画,包括如何提供起始值和结束值随着时间的UIKit,自动为你创建一个动画. 到目前为止,你的动画一直是单方向的流体运动.当你激活一 ...
- PCI9054芯片的型号说明及购买建议
个脚,这也是大部分人用到的:而"BI"结尾的是BGA封装的,225个脚,较少用到,对它不再多说. 这几种系列量产的时间如下: 年11月 年8月 年2月 年 年 年到2006年期间, ...
- java定时任务(三):timerTask定时任务
这种方式是纯粹的java代码,需要继承timerTask接口并重写run方法,创建这个类的时候就会调用run方法. 基本的使用逻辑是: 把自己需要处理的业务逻辑放在自己写的这个继承了timerTask ...
- Java和Flex整合报错(二)
1.错误原因 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...