Hadoop Settings

由于Hadoop节点的系统配置,一些hadoop的设置可以减少运行系统中的瓶颈。首先,提高Java运行时的堆内存容量,也要和系统中的整体内存容量相关;其次,保持hadoop中派生的task数量与处理器数量相关。

一个比较好的规则是一个Reducer或两个Mapper分配一个处理器;如果系统拥有足够多的内存容量,设置Java堆的最大大小为1GB或更大。此外,还需要注意的是一个任务要有3个Java虚拟机在运行,所以必要还要至少保留每个任务3GB的内存,

Hard Drive scaling

Hadoop DataNode中的硬盘数量能够提高读写性能,将数据放到更多的硬盘中能够允许hadoop从多个HDFS数据块中读取更多的数据。Hadoop的工作量就像是RAID控制器一样,能够同时从多个地址中读取数据,可以提高整体的性能。从基本测试的执行结果来看,更多的磁盘数量能够显著提高hadoop的读写性能,直到存储的总线达到饱和状态。在我们的每个DataNode中,都添加了12块硬盘。从下图中可以看出,从4块硬盘开始,直到加入第12块硬盘,整体的执行时间减少了大约79%。

Hadoop File System Compression

在Hadoop中启用压缩可以通过减少网络和磁盘IO来提高集群的性能,同样还可以降低HDFS中的磁盘使用率,但是这部分提升是以CPU处理时间的提高为代价的,需要考虑到CPU和IO之间的权衡问题。

Hadoop提供了对中间map执行结果,map输入数据和reduce输出数据的压缩支持,同时还支持应用级别的压缩,比如Java Job本身,支持的压缩方法包括:Deflate, gzip, bzip2和LZO。每种方法都有其优缺点。

MapReduce输出的数据在整个计算过程中都会进行中间存储,map输出的中间结果只能被reducer看到(通过HTTP服务的方式下载)。因为map和reduce端的可能并不在同一台机器,同一个进程中,压缩数据能够节省网络带宽和磁盘I/O。

LZO通常情况下不是处理器敏感的算法,花费大约20%到40%的CPU处理能力,能够留给在系统中运行的其他Hadoop任务足够的CPU资源;而且LZO是可Split的,将比较大的文件拆分成可管理的块。当使用压缩时,建议使用可Split和Index整个文件的算法,否则本地化文件的不支持可能导致MapReduce应用非常低效。使用压缩相比于未压缩能够减少大概20%的执行时间。

HDFS Block Size

更改默认的HDFS块大小在两个方面提高Hadoop集群的性能。首先,它能够比最佳地匹配硬件驱动attach的控制器,提升硬件驱动器和存储控制器。其次,HDFS的块大小会影响单个MapReduce Job的任务数量,在文件总大小固定的情况下,提高HDFS的块大小会减少MapReduce的Task数量。

MapReduce

MapReduce比起HDFS设置,要更加复杂,需要了解所有的MapReduce配置参数,才能做到提高性能。

Hadoop的MapReduce过程图如下所示:

MapReduce Process

MapReduce的任务由两阶段组成,Map阶段和Reduce阶段。

Map阶段会将任务和数据分发到集群的数据节点中,大部分的Map任务都可以在对应的DataNode上被创建。为了能够在Map阶段达到最大的性能,需要有效利用DataNodes上的所有处理器核心。

InputSplits决定了Map和Reduce进程在DataNodes中被创建的数量。每个Map进程使用map方法处理输入数据,将其按照数据进行分组,根据Partition策略写到Map端的本地磁盘中,以便于Reducer能够拿来进行map输出。

Map执行时,对于一个给定的Key,如果Partition到特定的Reducer,则这个Reducer需要能够看到所有的Map上这个Key对应的结果,并通过HTTP的方式获得这些中间结果数据。在Reducer方法被执行之前,首先在Reducer端执行数据的排序合并操作。

如果能够保持Map阶段和Reduce阶段都在同一个节点,就可以最小化传输的数据,并加速执行时间。

Map Process

Map阶段是从InputSplit开始,当Map阶段执行进程的map方法将中间结果数据写入到本地磁盘中时,它使用的一个内存缓冲区,通过io.sort.mb来控制缓冲区的大小(默认100M,一般不够用),这部分内存是要占用Map端执行的虚拟机内存的。

另外一个与io.sort.mb设置共存的参数是io.sort.record.percent,这个代表内存缓冲区用于元数据的百分比(相对于记录的本身信息),默认值为.05,表示百分之五。如果内存缓冲区的空间已经使用超过80%后(在参数io.sort.spill.percent),就会新启动一个线程用户将数据缓冲至本地磁盘中,但并不耽误map方法继续向内存缓冲区写入操作。

如果Map阶段的输出数据非常大,频繁的文件spill就会导致map阶段执行时间的变长。适当地增大内存缓冲区,使得map操作能够都在内存中完成能够节省大部分时间,这都是因为如果spill次数太多,会在磁盘中大量执行磁盘归并的操作,将不同的小文件合并成一个文件。

Reduce Process

Reduce阶段是由5个步骤组成,copy, shuffle, merge, sort和reduce。Copy阶段Reducer将Map阶段的中间结果从TaskTracker(执行Map对应的DataNode)中拷贝过来(通过网络,HTTP),存放到本地磁盘或是内存中。这个过程中两个参数起作用,mapreduce.tasktracker.http.threads和mapred.reduce.parallel.copies。第一个参数指的是TaskTracker中用于在集群中提供传输DataNodes和partition data服务的线程数量,默认40;第二个参数指的是在copy和shuffle阶段Reducer进行拷贝数据的线程数量,默认为5。

Map处理完的数据被拷贝到Reducer的内存中,其内存数量被两个参数所控制——mapred.job.shuffle.input.buffer.percent(默认0.70)和mapred.child.java.opts(-Xmx200)。增大Reducer端的Java堆内存,提升至1G,如果内存比较充裕的化可以提升得更高,这样就可以使得copy,shuffle和merge三部分操作都在内存中,这样就可以提高MapReduce的性能。如果copy,shuffle和merge三部分操作仍然溢出至磁盘中,可以更改参数mapred.job.shuffle.merge.percent(默认0.66),类似于之前map端的溢出百分比,这决定了Reduce端copy,shuffle和merge的记录数溢出百分比。

io.sort.factor,这个参数决定了Map 阶段输出流一次能够合并的文件数量,这取决于Reducer处理merged文件的速度。增大这个参数能够将merged文件移动到Reducer更快。

更改参数mapred.job.reduce.input.buffer.percent(默认0.0)能够将merged文件放到内存中,以提高处理速度,需要说明的是,这部分内存也来源于Reducer阶段的Java虚拟机,如果Reduce阶段不是太耗内存,可以将所有中间处理结果都放到内存中。

Summary

通过设置在Hadoop框架中的这些优化策略,我们可以发现最终会得到大概38%的执行时间降低百分比。更改这些同时也会对其他造成一些有益的影响,比如由于进行了压缩,降低HDFS的磁盘占用率,支持更大的Hadoop工作负载。

hadoop集群调优-hadoop settings and MapReduce的更多相关文章

  1. hadoop集群调优-OS和文件系统部分

    OS and File System 根据Dell(因为我们的硬件采用dell的方案)关于hadoop调优的相关说明,改变几个Linux的默认设置,Hadoop的性能能够增长大概15%. open f ...

  2. hadoop 集群调优实践总结

    调优概述# 几乎在很多场景,MapRdeuce或者说分布式架构,都会在IO受限,硬盘或者网络读取数据遇到瓶颈.处理数据瓶颈CPU受限.大量的硬盘读写数据是海量数据分析常见情况. IO受限例子: 索引 ...

  3. Hadoop集群--linux虚拟机Hadoop安装与配置、克隆虚拟机

    Hadoop集群 第四章 Hadoop安装与配置.克隆虚拟机 一.Hadoop安装与配置 1.将hadoop安装包通过Xftp传输到虚拟机的/software目录下 2.进入/software目录下, ...

  4. Elasticsearch 6.x版本全文检索学习之集群调优建议

    1.系统设置要到位,遵照官方建议设置所有的系统参数. https://www.elastic.co/guide/en/elasticsearch/reference/6.7/setup.html 部署 ...

  5. Elasticsearch集群调优

    系统调优 禁用swap 使用swapoff命令可以暂时关闭swap.永久关闭需要编辑/etc/fstab,注释掉swap设备的挂载项. swapoff -a 如果完全关闭swap不可行,可以试着降低s ...

  6. 2.Hadoop集群搭建之Hadoop(包含HDFS和Yarn)安装

    前期准备 下载JDK 6.0以上版本 下载Hadoop 2.4.1 1. 安装JDK 因为Hadoop是Java开发的,所以需要安装JDK,建议JDK 6.0以上. 解压JDK tar -zxvf J ...

  7. virtualbox 虚拟3台虚拟机搭建hadoop集群

    用了这么久的hadoop,只会使用streaming接口跑任务,各种调优还不熟练,自定义inputformat , outputformat, partitioner 还不会写,于是干脆从头开始,自己 ...

  8. 构建高可靠hadoop集群之0-hadoop用户向导

    本文翻译自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html 基于2.8. ...

  9. [转]大数据hadoop集群硬件选择

      问题导读 1.哪些情况会遇到io受限制? 2.哪些情况会遇到cpu受限制? 3.如何选择机器配置类型? 4.为数据节点/任务追踪器提供的推荐哪些规格? 随着Apache Hadoop的起步,云客户 ...

随机推荐

  1. 201621123005《Java程序设计》第三周作业学习总结

    201621123005<Java程序设计>第三周 学习总结 标签(空格分隔): 未分类 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化 ...

  2. 定位CPU高问题三把斧

    1.top -H -p PID 查看对应进程的哪个线程占用CPU过高 2.printf "%x\n" tid   将需要的线程ID转换为16进制格式 3.jstack pid &g ...

  3. mssqlserver SQL注释快捷键

    注释快捷键 选中语句(快捷键:光标定位到需要注释块的最顶行,按住shift+home选中行,放开再按下shift+向下键,选中块) 按住Ctrl然后依次按K,C取消注释快捷键 选中语句 按住Ctrl然 ...

  4. rabbitmq安装部署

    本文主要介绍rabbitmq-server-3.6.12的安装部署 #  检查是否已经安装旧版本的软件 rpm -qa|grep erlang rpm -qa|grep rabbitmq # 如果之前 ...

  5. 每天一个linux命令(目录文件操作):【转载】Linux 目录结构

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统至关重要,下面 ...

  6. JavaScript年月日和时间戳互转

    /** 一丶将日期单位转为时间戳 / 毫秒 **/ var str="2017年06月2日" var time = str.replace(/年/i,"-"). ...

  7. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  8. 常用ES6语法

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  9. 【剑指offer】Q14:调整数组顺序使奇数位于偶数前面

    def isOdd(n): return n & 1 def Reorder(data, cf = isOdd): odd = 0 even = len( data ) - 1 while T ...

  10. InnoSetup 打包Winform程序

    在VS2012之前,我们做安装包一般都是使用VS自带的安装包制作工具来创建安装包的,VS2012.VS2013以后,微软把这个去掉,集成使用了InstallShield进行安装包的制作了,虽然思路差不 ...