热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Hadoop教程(三):MR重要运行参数-mysql教程

书接上回,继续为大家讲解MapReduce相关JobConfigurationJobConf是MR任务的配置对象,也是描述MR任务在Mapreduce框架中如何执行的主要途径,框架将如实的以该对象包含的信息来执行MR任务,但要注意以下特殊情况:一些配置参数被管理员在hadoop相关配置

书接上回,继续为大家讲解 MapReduce相关 Job Configuration JobConf是MR任务的配置对象,也是描述MR任务在Mapreduce框架中如何执行的主要途径,框架将如实的以该对象包含的信息来执行MR任务,但要注意以下特殊情况: 一些配置参数被管理员在hadoop相关配置

书接上回,继续为大家讲解 MapReduce相关

Job Configuration

JobConf是MR任务的配置对象,也是描述MR任务在Mapreduce框架中如何执行的主要途径,框架将如实的以该对象包含的信息来执行MR任务,但要注意以下特殊情况:

  • 一些配置参数被管理员在hadoop相关配置文件中(比如core-site.xml,mapred-site.xml)设置为 final,则不能被任务参数值改变。
  • 有一些参数通过方法可以直接设定,如通过 setNumReduceTasks(int)等设定。但是一些其他参数和框架内部、任务配置有更复杂的关系,所以设定更为复杂,比如要通过 setNumMapTasks(int)来进行设定。

最典型的,JobConf一般应用在确定Mapper、Combiner(如果使用的话)、Partitioner、Reducer、InputFormat、OutputFormat以及OutputCommitter的实现类上。JobConf也可以用来通过setInputPaths(JobConf, Path…)/ addInputPath(JobConf, Path),或者setInputPaths(JobConf, String)/ addInputPaths(JobConf, String)指定输入路径集合,通过setOutputPath(Path)设置任务结果输出路径。

JobConf也会用来指定一些可选的配置(一般使用在优化或者特殊分析用途)。比如指定作业使用的Comparator(比较器,用于排序或者分组);使用 DistributedCache缓存一些必须的文件;指定作业过程中数据和/或者作业结果是否被压缩和怎样压缩。也可以通过setMapDebugScript(String)/setReduceDebugScript(String)(还没用过:()对作业进行debug;通过 setMapSpeculativeExecution(boolean)/ setReduceSpeculativeExecution(boolean)指定任务执行中是否开启推测执行;通过setMaxMapAttempts(int)/setMaxReduceAttempts(int)设置每个任务的最大尝试次数;通过 setMaxMapTaskFailuresPercent(int)/ setMaxReduceTaskFailuresPercent(int)设置MR任务(map/reduce)可容忍的失败比率。

而且,用户可以用 set(String, String)/ get(String, String 设置应用需要的参数,但是对于大量数据(只读)请使用 DistributedCache。

MR运行参数

TaskTracer以独立的JVM子进程方式运行Mapper、Reducer。子任务继承TaskTracker的所有环境参数。用户可以通过在JobConf里 mapred.child.java.opts指定子jvm运行参数,例如通过-Djava.library.path=<>指定一些搜索共享库必须的非标准运行时链接库等等,这是可选的。如果 mapred.child.java.opts属性含有$taskid变量,这个变量值会在运行中被框架插入正在运行的任务id。

下面这个配置例子使用多参数和变量插入特性配置了JVM GC日志,可,通过jconsole工具无密码连接的JMX服务,用来观察子进程的内存、线程,也可以获取线程dump信息。另外配置里设置了子JVM的最大堆尺寸为512MB,通过java.library.path设置了共享库路径。

    
      mapred.child.java.opts
         -Xmx512M -Djava.library.path=/home/mycompany/lib -verbose:gc -Xloggc:/tmp/@taskid@.gc
         -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
    

内存管理

可以通过mapred.child.ulimit参数配置子进程可使用的最大虚拟内存。注意:该属性对单个进程设置最大限制,单位为KB,值必须大于等于最大堆内存(通过-Xmx设置)。

注意:mapred.child.java.opts只对从tasktracker分配和管理的子JVM进程有效。其他hadoop守护进程内存参数配置详见 Configuring the Environment of the Hadoop Daemons。

MR框架的其他组件可用内存也是可配置的。map和reduce任务的性能可以通过从影响操作并发和数据磁盘IO次数的角度来调试。监控针对单个任务而设置的文件系统计数器,尤其是具体到map输出到reduce的数据字节量,对调试影响任务运行性能都是非常有用的。

如果内存管理特性启用的话,用户可以选择性的覆盖一些默认配置,比如虚拟内存,RAM。下面是一些对任务有效的参数:

名称 类型 特点
mapred.task.maxvmem int 以字节为单位指定单个map或reduce任务的最大虚拟内存。如果任务超过该值就被kill
mapred.task.maxpmem int 以字节为单位指定单个map或reduce任务的最大RAM。这个值被调度器(Jobtracer)参考作为分配map\reduce任务的依据,避免让一个节点超RAM负载使用。

Map参数

map读出的一条记录将被序列化到一个buffer,元数据存储在元数据buffer中。如上面所说,当序列化buffer或者元数据buffer超出了设置的阙值,buffer中内容将被排序并在后台写入到磁盘,这个过程同时map持续输出记录行。如果buffer被写满就会发生一个spill过程,spill中map线程被阻塞。当map完成后,buffer中剩余记录写入磁盘并和在磁盘的按段存储的记录合并到一个文件中。减少spill次数可以缩短map时间,但是较大的buffer也会降低可用内存。

名称 类型 特点
io.sort.mb int 默认100。以MB为单位设置序列化和元数据buffer的大小。
io.sort.record.percent float 默认0.05。map记录序列化后数据元数据buffer所占总buffer百分比值。为了加速排序,除了序列化后本身尺寸外每条序列化后的记录需要16字节的元数据。io.sort.mb值被占用的百分比值超过设定值机会发生spill。对输出记录较少的map,值越高越可降低spill发生的次数。
io.sort.spill.percent float 默认0.80。元数据和序列化数据buffer空间阀值。当两者任何一个buffer空间达到该阀值,数据将被spill到磁盘。假设io.sort.record.percent=r, io.sort.mb=x,io.sort.spill.percent=q,那么在map线程spill之前最大处理的记录量为r*x*q*2^16。注意:较大的值可能降低spill的次数甚至避免合并,但是也会增加map被阻塞的几率。通过精确估计map的输出尺寸和减少spill次数可有效缩短map处理时间。

其他注意事项:

  • 如果spill阙值达到了,就会发生spill,记录收集将继续直到spill完成。例如io.sort.buffer.spill.percent设置为0.33,buffer剩余的部分被填满,spill发生,下一个spill将会包含所有收集的记录,或者是这个buffer的0.66部分,并且不会产生额外的spill过程。换句话说阙值像是定义的触发器,不会阻塞。
  • 大于序列化数据buffer的一条记录将首先触发一个spill,然后被spill到一个独立的文件中。没有配置参数来定义记录是否首先通过combiner。

Shuffle/Reduce参数

如前面所说,每个reduce通过HTTP获取map输出后读入内存,并周期性合并这些输出到磁盘。如果map输出压缩打开的话,每个输出将会解压后读入内存。下面的配置参数影响reduce处理中的合并和内存分配过程。

名称 类型 特点
io.sort.factor int 默认值10。指定同时可合并的文件片段数目。参数限制了打开文件的数目,压缩解码器。如果文件数超过了该值,合并将分成多次。这个参数一般适用于map任务,大多数作业应该配置该项。
mapred.inmem.merge.threshold int 在内存中合并到磁盘前读取已排序map输出文件的数目。类似前面说的spill阙值,该值不是一个用来分区的单元而是一个触发器。通常该值较高(1000),或者不启用(0),毕竟内存内合并比磁盘上合并成本更低。这个阙值只影响shuffle过程的内存合并。
mapred.job.shuffle.merge.percent float 0.66。内存合并前供map输出享有的内存百分比值,超过该值就会合并数据到磁盘。过大的值会降低获取和合并的并行效率。相反如果输入恰好整个放到内存,则可以设置为1.0。该参数只影响shuffle过程的内存合并频率。
mapred.job.shuffle.input.buffer.percent float 默认值0.7。shuffle过程中缓存map输出数据的内存占整个子jvm进程堆最大尺寸(通过mapred.child.java.opts设置)的百分比。该值可以视情况设置较高的值来存储大的较多的map输出。
mapred.job.reduce.input.buffer.percent float 0.0 内存合并中从内存刷到磁盘,直到剩余的map输出占用的内存少于jvm最大堆的该百分比值。默认情况下,在reduce开始之前需要保证最大的内存可用,所有的内存中map输出都会被合并到磁盘。对内存不敏感的reduce任务,该值可以适当提高,来避免磁盘IO(一般不会有)。

其他注意事项:

  • 如果map输出占用超过25%的内存去拷贝,这会直接被刷到磁盘而不会经过内存合并阶段。
  • 当combiner运行,前面所说的较高的合阙值和大的buffer不适用。因为在所有map输出都被取到之前合并就开始了,当spill发生时combiner处于运行状态。在一些实践中,用户可以通过合并输出使得磁盘spill足够小并可保证并行的spill和数据拉取来缩短reduce处理时间,而不是去不断的提高buffer尺寸。
  • 内存合并map输出并刷到磁盘时reduce过程开始,如果有多个输出片段spill到磁盘,或者至少有io.sort.factor个片段已经在磁盘上,那么中间合并过程是必须的,并且包含内存中处理map输出。

子JVM重用

可以通过指定mapred.job.reuse.jvm.num.tasks作业配置参数来启用jvm重用。默认是1,jvm不会被重用(每个jvm只处理1个任务)。如果设置为-1,那么一个jvm可以运行同一个作业的任意任务数目。用户可以通过JobConf.setNumTasksToExecutePerJvm(int)指定一个大于1的值。

下面是作业执行时的配置参数:

名称 类型 描述
mapred.job.id string 表示jobid
mapred.jar string job.jar在job路径下的位置
job.local.dir string 作业共享路径
mapred.tip.id string taskid
mapred.task.id string task尝试任务id
mapred.task.is.map boolean 是否是map任务
mapred.task.partition int task在job中的id
map.input.file string map输入文件路径
map.input.start long map输入split开始偏移量
map.input.length long map输入分片的字节数
mapred.work.output.dir string 任务临时输出路径

任务的标准输出和错误流日志由TaskTracker读入并写入${HADOOP LOGDIR}/userlogs路径。

DistributedCache可以被用来发布map或者reduce用到的jar包、本地共享库。子JVM进程通常可使用java.library.path和LD LIBRARYPATH指定其自身的工作路径。缓存库可以通过 System.loadLibrary或者 System.load加载。关于使用distributed cache 加载共享库详细信息可以查看 Loading native libraries through DistributedCache。

?

相关文章

  • Hadoop教程(二)
  • Hadoop教程(一)
  • 使用Hadoop和BIRT对海量数据进行可视化处理
  • 专为Mac本跟踪Hadoop任务的应用
  • Log4j 2.x架构
  • 为什么这段代码输出的是”Hello World”
  • 为Hbase建立高可用性多主节点
  • Log4j 2 介绍
  • 经典论文翻译导读之《Dremel: Interactive Analysis of WebScale Datasets》
  • MapReduce启蒙文献

推荐阅读
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • hadoop3.1.2 first programdefault wordcount (Mac)
    hadoop3.1.2安装完成后的第一个实操示例程 ... [详细]
  • 【clienteclipse集群提交运行】:客户端eclipse集群提交mapreduce代码1.需求:在master:8088上,有客户 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • 对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例为了方便查看源代码,关联导入源代 ... [详细]
  • MR程序的几种提交运行模式本地模型运行1在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行-- ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Python 数据分析领域不仅拥有高质量的开发环境,还提供了众多功能强大的第三方库。本文将介绍六个关键步骤,帮助读者掌握 Python 数据分析的核心技能,并深入探讨六款虽不广为人知但却极具潜力的数据处理库,如 Pandas 的替代品和新兴的可视化工具,助力数据科学家和分析师提升工作效率。 ... [详细]
  • 如何提升Python处理约1GB数据集时的运行效率?
    如何提升Python处理约1GB数据集时的运行效率?本文探讨了在后端开发中使用Python处理大规模数据集的优化方法。通过分析常见的性能瓶颈,介绍了多种提高数据处理速度的技术,包括使用高效的数据结构、并行计算、内存管理和代码优化策略。此外,文章还提供了在Ubuntu环境下配置和测试这些优化方案的具体步骤,适用于从事推荐系统等领域的开发者。 ... [详细]
  • hive和mysql的区别是什么[mysql教程]
    hive和mysql的区别有:1、查询语言不同,hive是hql语言,MySQL是sql语句;2、数据存储位置不同,hive把数据存储在hdfs上,MySQL把数据存储在自己的系统 ... [详细]
author-avatar
qCANL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有