1 选择Mapper的数量
Hadoop处理大量小文件的性能比较逊色,主要由于生成的每个分片都是一整个文件,Map操作时只会处理很少的输入数据,但是会产生很多Map任务,每个Map任务的运行都包括产生、调度和结束时间,大量的Map任务会造成一定的性能损失。可以通过Java虚拟机(JVM)重用来解决这个问题。hadoop默认每个JVM只运行一个任务。使用JVM重用后,一个JVM可以顺序执行多个任务,减少了启动时间。控制JVM的属性是mapred.job.reuse.jvm.num.tasks,它指定每个JVM运行的任务的最大数量,默认为1。可以通过JonConf的setNumTasksToExecutePerJvm()方法设置,若设置为-1则说明同一作业中共享一个JVM任务的数量不受限制。
如果输入的文件过大,还可以通过将HDFS上的块大小增大,比如增加到256M或512M,以减少Mapper数量,可以通过运行参数(-Ddfs.block.size = $[256*1024*1024])将块大小增大到256M。
2 选择Reducer的数量
Hadoop默认运行一个Reducer,所有的Reduce任务都会放到单一的Reducer去执行,效率非常低下。为了提高性能,可以适当增大Reducer的数量。
最优的Reducer数量取决于集群中可用的Reducer任务槽的数目。Reducer任务槽的数目是集群中节点个数与mapred.tasktracker.reduce.tasks.maximum(默认为2)的乘积,也可以通过MapReduce的用户界面获得。
一个普遍的做法是将Reducer数量设置为比Reducer任务槽数目稍微小一些,这会给Reducer任务留有余地,同时将使得Reducer能够在同一波中完成任务,并在Reducer阶段充分使用集群。
Reducer的数量由mapred.reduce.tasks属性设置,通常在MapReduce作业的驱动方法中通过setNumReduceTasks(n)调用方法动态设置Reducer的数目为n。
3 使用Combiner函数
Combiner过程是一个可选的优化过程,如果这个过程适合你的作业,Combiner实例会在每个运行Map任务的节点上运行,它会接收本节点上Mapper实例的输出作为输入,然后Combiner的输出会被发送到Reducer,而不是发送Mapper的输出。
Combiner是一个“迷你Reduce”过程,它是用Reducer接口来定义的,只对本节点生成的数据进行规约。为了直观理解Combiner的作用,使用WordCount程序进行说明。在该程序中Map任务会生成很多(“word”,1)对,如果同一分片中“Cat”出现了5次,则会生成5个(“Cat”,1)对被发送至Reducer。通过使用Combiner,这5个key/value对会被规约为一个(“Cat”,5)发送至Reducer。Combiner过程会针对输入反复运行,但不会影响最终结果。运行Combiner的意义在于使Map输出更紧凑,从而大大减少了Shuffle过程所需的带宽,并加速了作业的执行。
通过setCombinerClass(Class<? extends Reducer> theClass)方法使用Combiner过程,括号中指定了Combiner所使用的类,如果用户的Reduce函数可交换并可组合(比如WordCount的Reduce函数),则可以直接在驱动方法中添加如下代码:conf.setCombinerClass(Reduce.class);否则用户必须编写一个第三方类作为作业的Combiner。
4 压缩Map的输出
在Map任务完成后对将要写入磁盘的数据进行压缩是一种很好的优化方法,它能够使数据写入磁盘的速度更快,节省磁盘空间,减少需要传送到Reducer的数据量,以达到减少MapReduce作业执行时间的目的。Hadoop支持的压缩格式及相关信息如表1所示。
表1 Hadoop支持的压缩格式
压缩格式 工具 算法 文件扩展名 Hadoop压缩编码/解码器
DEFLATE 无 DEFLATE .deflate Org.apache.hadoop.io.compress.DefaultCodec
Gzip gzip DEFLATE .gz Org.apache.hadoop.io.compress.GzipCodec
bzip2 bzip2 bzip2 .bz2 Org.apache.hadoop.io.compress.BZip2Codec
LZO lzop LZO .lzo Com.hadoop.compression.lzo.LzopCodec
在使用Map输出压缩时需要考虑压缩格式的速度最优与空间最优的协调。通常来说,Gzip压缩在空间/时间处理上相对平衡;bzip2压缩比gzip更有效,但速度较慢;LZO压缩[19]使用速度最优算法,但压缩效率稍低。我们需要根据MapReduce作业以及输入数据的不同进行选择。
MapReduce应用程序的驱动方法中加入如下所示代码便可以启用gzip格式来压缩Map的输出结果。
conf.setCompressMapOutput(true);
conf.setMapOutputCompressorClass(GzipCodec.class);
5 选择合适的序列化格式
序列化指的是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过程。反序列化指的是将字节流转为一系列结构化对象的过程。
在Hadoop中,节点之间的进程间通信是通过远程过程调用(RPC)实现的。RPC协议使用序列化将消息编码为二进制流后发送至远程节点,然后二进制流被反序列化为原始信息。Hadoop使用自己的序列化格式Writables,MapReduce程序使用它来序列化key/ value对,它是整个Hadoop的核心。
Writeable接口定义了两个方法:一个用于将其状态写入二进制格式的DataOutput,另一个用于从二进制格式的DataInput流读取其状态。具体如下所示。
public interface Writable{
void write(DataOutput out) throws IOException
void readFields(DataInput in) throws IOException
}
Hadoop将许多Writable类归入包org.apache.hadoop.io中,其封装了Java的基本类,此外还有short和char类型,具体如表2所示。
表2 Writable的Java基本类封装
Java基本类型 Writable使用 序列化大小(字节)
布尔型 BooleanWritable 1
字节型 ByteWritable 1
整型 IntWritable 4
整型 VIntWritable 1-5
浮点型 FloatWritable 4
长整型 LongWritable 8
长整型 VLongWritable 1-9
双精度浮点型 DoubleWritable 8
正确选择合适的Writable类型,能够减少CPU占用率和存储空间,提高作业性能。
Hadoop自带一系列Writable实现已经能够满足大多数用途。但我们也可以自定义Writable来控制二进制表示和排序顺序以应对更复杂的结构,编写自定义Writable时需要实现RawComparator,通过查看其序列化表示的方式来比较数据。
http://hi.baidu.com/jrckkyy/blog/item/173c3fb10b03a7470823026c.html
分享到:
相关推荐
为了充分发挥Hadoop的性能优势,进行合理的系统调优是非常必要的。本文将基于提供的标题、描述、标签以及部分内容,深入探讨Hadoop调优的关键知识点。 #### Hadoop概述 Hadoop是一个开源软件框架,用于分布式存储...
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据...
从Hadoop配置文件入手,经历大量的实验,以求通过改变一些配置参数以提高Hadoop集群的性能。 从Hadoop作业调度入手,优化集群作业调度算法。
Hadoop作业调优是提升大数据处理效率的关键环节,通过对Hadoop MapReduce框架中的参数进行精细调整,可以显著改善作业的性能。以下是对标题和描述中涉及的参数及原理的详细说明: 1. **MapTask运行内部原理** - **...
【Hadoop性能调优】涉及多个层面,包括硬件选择、配置参数调整、数据分布策略等。选择适合Hadoop的硬件配置至关重要,一般考虑硬盘I/O性能、内存大小和CPU计算能力。在配置优化方面,调整如Block Size、Replication ...
Hadoop性能调优 主要涉及hdfs、yarn、mapreduce、hive等的调优,同时也包括一些linux系统产生调优
Hadoop参数调优是指通过调整Hadoop配置文件中的各个参数来达到性能优化的目的。Hadoop配置文件中包含了大量的参数,每个参数都有其特定的作用和默认值。通过调整这些参数,可以大大提高Hadoop的性能。但是,参数调整...
文档内容围绕Hadoop生态系统中的两个主要组件Hive和Hadoop进行展开,对它们的工作原理、性能调优策略等方面进行了深入讨论。 首先,Hive是建立在Hadoop上的一个数据仓库工具,可以将结构化的数据文件映射为一张...
总的来说,Hadoop的配置调优是一个综合考虑硬件资源、数据特性、作业需求和系统性能的过程。每个参数的调整都需要谨慎,因为它们之间存在相互影响的关系。通过深入理解这些配置项的作用和相互关系,可以有效地优化...
Hadoop和Hive调优是当前大数据处理中非常重要的一部分,如何提高Hadoop和Hive的性能,将直接影响到整个数据处理的效率和质量。本文将总结个人在学习和测试Hive过程中的调优经验,包括Datanode的热插拔、启动自动...
基于Hadoop的电商大数据平台性能调优主要涉及两大方面:数据重新组织和平台参数调优。针对电商大数据平台的特点,通过调整存储数据格式、优化数据表的分区与分桶策略,以及调整涉及业务主要组件的关键参数,可以显著...
本课程“Hadoop大数据开发与性能调优实战培训课程-Hadoop组件详解”旨在深入探讨Hadoop的主要组件及其优化策略,帮助开发者和数据工程师提升在大数据环境中的实践能力。 首先,我们要了解Hadoop的基础架构,它主要...
【标题】:“五分钟学大数据-Hadoop企业级调优手册1” ...综上所述,Hadoop企业级调优涵盖了从基础参数配置到集群性能测试、扩展与维护的全方位流程,旨在最大化HDFS的性能和稳定性,为企业的大数据应用提供有力支撑。
### 大数据各类性能调优 #### 12.1 配置原则 在大数据环境中,合理配置资源是实现高效能的关键。以下是一些基本原则: **原则1:CPU核数分配原则** - **数据节点**: 建议预留2~4个核心给操作系统和其他进程(如...
Cloudera Hadoop 5&Hadoop高阶管理及调优课程,完整版,提供课件代码资料下载。 内容简介 本教程针对有一定Hadoop基础的学员,深入讲解如下方面的内容: 1、Hadoop2.0高阶运维,包括Hadoop...5、Hadoop各组件性能调优
Hadoop性能调优指南介绍了一种有效的方法来提升Hadoop集群的运行效率,它不仅涵盖了硬件优化,还包括了系统和Hadoop架构层面的优化。Hadoop是一个开源的分布式存储和计算框架,广泛应用于大数据的存储与处理。对于...
8. **Hadoop性能调优**:包括Datanode和Namenode的内存设置、Block大小调整、网络优化、任务调度策略等,这些都是提升Hadoop性能的关键。 9. **Hadoop故障排查**:学习识别和解决Hadoop运行中的常见问题,如数据...
Hadoop大数据开发与性能调优实战培训课程.pptx