DevOps知识框架体系
|
自定义的时候一般就是类继承Partitioner然后重写getPartition 方法。用户也可以设置ReduceTask数量,不过会遵循如下规则。
比如 假设自定义分区数为5。
3.6.4 环形缓冲区 Map 的输出结果由 Collector 处理,每个 Map 任务不断地将键值对输出到在内存中构造的一个环形数据结构中。使用环形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据。 环形数据结构其实就是个字节数组byte[],叫kvbuffer,默认值100M。里面主要存储 数据 跟 元数据。中间有个分界点,并且分界点是变化的。当环形缓冲区写入的buffer的大小达到 80% 满足溢写条件的时候,开始溢写spill。系统有两个线程一个负责写入数据,一个负责spill数据。 数据: 存储 Key + Value + bufindex。其中 bufindex(即数据的存储方向)是一直闷着头地向上增长,比如bufindex初始值为0,一个Int型的key写完之后,bufindex增长为4,一个Int型的value写完之后,bufindex增长为8。 元数据: 元数据是为了排序而生,是关于数据描述的数据。 Kvmeta = Partition + keystart + valstart + valLength , 共占用4个Int长度,其中K的长度 = V的起点 - K的起点。
Kvmeta 的存放指针 Kvindex 每次都是向下跳四个 格子,然后再向上一个格子一个格子地填充四元组的数据。比如Kvindex初始位置是-4,当第一个键值对写完之后,(Kvindex+0)的位置存放partition的起始位置、(Kvindex+1)的位置存放keystart、(Kvindex+2)的位置存放valstart、(Kvindex+3)的位置存放value length,然后Kvindex跳到 -8位置,等第二个键值对和索引写完之后,Kvindex跳到-12位置。 事件的分发流程就比较清楚了: ViewRootImpl——>DecorView——>Activity——>PhoneWindow——>DecorView——>ViewGroup (这其中就用到了getCallback参数,也就是之前addView中传入的callback,也就是Activity本身) 但是这个流程确实有些奇怪,为什么绕来绕去的呢,光DecorView就走了两遍。 参考链接中的说法我还是比较认同的,主要原因就是解耦。 ViewRootImpl并不知道有Activity这种东西存在,它只是持有了DecorView。所以先传给了DecorView,而DecorView知道有AC,所以传给了AC。
Activity也不知道有DecorView,它只是持有PhoneWindow,所以这么一段调用链就形成了。 (编辑:柳州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

