提高计算机性能的方案
提高处理器字长
Intel:1971年的4bits到2005年的64bits
提高集成度
摩尔定律:芯片集成度每18个月翻一倍,计算性能提高一倍
流水线等微体系结构技术
指令级并行(instruction-Level Parallelism)
RISK结构
流水线
顾客A(表示指令1),顾客B(表示指令2)这A、B两个顾客准备去洗车。而洗车的标准流程如下:

指令级并行

举个例子:两个人进行制作食品
1:用原料机做出样品
2:利用工具将样品精细化
3:包装机上包装
若此时所有工具都是只有一个
方案一:A全部进行完后再进行B
方案二:A进行1后B进行1此时A进行2.这就是流水线作业

数据级并行

我们考虑下面这个计算式子:(a+b)*(c+d)
该计算过程被分解为三步:
e = a +b 2. f = c +d 3. m = e * f
早期的计算机一次只能处理一条指令,它要先算步骤1(加法操作),再算步骤2(加法操作),最后算3(乘法操作)。需要三步(花费三个指令)得到答案。
但是我们观察到:
3的结果依赖于1和2,而1和2都单纯的加法操作,所以开始想办法让1和2同时计算,那么CPU只要两步得到答案,步骤1和2一次算出来的结果,直接进行乘法运算。
它运用了SIMD(Single -Instruction ,Multple -Data)单指令多数据流技术。一个指令执行了(a,b,c,d) 4个操作数。SIMD指令集可以提供更快的图像,声音,视频数据等运行速度

用户请求mapreduce的流程

1.有一个待处理的大数据
2.系统中有一个负责调度的主节点(Master),以及数据Map和Reduce工作节点(Worker)
3:用户作业程序提交给主节点
4.主节点为作业程序寻找和配备可用的Map节点和Reduce节点,并将程序传送给map节点 Reduce节点
每个Map节点执行程序,每个map节点尽可能读取本地或本机架的数据进行计算
7.每个Map节点处理读取的数据块,并做一些数据整理工作(combining, sorting等)并将中间结果存放在本地;同时通知主节点计算任务完成并告知中间结果数据存储位置
8.主节点等所有Map节点计算完成后,开始启动Reduce节点运行;Reduce节点从主节点所掌握的中间结果数据位置信息,远程读取这些数据
9.Reduce节点计算结果汇总输出到一个结果文件即获得整个处理结果
大数据存储与处理——第五周Mapreduce
优化:
带宽优化
问题:大量的键值对数据在传送给Reduce节点时会引起较大的通信带宽开销。
解决方案:每个Map节点处理完成的中间键值对将由combiner做一个合并压缩,即把那些键名相同的键值对归并为一个键名下的一组数值。

大数据存储与处理——第五周Mapreduce
计算优化
问题:Reduce节点必须要等到所有Map节点计算完成,才能开始执行,因此,如果有一个计算量大、或者由于某个问题导致很慢结束的Map节点,则会成为严重的“拖后腿者”。
解决方案:把一个Map计算任务让多个Map节点同时做,取最快完成者的计算结果。冗余处理

问题 :一个Reduce节点上的计算数据可能会来自多个Map节点,因此,为了在进入Reduce节点计算之前,需要把属于一个Reduce节点的数据归并到一起。
解决方案:在Map阶段进行了Combining之前,可以根据一定的策略对Map输出的中间结果进行分区(partitio例如:有一个巨大的数组,其最终结果需要排序,每个Map节点数据处理好后,为了避免在每个Reduce节点本地排序完成后还需要进行全局排序,我们可以使用一个分区策略如:(d%R),d为数据大小,R为Reduce节点的个数,则可根据数据的大小将其划分到指定数据范围的Reduce节点上,每个Reduce将本地数据排好序后即为最终结果ning),这样既可解决以上数据相关性问题避免Reduce计算过程中的数据通信。

过程详解

MAP:
数据 this is aaa and this is bbb
1:map task:将Block文件拆分成key/value键值对 【类似于split操作】
<“aaa”,1><“this”,1> <“is”,1><“and”,1><“this”,1><“is”,1><“bbb”,1>

2:shuffle-spill
溢写:我们的key/value对以及Partition的结果都会被写入缓冲区【缓冲区的作用是批量收集map结果,减少磁盘IO的影响】,这个内存缓冲区是有大小限制的,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spil
在Spil过程中,我们会进行sort,Combiner
此时又两个线程执行,一个是往缓冲区写map结果的线程,另一个是溢写进程
注意:整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。

接下来需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序
<“aaa”,1><“and”,1><“bbb”.1><“is”,1> <“is”,1><“this”,1><“this”,1>
使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢 写到磁盘的数据量。
<“aaa”,2><“bbb”.1><“is”,2><“this”,2>
3:shuffle-Merge
如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在,因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge
map1:<“aaa”,2><“bbb”.1><“is”,2><“this”,2>
map2:<“aaa”,3><"<“this”,2>
merge生成一个文件:<“aaa”,[2,3]><“bbb”.1><“is”,2><“this”,[2,3]>

4:MapReduce提供Partitioner接口,默认对key hash后再以reduce task数量取模。
<“aaa”,[2,3],0><“bbb”.1,0><“is”,2,1><“this”,[2,3],1>【[这里如何分reduce task我也不会]

Reduce
1:Copy过程,简单地从不同的map端拉取数据。
2:归并merge 因为需要对数据进行归并排序==(部分有序而整体无序,所以需要在内存中归并)==
内存到内存merge:如果内存缓冲区中能放得下这次数据的话就直接把数据写到内存中
内存到磁盘merge:当内存缓存区中存储的Map数据占用空间达到一定程度的时候,开始启动内存中merge,把内存中的数据merge输出到磁盘上一个文件中,即内存到磁盘merge

3:一般情况下reducer上生成多个文件,这时开始执行合并操作,即磁盘到磁盘merge:此时利用的是归并排序
4:reduce
大数据存储与处理——第五周Mapreduce

参考资源:
https://blog.csdn.net/asn_forever/article/details/81233547
https://www.cnblogs.com/end/archive/2013/01/18/2866001.html
http://blog.sina.com.cn/s/blog_45a7191b0102yyj2.html

相关文章:

  • 2021-08-22
  • 2021-06-24
  • 2021-05-24
  • 2021-07-02
  • 2021-09-05
  • 2022-12-23
  • 2022-01-10
猜你喜欢
  • 2021-10-16
  • 2021-05-22
  • 2021-06-23
  • 2021-06-26
  • 2021-05-27
  • 2021-11-18
相关资源
相似解决方案