MapReduce 跑的慢的原因

MapReduce程序效率的瓶颈在于两点

  1. 计算机性能

    CPU,内存,磁盘健康,网络

  2. I/O操作优化

    • 数据倾斜

    • Map和Reduce数设置不合理

    • Map运行时间太长,导致Reduce等待过久

    • 小文件太多

    • 大量的不可且片的超大压缩文件

    • Spill次数过多

    • Merge次数过多

MapReduce优化方法

MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。

数据输入

  1. 合并小文件:

    在执行MR任务前将小文件进行合并,大量的小文件会产生大量的Map任务,增大Map任务装载次数,而任务的装载比较耗时,从而导致MR运行较慢

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

Map阶段

  1. 减少溢写(Spill)次数:

    通过调整mapreduce.task.io.sort.mb及mapreduce.map.sort.spill.percent参数值,增大触发Spill的内存上限,减少Spill次数,从而减少磁盘IO

  2. 减少合并(Merge)次数:

    通过调整mapreduce.task.io.sort.factor参数,增大Merge的文件数目,减少Merge的次数,从而缩短MR处理时间

  3. 在Map之后,不影响业务逻辑前提下,先进行Combine处理,减少I/O

Reduce阶段

  1. 合理设置Map和Reduce数:

    两个都不能设置太少,也不能设置太多。

    太少,会导致Task等待,延长处理时间;

    太多,会导致Map,Reduce任务间竞争资源,造成处理超时等错误

  2. 设置Map,Reduce共存

    调整mapreduce.job.reduce.slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间

  3. 规避使用Reduce:

    因为Reduce在用于连接数据集的时候将会产生大量的网络消耗

  4. 合理设置Reduce端的Buffer:

    默认情况下,数据达到一个阈值的时候,Buffer中的数据就会写入磁盘,然后Reduce会从磁盘中获得所有的数据,也就是说,Buffer和Reduce是没有直接关联的,中间多次写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得Buffer中的一部分数据可以直接输送到Reduce,从而减少IO开销:mapreduce.reduce.input.buffer.percent,默认为0,当值大于0的时候,会保留指定比例的内存读Buffer中的数据直接拿给Reduce使用。这样一来,设置Buffer需要内存,读取数据需要内存,Reduce计算也要内存,所以要根据作业的运行情况进行调整。

I/O传输

  1. 采用数据压缩的方式,减少网络IO的时间。安装Snappy和Lzo压缩编码器
  2. 使用SequenceFile二进制

数据倾斜问题

  1. 数据倾斜现象

    数据频率倾斜--某一个区域的数据量要远远大于其他区域

    数据大小倾斜--部分记录的大小远远大于平均值

  2. 减少数据倾斜的方法

    • 抽样和范围分区

      可以通过对原始数据进行抽样得到的结果集来预设分区边界值

    • 自定义分区

      基于输出键的背景知识进行自定义分区。例如,如果Map输出键的单词来源于一本书。且其中某几个专业词汇较多,那么就可以自定义分区将这些专业词汇发送给固定的一部分Reduce实例。而将其他的都发送给剩余的Reduce实例

    • Combiner

      使用Combiner可以大量地减少数据倾斜。在有可能的情况下,Combine的目的就是聚合并精简数据

    • 采用Map Join ,尽量避免Reduce Join

常用的调优参数

资源相关参数

(1)以下参数是在用户自己的MR应用程序中配置就可以生效(mapred-default.xml)

配置参数 参数说明
mapreduce.map.memory.mb 一个MapTask可使用的资源上限(单位:MB),默认为1024。如果MapTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.reduce.memory.mb 一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果ReduceTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.map.cpu.vcores 每个MapTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.cpu.vcores 每个ReduceTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.shuffle.parallelcopies 每个Reduce去Map中取数据的并行数。默认值是5
mapreduce.reduce.shuffle.merge.percent Buffer中的数据达到多少比例开始写入磁盘。默认值0.66
mapreduce.reduce.shuffle.input.buffer.percent Buffer大小占Reduce可用内存的比例。默认值0.7
mapreduce.reduce.input.buffer.percent 指定多少比例的内存用来存放Buffer中的数据,默认值是0.0

(2)应该在YARN启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml)

配置参数 参数说明
yarn.scheduler.minimum-allocation-mb 给应用程序Container分配的最小内存,默认值:1024
yarn.scheduler.maximum-allocation-mb 给应用程序Container分配的最大内存,默认值:8192
yarn.scheduler.minimum-allocation-vcores 每个Container申请的最小CPU核数,默认值:1
yarn.scheduler.maximum-allocation-vcores 每个Container申请的最大CPU核数,默认值:32
yarn.nodemanager.resource.memory-mb 给Containers分配的最大物理内存,默认值:8192

(3)Shuffle性能优化的关键参数,应在YARN启动之前就配置好(mapred-default.xml)

配置参数 参数说明
mapreduce.task.io.sort.mb Shuffle的环形缓冲区大小,默认100m
mapreduce.map.sort.spill.percent 环形缓冲区溢出的阈值,默认80%

容错相关参数

配置参数 参数说明
mapreduce.map.maxattempts 每个Map Task最大重试次数,一旦重试次数超过该值,则认为Map Task运行失败,默认值:4。
mapreduce.reduce.maxattempts 每个Reduce Task最大重试次数,一旦重试次数超过该值,则认为Map Task运行失败,默认值:4。
mapreduce.task.timeout Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个Task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该Task处于Block状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远Block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000(10分钟)。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是:“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。

Hadoop小文件优化方法

Hadoop小文件弊端

  • HDFS上每个文件都要在NameNode上创建对应的元数据,这个元数据的大小约为150byte,这样当小文件比较多的时候,就会产生很多的元数据文件,一方面会大量占用NameNode的内存空间,另一方面就是元数据文件过多,使得寻址索引速度变慢。
  • 小文件过多,在进行MR计算时,会生成过多切片,需要启动过多的MapTask。每个MapTask处理的数据量小,导致MapTask的处理时间比启动时间还小,白白消耗资源。

Hadoop小文件解决方案

  • 小文件优化的方向:
  1. 在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
  2. 在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。
  3. 在MapReduce处理时,可采用CombineTextInputFormat提高效率。
  4. 开启uber模式,实现jvm重用
  • Hadoop Archive

是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件,从而达到减少NameNode的内存使用

  • SequenceFile

SequenceFile是由一系列的二进制k/v组成,如果为key为文件名,value为文件内容,可将大批小文件合并成一个大文件

  • CombineTextInputFormat

    CombineTextInputFormat用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片。

  • 开启uber模式,实现jvm重用。默认情况下,每个Task任务都需要启动一个jvm来运行,如果Task任务计算的数据量很小,我们可以让同一个Job的多个Task运行在一个Jvm中,不必为每个Task都开启一个Jvm.

    开启uber模式,在mapred-site.xml中添加如下配置

    <!--  开启uber模式 -->
    <property>
    <name>mapreduce.job.ubertask.enable</name>
    <value>true</value>
    </property> <!-- uber模式中最大的mapTask数量,可向下修改 -->
    <property>
    <name>mapreduce.job.ubertask.maxmaps</name>
    <value>9</value>
    </property>
    <!-- uber模式中最大的reduce数量,可向下修改 -->
    <property>
    <name>mapreduce.job.ubertask.maxreduces</name>
    <value>1</value>
    </property>
    <!-- uber模式中最大的输入数据量,默认使用dfs.blocksize 的值,可向下修改 -->
    <property>
    <name>mapreduce.job.ubertask.maxbytes</name>
    <value></value>
    </property>

haodoop企业优化的更多相关文章

  1. nginx配置文件企业优化

    1.1 企业规范优化Nginx配置文件 第一个里程碑:创建扩展目录,生成虚拟主机配置文件 mkdir extra sed -n '10,15p' nginx.conf >extra/www.co ...

  2. oa办公系统快速开发工具,助力企业优化升级

    随着互联网的快速发展.信息化 IT 技术的不断进步.移动互联新技术的兴起,不管是大的集团企业还是中小型企业,纸质化的办公模式已不能满足现有需求,构建oa平台,为员工提供高效的办公环境尤其重要. 我们先 ...

  3. hadoop的企业优化

    前言: Mapreduce程序的效率的瓶颈在于两点: 计算机性能: CPU.内存.磁盘健康.网络 I/O操作: 数据倾斜 map和reduce数量设置不合理 map的运行时间太长,导致reduc的等待 ...

  4. Hive 的企业优化

    优化 数据优化 一.从大表拆分成小表(更快地检索) 引用:Hive LanguageManual DDL eg2:常用于分表 create table if not exists default.ce ...

  5. TOGAF:企业信息化复杂吗?

    本文更新版本已挪至:http://www.zhoujingen.cn/blog/2666.html -------------------- 在与人交流TOGAF的时候,离不开企业信息化,而信息化又离 ...

  6. 当 ITOA 遇上 OneAlert,企业可以至少每年节省 3600 小时!

    每个工作日,一家大型企业都可能存在一两件优先级为 1 级的事件,五六件优先级为 2 级的事件和百来件优先级为 3 级的事件.试想一下,如果公司所有支持人员都要收到每个事件的通知--不想了,我好方!还能 ...

  7. Hadoop(八)Hadoop数据压缩与企业级优化

    一 Hadoop数据压缩 1.1 概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在Hadood下,尤其是数据规模很大和工作负载密集的情况下,使用数据 ...

  8. 智能制造进入下半场?APS如何进行优化

    按照现在算法和计算机处理能力的发展,现在资源优化的方向已经逐渐摒弃,而是在更系统的“有限产能计划的”框架内一并解决产能和物料的问题. 我们所看到的新近涌现出来的很多APS系统.但碍于算法的复杂程度,在 ...

  9. 更多企业选择MES系统?这一款功能竟如此强大

    很多制造业企业采用MES系统对制造生产的所有组成部分如订单.加工.质量.物料管理等进行集成,以实现产品生产的全过程管理,满足生产控制的需求,最终实现车间制造管理的信息化. MES系统不仅可以帮助企业提 ...

随机推荐

  1. Wabacus框架中inputbox和datepicker实现时间日历

    前提是要引入WdatePicker.js. 一.年月日时分秒(中文) <inputbox type="datepicker" inputboxparams="dat ...

  2. 密码学系列之:在线证书状态协议OCSP详解

    目录 简介 PKI中的CRL CRL的缺点 CRL的状态 OCSP的工作流程 OCSP的优点 OCSP协议的细节 OCSP请求 OCSP响应 OCSP stapling 总结 简介 我们在进行网页访问 ...

  3. 30m精度土壤类型、土壤质地、土壤有机质、土壤PH、土壤氮磷钾

    ​数据下载链接:数据下载链接 引言 全国土壤类型.质地.养分及变化等信息产品分为土壤类型数据.土壤质地数据.土壤养分数据及土壤变化数据等.该类产品是基于野外调查和实地采样,结合历史数据,建立全国土壤类 ...

  4. Tapdata Cloud 2.1.5来啦:新增支持Amazon RDS数据库,错误日志查询更便捷,Agent部署细节再优化

      需求持续更新,优化一刻不停--Tapdata Cloud 2.1.5 来啦!   最新发布的版本中,数据连接再上新,同时新增任务报错相关信息快速查询入口,开始支持 JVM 参数自定义设置.   更 ...

  5. JDBC: ThreadLocal 类

    1.ThreadLocal ThreadLocal用于保存某个线程共享变量.在Java中,每个线程对象都有一个ThreadLocal<ThreadLocal,Object>,其中key就是 ...

  6. 配置SSM公钥及创建远程仓库和在IEDA中集成git操作

    3.将.ssh下的id_rsa.pub公钥copy到gitee工作台中 4.创建个人仓库 5.设置开源许可证:开源是否可以随意转载,开源但是不能商业使用,不能转载,- 限制! 6.克隆到本地! IDE ...

  7. Idea 的Test测试报错:java.lang.IllegalStateException: Failed to load ApplicationContext

    因为在Test里面使用了注解@Autowired 引入来至bean.xml文件的内容 ,而在Test没有没有办法自动引入,需要在Test类上加上注解 @ContextConfiguration(loc ...

  8. iis 7 -mvc WebApi {"message":"an error has occurred"}

    iis 7 - WebApi's {"message":"an error has occurred"} 原因是web api的Controller有两个类名重 ...

  9. jdbc 07: 解决sql注入

    jdbc连接mysql,解决sql注入问题 package com.examples.jdbc.o7_解决sql注入; import java.sql.*; import java.util.Hash ...

  10. 字符输出流_Writer类&FileWrite类介绍和字符输出流的基本使用_写出单个字符到文件

    字符输出流_Writer类&FileWrite类介绍 java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性抽象方法: void write(int c) ...