专栏首页孙小白MapReduce之MapTask工作机制

MapReduce之MapTask工作机制

1. 阶段定义

MapTask:map----->sort map:Mapper.map()中将输出的key-value写出之前 sort:Mapper.map()中将输出的key-value写出之后

2. MapTask工作机制

  1. Read阶段 MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value
  2. Map阶段 该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
  3. Collect收集阶段 在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个内存缓冲区中,并且会被Partitioner计算一个分区号,按照先后顺序分配index下标
  4. Spill阶段
  • 即“溢写”,在此阶段有两个重要线程。收集线程负责向缓冲区收集数据,缓冲区初始值为100M,当使用到80%阈值,唤醒溢写线程,溢写线程会将缓冲区已经收集的数据溢写到磁盘。
  • 在溢写前,会对缓冲区中的数据进行排序(快速排序),在排序时,只通过比较key进行排序,只改变index的位置,不交换数据的位置
  • 排序后,按照分区,依次将数据写入到磁盘的临时文件的若干分区中
  • 每次溢写都会生成一个临时文件,当所有的数据都溢写完成之后,会将所有的临时文件片段合并为一个总的文件
  1. Combine阶段
  • 在合并时,将所有的临时文件的相同分区的数据,进行合并,合并后再对所有的数据进行排序(归并排序)
  • 最终生成一个结果文件(output/file.out),同时生成相应的索引文件output/file.out.index,这个文件分为若干分区,每个分区的数据已经按照key进行了排序,等待reduceTask的shuffle线程来拷贝数据!

溢写阶段详情:

  • 步骤1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号Partition进行排序,然后按照key进行排序。这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。
  • 步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中。如果用户设置了Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。
  • 步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据库系统的特点

    爱学习的孙小白
  • JVM的内存结构

    爱学习的孙小白
  • 初识Hadoop

    高速性(velocity):大数据要求处理速度快,比如淘宝双十一需要实时显示交易数据

    爱学习的孙小白
  • map和object相互转换的几种方法和对比

    从这点来看,beanutils比反射好用,它里面做了大量的转换工作,反射的方法更多需要你自己来处理。

    用户7634691
  • go语言map

    map是一种常用的数据存储结构,也叫HashMap, 散列表,字典等。通过键,可以快速的访问所存储的值。

    暮雨
  • 瑞德西韦今起免费供武汉重症患者试用,吉利德CEO:治病第一,不想卷入专利纠纷

    最新消息,被按谐音叫作“人民的希望”的抗病毒药物瑞德西韦(Remdesivir),今日已经武汉金银潭等一线医院开启临床试验。

    量子位
  • 日媒总结中国发展AI的三大优势,称后者将超越美国 | 热点

    镁客网
  • iBinary C++STL模板库关联容器之map/multimap

    map容器跟以上的容器都不同,它是一个 表存储结构. 也就是存储表的一个结构. 存储的是 key-value的方式. 所以我们使用的需要执行key的方式,以...

    IBinary
  • MySQL输入密码后闪退的解决方法 原

    醉生萌死
  • Chrome的桌面通知

    最近在使用朋友网(不加链接,避免有打广告的嫌疑),发现会出现提示“是否允许网站显示桌面通知?”,如下图所示:

    meteoric

扫码关注云+社区

领取腾讯云代金券