`
- 浏览:
28885 次
- 性别:
- 来自:
武汉
-
基于MapReduce作业的MapReduce数据流优化
在编写MapReduce应用程序时,除了最基本的Map模块、Reduce模块和驱动方法之外,用户还可以通过一些技巧优化作业以提高其性能。对用户来说,合理地在MapReduce作业中对程序进行优化,可以极大地提高作业的性能,减少作业执行时间。我们从以下几个方法分析MapReduce作业的优化方法。
1 选择Mapper的数量
Hadoop平台在处理大量小文件时性能比较逊色,主要由于生成的每个分片都是一整个文件,Map操作时只会处理很少的输入数据,但是会产生很多Map任务,每个Map任务的运行都包括产生、调度和结束时间,大量的Map任务会造成一定的性能损失。可以通过任务Java虚拟机(JVM)重用来解决这个问题,默认每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,通过查看其序列化表示的方式来比较数据。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
提出一种基于MapReduce技术的贝叶斯垃圾邮件过滤机制,一方面对传统贝叶斯过滤技术进行改进,另一方面利用MapReduce模型的海量数据处理优势优化邮件集训练与学习。实验,较之目前流行的传统贝叶斯算法、K最近邻(NN算法...
针对传统侵蚀地形因子提取方法在处理海量数据时出现的瓶颈,提出一种基于MapReduce模型的侵蚀地形因子计算方法。该方法将并行计算模型MapReduce与改进的通用土壤流失方程(revised universal soil loss equation,...
随着数据的爆炸式增长,传统的算法已不能适应大数据挖掘的需要,需要...对已有的基于MapReduce计算模型的并行关联规则挖掘算法进行了分类和综述,对其各自的优缺点和适用范围进行了总结,并对下一步的研究进行了展望。
#资源达人分享计划#
在考虑已知这些周期性数据流传输的情况下,为MapReduce的洗牌数据传输调度问题建立了优化模型,并设计了一个有效的数据传输调度算法。在网络空闲时间段大小相同的情况下,证明了所提算法是近似比为3/2的近似算法。...
FlowS:一种MapReduce数据流公平调度方法
在本文中,我们提出了一种基于MapReduce的方法,通过扩展传统的评分和搜索算法来从海量数据中学习BN。 首先,在评分过程中,我们开发了map和reduce算法以并行获取所需参数。 其次,在搜索过程中,我们为每个节点...
文档简要介绍了大数据、大数据处理模型及MapReduce的相关知识
基于Event推送方式,利用Netty底层异步通信方式等技术,建立在线MapReduce数据传输机制,进一步实现其原型程序,解决了大规模分布式计算程序的快速在线传输和数据分发等问题,支持流数据动态分发机制,为动态MapReduce模型...
基于工作流中的数据流依赖和资源依赖关系,提出了三种工作流优化器,评估了基于成本的工作流优化,并对工作流优化器进行了终端-对-终端的评估;通过实验评估了工作流优化器的优化开销并对这三种工作流优化器的优缺点...
MarDRe是一种基于MapReduce的从头开始的并行工具,通过对FASTQ / FASTA数据集中的单端和配对末端序列进行聚类,删除重复和接近重复的DNA读数。 该工具使生物信息学能够避免对不必要的读数进行分析,从而减少了使用...
#资源达人分享计划#
本文首先对MapReduce和Spark的基本信息做了对比性介绍,接着分别对MapReduce和Spark进行基础性知识讲解,然后在单台Linux服务器上安装了Spark,并以实际代码演示了从MapReduce转换...3.基于实时数据流的数据处理(st
由于大型数据集的日益普及,因此需要提高PLSA中计算的可伸缩性。 在本文中,我们提出了一种称为PPLSA的并行PLSA算法,以适应MapReduce框架中的大型语料库集合。 我们的解决方案有效地分散了计算,并且实现起来相对...
MapReduce 作业。 它基于托管云服务,主要是标准临时查询和批处理工具(如 和 )的替代品。 目录 一、架构和工作流程 库工作流程如下: 工作流首先调用Mappers Driver lambda 函数 Mappers Driver做两件事: 它计算...
随着社会网络数据的增加,社团发现获得来自学术界和工业界的大量关注,是因为它在现实世界中有许多的实际应用。格文-纽曼(Girvan-Newman,GN)是现今最流行的算法之一,但在大型网络上由于需要计算网络中每对节点...
Hadoop 是一个基于 Java 的分布式密集数据处理 和数据分析的软件框架。Hadoop 在很大程度上是受 Google 在 2004 年白皮书中阐述的 MapReduce 技术的 启发。MapReduce 工作原理是将任务分解为成百上千 个小任务,然后...
1.定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的 数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑...分析WordCount 数据流走向深入理解MapReduce 核心思想。 4.MapR
论文研究-云计算环境下的多路数据流分层模块化建模与设计.pdf, ... 多路数据流扩展了传统数据流和 Google的MapReduce计算框架, 在简化设计的同时也使最终系统易于在云计算环境中实现.
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来...HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。