手机网站建设做竞价推广的技巧,网站效益分析,北京优化seo排名,网站名重复shuffle流程概括
因为频繁的磁盘I/O操作会严重的降低效率#xff0c;因此“中间结果”不会立马写入磁盘#xff0c;而是优先存储到Map节点的“环形内存缓冲区”#xff0c;在写入的过程中进行分区#xff08;partition#xff09;#xff0c;也就是对于每个键值对来说因此“中间结果”不会立马写入磁盘而是优先存储到Map节点的“环形内存缓冲区”在写入的过程中进行分区partition也就是对于每个键值对来说都增加了一个partition属性值然后连同键值对一起序列化成字节数组写入到缓冲区缓冲区采用的就是字节数组默认大小为100M。当写入的数据量达到预先设置的阙值后MapReduce.Map.io.sort.spill.percent,默认0.80或者80%便会启动溢写出线程将缓冲区中的那部分数据溢出写spill到磁盘的临时文件中并在写入前根据key进行排序sort和合并combine可选操作。溢出写过程按轮询方式将缓冲区中的内容写到MapReduce.cluster.local.dir属性指定的目录中。当整个Map任务完成溢出写后会对磁盘中这个Map任务产生的所有临时文件spill文件进行归并merge操作生成最终的正式输出文件此时的归并是将所有spill文件中的相同partition合并到一起并对各个partition中的数据再进行一次排序sort生成key和对应的value-list文件归并时如果溢写文件数量超过参数min.num.spills.for.combine的值默认为3时可以再次进行合并。至此Map端shuffle过程结束接下来等待reduce task来拉取数据。对于reduce端的shuffle过程来说reduce task在执行之前的工作就是不断地拉取当前job里每个Map task的最终结果然后对从不同地方拉取过来的数据不断地做merge最后合并成一个分区相同的大文件然后对这个文件中的键值对按照key进行sort排序排好序之后紧接着进行分组分组完成后才将整个文件交给reduce task处理。
分区是发生在溢出写过程之前也就是当满足溢出写条件时首先进行分区然后分区内排序并且选择性的combine最后写出到磁盘。
【Reducer如何知道自己应该处理哪些数据】
因为Map端进行partition的时候实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer)所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可。每个Reducer会处理一个或者多个partition。
【Reducer如何知道要从哪台机器上去的Map输出】
Map任务完成后它们会使用心跳机制通知它们的Application Master、因此对于指定作业Application Master知道Map输出和主机位置之间的映射关系。Reducer中的一个线程定期询问Master以便获取Map输出主机的位置。知道获得所有输出位置。