溢写文件在哪(MapTask 工作流程)

  1. Mapper 的 run() 方法
  2. Mapper 的 cleanup() 方法
  3. output.close(mapperContext) 中
  4. collector.flush() 将环形缓冲区中的数据溢写到文件中
  5. sortAndSpill() 排序和溢写文件, 该方法中的 filename 就是溢写文件所在的位置, 一般文件名为 spill0.out
  6. mergePart() 溢写文件归并为一个文件, 通过 file.out.index 来记录每个分区的索引位置, 用以在一个文件中区分多个分区

ReduceTask 工作流程

  1. Reducer 的 run() 方法
  2. initialize() 设置默认的 OutputFormat 为 TextOutputFormat
  3. shuffleConsumerPlugin.init()
  4. new ShuffleSchedulerImpl(): 获取reduceTask的个数
  5. createMergeManager(context): 初始化内存和磁盘
  6. run()
    1. eventFetcher.start(): ReduceTask主动去拉取
    2. copyPhase.complete(): copy阶段结束
  7. sortPhase.complete(): sort阶段结束
  8. reducer.run(): 每个ReduceTask只拉取至多一个分区的数据, 进入该方法一次, 最终进入到 XXXReducer 类中的 reducer() 方法

分文件输出

  • 分区

    优点: 简单

    缺点: 不能够控制输出文件名

  • 自定义 OutputFormat

    优点: 可以指定输出文件名

解决数据倾斜问题

reduceJion -> mapJion (缓存小表)


   转载规则


《》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Hadoop介绍Hadoop是什么 Hadoop是由Apache基金会所开发的分布式系统基础架构 主要解决海量数据的存储和分析计算问题 Hadoop通常是指Hadoop生态圈 Hadoop优势 高可靠性 通过数据冗余存储实现可靠性 高扩
2022-11-11
下一篇 
InputFormat输入接口 FileInputFormat<K,V>TextInputFormat 默认实现方式 默认实现方式, 一次读取一个文件 //TextInputFormat的输入类型默认为LongWritable
2022-11-11
  目录