|
MapReduce 的核心就是 Shuffle 过程,Shuffle 过程是贯穿于 map 和 reduce 两个过程的!在Map端包括Spill过程,在Reduce端包括copy和sort过程。 具体Shuffle过程如下:
-
MapTask 收集我们的map()方法输出的kv对,放到内存缓冲区中。
-
从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件,溢出前会按照分区针对key进行区内快排。
-
多个溢出文件会被合并成大的溢出文件。
-
在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对key进行排序。
-
ReduceTask 根据自己的分区号,去各个 MapTask 机器上取相应的结果分区数据。
-
ReduceTask 对收集后的数据进行合并跟归并排序。
-
进入 ReduceTask 的逻辑运算过程,调用用户自定义的reduce()方法。
-
Shuffle 中的缓冲区大小会影响到 MapReduce 程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。
3.6.3 Partition
MapReduce 默认的分区方式是hashPartition,在这种分区方式下,KV 对根据 key 的 hashcode 值与reduceTask个数进行取模,决定该键值对该要访问哪个ReduceTask。
MapReduce流程
MapTask 工作机制
-
Read阶段:MapTask 通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
-
Map阶段:将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
-
Collect收集阶段:它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
-
Spill阶段:先按照分区进行排序,然后区内按照字典对key进行快排,并在必要时对数据进行合并、压缩等操作。
-
Combine阶段:选择性可进行MapTask内的优化提速。
ReduceTask 工作机制
-
Copy阶段:从所有的MapTask中收集结果然后决定将数据放入缓存还是磁盘。
-
Merge阶段:copy数据时后天会对磁盘还有内存数据进行Merge。
-
Sort阶段:ReduceTask需对所有数据进行一次归并排序,方便执行reduce 函数。
-
Reduce阶段:调用用户 reduce() 函数将计算结果写到HDFS上。
3.6.2 Shuffle
-
另外还有一种办法,在Application类中,可以通过registerActivityLifecycleCallbacks监听Activity生命周期,不过这种办法也是传入了Activity的context,只不过在Application类中完成这个工作。
关于事件分发,事件到底是先到DecorView还是先到Window的?
经过上述一系列问题,是不是对Window印象又深了点呢?最后再看一个问题,这个是wanandroid论坛上看到的,
这里的window可以理解为PhoneWindow,其实这道题就是问事件分发在Activity、DecorView、PhoneWindow中的顺序。
当屏幕被触摸,首先会通过硬件产生触摸事件传入内核,然后走到FrameWork层(具体流程感兴趣的可以看看参考链接),最后经过一系列事件处理到达ViewRootImpl的processPointerEvent方法,接下来就是我们要分析的内容了:

(编辑:柳州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|