MapReduce极简教程ITeye - 众发娱乐

MapReduce极简教程ITeye

2019-01-10 21:38:26 | 作者: 孤风 | 标签: 数据,核算,一个 | 浏览: 1603

一个风趣的比方

你想数出一摞牌中有多少张黑桃。直观办法是一张一张查看而且数出有多少张是黑桃?


 

MapReduce办法则是:

给在座的一切玩家中分配这摞牌

让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目报告给你

你把一切玩家通知你的数字加起来,得到终究的定论

拆分

MapReduce兼并了两种经典函数:

映射(Mapping)对调集里的每个方针运用同一个操作。即,假如你想把表单里每个单元格乘以二,那么把这个函数独自地运用在每个单元格上的操作就归于mapping。

化简(Reducing )遍历调集中的元从来回来一个归纳的成果。即,输出表单里一列数字的和这个使命归于reducing。

从头审视上面的比方

从头审视咱们本来那个涣散纸牌的比方,咱们有MapReduce数据剖析的根本办法。友谊提示:这不是个谨慎的比方。在这个比方里,人代表核算机,由于他们一同作业,所以他们是个集群。在大多数实践运用中,咱们假定数据已经在每台核算机上了 – 也就是说把牌分发出去并不是MapReduce的一步。(事实上,在核算机集群中怎么存储文件是Hadoop的实在中心。)

经过把牌分给多个玩家而且让他们各自数数,你就在并行履行运算,由于每个玩家都在一同计数。这一同把这项作业变成了散布式的,由于多个不同的人在处理同一个问题的进程中并不需求知道他们的街坊在干什么。

经过通知每个人去数数,你对一项查看每张牌的使命进行了映射。 你不会让他们把黑桃牌递给你,而是让他们把你想要的东西化简为一个数字。

别的一个有意思的状况是牌分配得有多均匀。MapReduce假定数据是洗过的(shuffled)- 假如一切黑桃都分到了一个人手上,那他数牌的进程或许比其他人要慢许多。

假如有满足的人的话,问一些更风趣的问题就恰当简略了 - 比方“一摞牌的平均值(二十一点算法)是什么”。你可以经过兼并“一切牌的值的和是什么”及“咱们有多少张牌”这两个问题来得到答案。用这个和除以牌的张数就得到了平均值。

MapReduce算法的机制要远比这杂乱得多,可是主体思维是共同的 – 经过涣散核算来剖析很多数据。无论是Facebook、NASA,仍是小创业公司,MapReduce都是现在剖析互联网等级数据的干流办法。

什么是大数据?

大数据是很多数据的调集,数据量之大以至于用传统的核算办法无法处理如此巨大的数据。比方,Facebook和Youtube在日常中收集和办理的很多数据就归于大数据的领域。大数据不仅仅是指数据的规划和数量巨大,它一般还包括以下一个或多个方面:处理数据的速度、数据的品种、体积以及杂乱度。

为什么是MapReduce?

传统的企业体系有一个中心服务器来保存和处理数据。下图为传统的企业体系的原理图。传统的模型不适合处理海量的数据,也不适用于规范的数据库。而且,中心处理体系在一同处理多个文件的时分遇到了瓶颈。


 

Google运用了一个叫MapReduce的算法处理了这个瓶颈。MapReduce把一个使命拆分红了多个小使命,并把子使命分配到多台核算机上进行作业。终究,每台核算机上的核算成果会被收集起来并兼并成终究的成果。


 

MapReduce是怎么作业的?

MapReduce算法包括两部分重要的使命:Map和Reduce.

Map使命把一个数据集转化成另一个数据集,独自的元素会被拆分红键值对(key-value pairs).

Reduce使命把Map的输出作为输入,把这些键值对的数据兼并成一个更小的键值对数据集.

让咱们经过下图了解一下MapReduce每个阶段的作业,并了解他们的重要性。


 

Input Phase- 在本阶段咱们运用一个Record Reader对输入文件中的每一条数据转换为键值对的方法,并把这些处理好的数据发送给Mapper。

Map- Map是是用户自定义的一个函数,此函数接纳一系列的键值对数据并对它们进行处理,终究生成0个或多个键值对数据。

Intermediate Keys- 由mapper生成的键值对数据被称为中心状况的键值对。

Shuffle and Sort- Reducer使命一般以Shuffle(搅动)和Sort(排序)开端。程序把分好组的键值对数据下载到本机,Reducer会在本机进行运转。这些独立的键值对数据会依照键值进行排序并构成一个较大的数据序列,数据序列中键值持平的键值对数据会被分在相同的一组,这样易于在Reducer使命中进行迭代操作。

Reducer- Reducer使命把分好组的键值对数据作为输入,而且对每一个键值对都履行Reducer函数。在这个阶段,程序会以不同的办法对数据进行兼并、挑选。一旦履行结束,Reducer会生成0个或多个键值对数据,并供给应终究一个处理进程。

Output Phase- 在输出阶段,经过record writer把从Reducer函数输出的键值对数据依照必定的格局写入到文件中。

让咱们经过下图来进一步了解Map和Reduce这两个使命是怎么作业的。


 

MapReduce比方

让咱们以一个实在的比方来了解MapReduce的威力。Twitter每天都会收到50亿条(有那么多?)推特,约每秒3000条。下图展现了Twitter是怎么运用MapReduce来办理这些数据的。


 

从上述插图中咱们可以看到MapReduce履行了以下这些行为 -

Tokenize- 处理器把推文以键值对的方法存放在maps中。

Filter- 把不想要的数据从maps中除掉,把挑选好的数据以键值对的方法保存。

Count- 对每个单词生成一个计数器。

Aggregate Counter- Prepares an aggregate of similar counter values into small manageable units.

根据MapReduce的处理进程示例--文档词频核算:WordCount

设有4组原始文本数据:

Text 1:the weather is goodText 2:today is good

Text 3:good weather is goodText 4:today has good weather

传统的串行处理办法(Java):

String[] text =newString[] { “hello world”, “hello every one”, “say hello to everyone in the world” };

HashTable ht=newHashTable();for(i = 0; i ++i) {

StringTokenizer st=newStringTokenizer(text[i]);while(st.hasMoreTokens()) {

String word=st.nextToken();if(!ht.containsKey(word)) {

ht.put(word,newInteger(1));

}else{intwc = ((Integer)ht.get(word)).intValue() +1;//计数加1ht.put(word,newInteger(wc));

}

}

}for(Iterator itr=ht.KeySet().iterator();  itr.hasNext(); ) {

String word=(String)itr.next();

System.out.print(word+ “: ”+ (Integer)ht.get(word)+“;   ”);

}

输出:good:  5;   has: 1;  is: 3;   the: 1;   today: 2;    weather: 3

根据MapReduce的处理进程示例--文档词频核算:WordCount

MapReduce处理办法

运用4个map节点:

map节点1:

输入:(text1, “the weather is good”)

输出:(the, 1), (weather, 1), (is, 1), (good, 1)

map节点2:

输入:(text2, “today is good”)

输出:(today, 1), (is, 1), (good, 1)

map节点3:

输入:(text3, “good weather is good”)

输出:(good, 1), (weather, 1), (is, 1), (good, 1)

map节点4:

输入:(text3, “today has good weather”)

输出:(today, 1), (has, 1), (good, 1), (weather, 1)

运用3个reduce节点:


 

MapReduce处理办法

MapReduce伪代码(完结Map和Reduce两个函数):

Class Mapper method map(String input_key, String input_value)://input_key: text document name//input_value: document contentsforeach word w in input_value:

EmitIntermediate(w,"1");

Class Reducer method reduce(String output_key, Iterator intermediate_values)://output_key: a word//output_values: a list of countsintresult = 0;foreach v in intermediate_values:

result+=ParseInt(v);

Emit(output_key, result);

3.上升到构架-主动并行化并躲藏低层细节

怎么供给一致的核算结构

MapReduce供给一个一致的核算结构,可完结:

—核算使命的区分和调度

—数据的散布存储和区分

—处理数据与核算使命的同步

—成果数据的收集整理(sorting, combining, partitioning,…)

—体系通讯、负载平衡、核算功用优化处理

—处理体系节点犯错检测和失效恢复

MapReduce最大的亮点

—经过笼统模型和核算结构把需求做什么(what need to do)与详细怎么做(how to do)分开了,为程序员供给一个笼统和高层的编程接口和结构

—程序员仅需求关怀其运用层的详细核算问题,仅需编写少数的处理运用自身核算问题的程序代码

—怎么详细完结这个并行核算使命所相关的许多体系层细节被躲藏起来,交给核算结构去处理:从散布代码的履行,到大到数千小到单个节点集群的主动调度运用

MapReduce供给的首要功用

—使命调度:提交的一个核算作业(job)将被区分为许多个核算使命(tasks), 使命调度功用首要担任为这些区分后的核算使命分配和调度核算节点(map节点或reducer节点); 一同担任监控这些节点的履行状况, 并担任map节点履行的同步操控(barrier); 也担任进行一些核算功用优化处理, 如对最慢的核算使命选用多备份履行、选最快完结者作为成果

—数据/代码互定位:为了削减数据通讯,一个根本原则是本地化数据处理(locality),即一个核算节点尽或许处理其本地磁盘上所散布存储的数据,这完结了代码向数据的搬迁;当无法进行这种本地化数据处理时,再寻觅其它可用节点并将数据从网络上传送给该节点(数据向代码搬迁),但将尽或许从数据地点的本地机架上寻觅可用节点以削减通讯推迟

—犯错处理:以低端商用服务器构成的大规划MapReduce核算集群中,节点硬件(主机、磁盘、内存等)犯错和软件有bug是常态,因而,MapReducer需求能检测并阻隔犯错节点,并调度分配新的节点接收犯错节点的核算使命

—散布式数据存储与文件办理:海量数据处理需求一个杰出的散布数据存储和文件办理体系支撑,该文件体系可以把海量数据散布存储在各个节点的本地磁盘上,但坚持整个数据在逻辑上成为一个完好的数据文件;为了供给数据存储容错机制,该文件体系还要供给数据块的多备份存储办理能力

—Combiner和Partitioner:为了削减数据通讯开支,中心成果数据进入reduce节点前需求进行兼并(combine)处理,把具有相同主键的数据兼并到一同防止重复传送; 一个reducer节点所处理的数据或许会来自多个map节点, 因而, map节点输出的中心成果需运用必定的战略进行恰当的区分(partitioner)处理,确保相关数据发送到同一个reducer节点

参阅:http://batxue.com/html/jsgh/20170921/1642.html。

欢迎我们参加架构师微信群进行沟通,可加群主微信:



 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章