MapReduce面试题

发布时间 2023-07-25 11:30:55作者: 郭培鑫同学

MapReduce优化方法

或如何减少map任务的启动
或如何减少磁盘io

  • 数据输入
  1. 小文件合并。使用抽象类CombineFileInputFormat作为输入处理。
  • map阶段
  1. 减少spill和merge次数。通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数,从而减少磁盘 IO;通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。

    map后进行combine操作。

  • reduce阶段

    1. 规避使用reduce。Reduce阶段会大量消耗资源。
    2. 合理设置map和reduce数量。
    3. 设置map和reduce同时进行。通过调整slowstart.completedmaps参数、减少reduce的等待时间。
    4. 合理设置reduce端的buffer。默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。也就是说,buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销:mapred.job.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用。这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整。
  • io传输时

    1. 合理采用数据压缩技术降低io传输量。
    2. 使用二进制文件。
  • 数据倾斜时
    分为:数据频率倾斜和数据大小倾斜。

  1. 使用Combine。
  2. 抽样原始数据进行合理分区。

MapReduce跑得慢的原因?

Mapreduce 程序效率的瓶颈在于两点:

1)计算机性能
  CPU、内存、磁盘健康、网络
 2)I/O 操作优化

1)数据倾斜
  2)map和reduce数设置不合理
  3)reduce等待过久
  4)小文件过多
5)大量的不可分块的超大文件
 6)spill次数过多
  7)merge次数过多等

HDFS小文件优化方法:

  • 存在的弊端:
  HDFS上每个文件都要在namenode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用namenode的内存空间,另一方面就是索引文件过大是的索引速度变慢。
  • 解决的思路:
    • Hadoop本身提供了一些文件压缩的方案。
    • 从系统层面改变现有HDFS存在的问题,其实主要还是小文件的合并,然后建立比较快速的索引。
  • 解决方案
  1. Hadoop Archive:是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样在减少namenode内存使用的同时。
  2. Sequence file:sequence file由一系列的二进制key/value组成,如果为key小文件名,value为文件内容,则可以将大批小文件合并成一个大文件。
  3. CombineFileInputFormat: CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。