Hadoop和YARN :map+shuffle+reduce走读
今天做了一个hadoop分享,总结下来,包括mapreduce,及shuffle深度讲解,还有YARN框架的详细说明等。
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
table.MsoTableGrid
{mso-style-name:网格型;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
一 引言
1、海量日志数据,提取出某日访问百度次数最多的那个IP
算法思想:分而治之+Hash
1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB 个IP地址;
3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;
4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;
2、Top K:统计最热门的10个查询串
假设目前有一千万个记录,请你统计最热门的10个查询串,要求使用的内存不能超过1G。
第一步、维护一个Key为Query字串,Value为该Query出现次数的HashTable,每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为 1;如果该字串在Table中,那么将该字串的计数加一即可。采用Hash Table的原因:查询速度非常的快,几乎是O(1)的时间复杂度。
第二步、堆顶存放的是整个堆中最小的数,现在遍历N个数,把最先遍历到的k个数存放到最小堆中,并假设它们就是我们要找的最大的k个数,X1>X2...Xmin(堆顶), 而后遍历后续的N-K个数,一一与堆顶元素进行比较,如果遍历到的Xi大于堆顶元素Xmin,则把Xi放入堆中,而后更新整个堆,更新的时间复杂度为logK,如果 Xi<Xmin,则不更新堆
最终的时间复杂度是:O(N) + N'*O(logK)
下面介绍另一种处理大数据的编程模式:mapreduce
二 Mapreduce
Hadoop 起源于 google’s 三篇papers:
1 mapreduce;
2 The google file system;
3 big table;
2.1 Mapreduce机制 –
from google paper
Mapreduce 是一种处理大数据的编程模式。
1执行概述图Execution
Overview
2Master的数据结构Master
Data Structures
对于每个map和reduce任务,master中保存着三个状态(idle, in-progress, or completed)和非空闲任务的机器id;master是map 到 reduce的管道;
3容错机制Fault
Tolerance
Master会周期性的ping每个worker,如果超时没有收到回应,则认为这个worker死了。
已完成和死掉的worker都会被master置成空闲状态,为了下一次调度
已经完成的map tasks不能重新执行,因为他们的输出保存在本地硬盘里;
已经完成的reduce task不需要重新执行,因为他们的输出已经保存在了全局的HDFS里面;
例如,Map task在worker A 执行失败了,稍后会在worker B再次执行,这时所有的reduce都需要重新执行,以为所有的reducer没有准备好从worker A读出改为从 worker B读入;
Map Reduce 是对大范围的worker失败有复原能力的,例如,有80台机器持续是unreachable状态,master为了保证进度的向前推进,简单的使unreachable机器 再次执行任务;
4 存储Locality
网络带宽是一个稀缺资源,所以我们利用GFS把文件保存在本地磁盘以节省带宽;
GFS把每个文件划分成64M的block,并且有3个副本在不同的机器上;所以master把map任务分配到有输入文件对应副本的机器上;若这个map任务失败,会转移到具有这个副本的同一网络的其它机器上再次执行;
5 任务粒度Task
Granularity
我们把map阶段划分长M pieces,把 reduce阶段划分成Rpieces,理想的M和R均比工作的机器数大很多。M和R应该多大好呢?master需要O(M+R)个调度决策和 O(M*R)个状态保存在内存;推荐M=200,000 and R=5,000, using 2,000 工作机器;
6备份任务Backup
Tasks
造成总的执行时间过长的原因主要是由某个任务的执行相对其它所有任务过慢,称为掉队者;造成这个任务掉队的可能原因是硬盘读写慢,或者这台机器在调度其它任 务,cpu,内存,硬盘或网络带宽资源被占用;
解决办法是当mapreduce任务将要执行完成时,master调度in-progress状态掉队任务的备份执行任务;我们调整这种机制,使占用的计算资源不高于一定的百分比并且实验表明不采用这种机制,时间会增长44%。
2.2 MapReduce 例子 – from yahoo
“Hello World” of MapReduce :
the Word Count algorithm
:
流程介绍:
Multiple Input files -> Map (Discarded
the offset and Split the text) -> Sort
and Shuffle(sorts the key-value pairs by key and it “shuffles” all
pairs with the same key to the same Reducer) -> Reduce (add up all counts)-> Output to R files
Java中Key-value pair格式:
Map’s input pattern (offset,text) -> (1: ‘Hadoop
uses’),(2: ‘ MapReduce‘)
Reduce’s input pattern (word,count) ->
(word1:1),(word2,[1,1])
Coding:见ssh
2.3 mapreduce 与机器学习
机器学习算法要是适用于hadoop必须重构算法,改写成mapreduce的分布式程序;有些机器学习算法很好改进,比如朴素贝叶斯就是天然的适用于mapreduce模式,因为先验概率和条件概率可以很好的分布式统计,然而有些机器学习算法却不容易改成分布式。
例子,k-means的分布式程序:
代码:
见ssh
2.4 详解shaffle过程
参考:http://langyu.iteye.com/blog/992916
shuffle总体概述图如上(来自官方文档);shuffle又叫洗牌或打乱,把map结果输入到reduce中,具体过程如下;左半部分细节图如下(来自博客)。
1 一个输入文件会被划分成很多64M的block,split分布式的输入到各个map中;
2 partition的作用是map之后的键值对需要确定分配给哪个reduce,partition会把hash(key)%R的reduce序号追加到map处理后的键值对尾,保存到中间缓存中;
3 spill:sort和combiner组成,网络带宽是十分宝贵的资源,为了节省带宽,排序并合并缓存中的map生成的键值对,例如(a,1)(a,1)合并(a,2);
4 merge:缓存快满的时候,会写入磁盘,上一步spill只是合并了缓存中的键值对,硬盘中有来自不同文件的键值对,需要再次合并相同key的value,也是为了减少带宽;例如 (a,2)(a,3)合并为(a,[2],[3]),再调用combine方法,形成(a,5),最后根据partition的hash地址发送到目标reduce中。
右半部分细节图:
1
copy:通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件,保存在缓存中(map后的结果存储在磁盘,由TaskTracker管理);
2
merge:跟map过程一样,缓存内容溢写到了磁盘,merge磁盘来自不同map的输出,合并相同key的value,输出到reduce中。
3
input:把全部缓存和磁盘的文件形成最终文件,输入到reduce中。
备注:至此两个步骤合起来才是整个shuffle的完整过程。我认为整个mapreduce过程应该是:
map + Shuffle+reduce才贴切。
3 hadoop1 和
hadoop2架构对比
由于MRv1 在扩展性、可靠性、资源利用率和多框架等方面存在明显不足,Apache开始尝试对MapReduce 进行升级改造,于是诞生了更加先进的下一代MapReduce 计算框架MRv2。由于MRv2 将资源管理模块构建成了一个独立的通用系统YARN,这直接使得MRv2 的核心从计算框架MapReduce 转移为资源管理系统YARN。
3.1 编程模型对比
v\:* {behavior:url(#default#VML);} Normal 7.8 磅 false EN-US /* Style Definitions */ v\:* {behavior:url(#default#VML);} Normal 7.8 磅 false EN-US /* Style Definitions */
|
|
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
YARN 负责资源管理和调度,而ApplicationMaster
仅负责一个作业的管理;MRv1 仅是一个独立的离线计算框架,而MRv2 则是运行于YARN 之上的MapReduce
YARN上可以支持运行出mapreduce外的多种计算框架,并能够统一管理和调度。
3.2 Hadoop1架构和Hadoop2架构对比
|
|
通过将原有JobTracker 中与应用程序相关和无关的模块分开,不仅减轻了JobTracker 负载,也使得Hadoop 支持更多的计算框架。
3.3 YARN基本组成结构
YARN 主要由ResourceManager、NodeManager、ApplicationMaster和Container 等几个组件构成。
1 Resource Manager:主要由两个组件构成:调度器(Scheduler)和(Applications Manager,ASM);调度器:将系统中的资源分配给各个正在运行的应用程序;应用程序管理器:应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster 运行状态并在失败时重新启动它等。
2 ApplicationMaster:
1)与RM 调度器协商以获取资源(用 Container 表示);
2)将得到的任务进一步分配给内部的任务;
3)与 NM 通信以启动 / 停止任务;
4)监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
3 NodeManager(NM):NM 是每个节点上的资源和任务管理器;
(NM与ApplicationMaster的区别是NM是控制整台机器资源和任务管理,而AM是控制每个应用的资源和任务管理)
4 Container:是YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
总结:hadoop2统称为YARN,YARN负责资源管理和任务调度,MR2只是上面的一个计算框架,YARN还可以支持Spark和Hbase等框架。
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
table.MsoTableGrid
{mso-style-name:网格型;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
Hadoop和YARN :map+shuffle+reduce走读的更多相关文章
- Hadoop :map+shuffle+reduce和YARN笔记分享
今天做了一个hadoop分享,总结下来,包括mapreduce,及shuffle深度讲解,还有YARN框架的详细说明等. v\:* {behavior:url(#default#VML);} o\:* ...
- Hadoop 中关于 map,reduce 数量设置
map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务 ...
- Python专题——五分钟带你了解map、reduce和filter
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第6篇文章,给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. 不知道大家看到ma ...
- 【hadoop】如何向map和reduce脚本传递参数,加载文件和目录
本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++ ...
- hadoop中map和reduce的数量设置问题
转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务 ...
- Hadoop map和reduce数量估算
Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数.首先分析一下job的maptask数,当一个job提交时,jobclient首先分析 ...
- Hadoop 系统配置 map 100% reduce 0%
之前在本地配置了hadoop伪分布模式,hdfs用起来没问题,mapreduce的单机模式也没问题. 今天写了个程序,想在伪分布式上跑一下mapreduce,结果出现 map 100% reduce ...
- hadoop 2.2.0 关于map和reduce的个数的设置
关于hadoop中的map过程,我的理解是每一个map系统会开启一个JVM进程来处理,map之间相互并行,map函数内串行.这样的想法是否正确? 由于想在hadoop集群上算一个初始输入数据不多,但是 ...
- (转) hadoop 一个Job多个MAP与REDUCE的执行
http://blog.csdn.net/chaoping315/article/details/6221440 在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进 ...
随机推荐
- JAVA截取后String字符串六位字符
public static void main(String[] args){ String cellphone="; String pwd = cellphone.substring(ce ...
- Java面试-容器的遍历
当我们用增强for循环遍历非并发容器(HashMap.ArrayList等),如果修改其结构,会抛出异常ConcurrentModificationException,因此在阿里巴巴的Java规范中有 ...
- jquery多级树形下拉菜单
效果图: 使用方法 (1)引入 jQuery 包,下载地址 (2)引入 zTree 包,下载地址 (3)引入 tree-select.js (4)$("#id").treeSele ...
- Hola!
个人资料 我叫Xenny,当然我还有很多名字,Tony.LTY.唐梦寒.soar.tafhack等等,这些都是我的昵称:但是用的最多的还是Xenny. Xenny的来历很扯,Xen是因为从XD中取了个 ...
- 取html里的img和去html标签
C# : public string RemoveHTML(string html) { html = Regex.Replace(html, @"<script[^>]*?& ...
- [AWS] Serverless & Lambda
因为Lambda 所以Serverless 进化过程 课程章节:https://edu.51cto.com//center/course/lesson/index?id=199646 作用和优势 ev ...
- javascript数组/对象数组的深浅拷贝问题
一.问题描述 在项目里的一个报名页面需要勾选两条信息(信息一和信息二),由于信息一和信息二所拥有的数据是一致的,所以后台只返回了一个对象数组,然后在前台设置了两个List数组来接收并加以区分.原型如下 ...
- Python集训营45天—Day07 (面向对象编程进阶)
目录 1. @property装饰器 2. 魔法方法 3. 类属性和实例属性 4.静态方法和类方法 5. 单继承和多继承 6. 多态 7. del 方法 序言:上个章节我们了解了面向对象的基础知识,这 ...
- Pandas对缺失值的处理
Pandas使用这些函数处理缺失值: isnull和notnull:检测是否是空值,可用于df和series dropna:丢弃.删除缺失值 axis : 删除行还是列,{0 or 'index', ...
- Python中的MRO(方法解析顺序)[转载]
本文转载至: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...