HDFS

主要是hdfs-site.xml参数调优

  • dfs.datanode.handler.count = 10 (默认线程数)
    设置原则=集群大小的自然对数 X 20,即20 logN,N为集群大小
  • dfs.namenode.edits.dir和dfs.namenode.name.dir尽量分开,达到最大写入延迟
  • 元数据FsImage多目录冗余存储配置

    YARN

    主要是yarn-site.xml参数调优

  • yarn.nodemanager.resource.memory-mb = 8192MB 节点物理内存

  • yarn.scheduler.maximum-allocation-mb = 8192MB 单个任务可申请的最对物理内存
  • Hadoop宕机
    控制Yarn同时运行任务数和每个任务最大内存
    写入文件过量造成NameNode宕机。name调高kafka的存储大小,控制kafka到HDFS写入速度,高峰期用kafka进行缓存,高峰期过去数据同步会自动跟上。

    MapReduce

    现在企业几乎不使用MR,推荐Spark和Flink。它主要的瓶颈在于两点:

    计算机性能

    CPU、内存、磁盘、网络

    I/O操作优化

  • 数据倾斜

  • map和reduce数配置不合理
  • map运行时间太长,导致reduce等待过久
  • 小文件过多
  • 大量的不可分割超大文件
  • spill次数过多
  • merge次数过多

    解决方案

    优化主要从数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜和常用的调优参数来解决。

    数据输入

  • 合并小文件,否则导致任务多,初始化多

  • 可采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景

    Map阶段

  • 减少spill溢写次数

  • 减少merge合并次数
  • 可选combine处理,减少IO

    Reduce阶段

  • 设置合理的map、reduce个数

  • 设置map、reduce共存
  • 规避使用reduce
  • 合理设置reduce端的buffer

    IO传输

  • 数据压缩(减少网络I/O的数据库,安装Snappy和lzo压缩编码器)

  • 使用SequenceFile二进制文件

    数据倾斜

  • 抽样和范围分区

  • 自定义分区
  • Combine聚合精简数据
  • Map join,尽量避免Reduce join

    常用的调优参数

mapred-site.xml
image.png
image.png
yarn-site.xml
image.png