加入收藏 | 设为首页 | 会员中心 | 我要投稿 柳州站长网 (https://www.0772zz.cn/)- 基础存储、数据迁移、云安全、数据计算、数据湖!
当前位置: 首页 > 站长资讯 > 动态 > 正文

DevOps知识框架体系

发布时间:2021-01-27 13:23:19 所属栏目:动态 来源:互联网
导读:自定义的时候一般就是类继承Partitioner然后重写getPartition 方法。用户也可以设置ReduceTask数量,不过会遵循如下规则。 如果 ReduceTask 数 getPartition 数, 会多产生几个空的输出part-r-000xx。 如果 1 ReduceTask getPartition 数,会有部分数据无法

自定义的时候一般就是类继承Partitioner然后重写getPartition 方法。用户也可以设置ReduceTask数量,不过会遵循如下规则。

  • 如果 ReduceTask 数 > getPartition 数, 会多产生几个空的输出part-r-000xx。
  • 如果 1 < ReduceTask < getPartition 数,会有部分数据无法安放导致报错。
  • 如果ReduceTask = 1,不管MapTask端输出多少分区文件结果都是一个文件。
  • 分区必须从0开始,逐步累加。

比如 假设自定义分区数为5。

  • job.setNumReduceTasks(1):会正常运行,只不过会产生一个输出文件。
  • job.setNumReduceTasks(2):会报错。
  • job.setNumReduceTasks(6):大于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,所以这么一段调用链就形成了。

(编辑:柳州站长网)

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

    热点阅读