在hadoop中,当一个job的调试完成,执行成功后,job的开发者接下来该思考的问题通常就是:如何将job跑的更快,更加高效,更节省资源呢?这个话题其实是一个老生常谈的话题了,很多有经验的工程师,开发人员和机构都分享过类似的经验。通常来说,应用程序千变万化,程序逻辑也不尽相同,程序的执行瓶颈通常也不尽相同,有的job是IO密集型的作业,那么优化其算法效率意义就不大,而有的job是CPU密集型的,那么对其中间结果压缩,或者调整类似io.sort.mb,io.sort.factor等参数也就没有什么太大作用,优化程序算法肯定会有更大收益。
所以在大多数情况下,写job,调试job,测试,上线运行,这套开发mapreduce应用程序的流程通常很多开发团队都走的很顺。但这并不是最难的,事情到这里也还远远不算完,程序哪里不高效,哪里消耗过多资源,哪里是瓶颈,如何优化,这一系列的问题,根据在下的经验,是开发团队考虑的相对不多的地方。
通常应用程序的开发者发现自己的hadoop job跑的不够高效,不够快的时候,第一时间想到的,是给hadoop平台的开发团队写邮件,说你hadoop平台又怎么怎么样,害的我的job跑的不够高效,然后在邮件的最后还附加上一句:“请hadoop平台开发团队多多考虑用户的建议和用户体验,优化hadoop,满足我这个什么什么job的需求,不然我就 @#¥%#¥%#”。而其实大部分情况下,只要稍微关注一下自己的程序,稍微进行一些优化,作业的执行效率就会高很多。说到这里内心又开始有些激动,还是言归正传吧……
刚才说到作业效率和瓶颈的问题,怎么发现作业的瓶颈呢?用户怎么知道他的作业的在哪个阶段最耗时,哪个地方最耗内存呢?其实hadoop提供了用户tunning自己job的方法,其中profiling tasks就是其中一种。
和debug task一样,profiling一个运行在分布式hadoop环境下的mapredeuce job是比较困难的。但在hadoop中,是可以让用户针对某些tasks进行profiling采集的,当这些task执行完后,将这些profiling日志保存的文件发送到作业的提交client机器上,然后用户就可以用自己熟悉的工具来分析这些profiling日志,进行tasks执行瓶颈的分析。
使用方法:
在JobConf中,有几个配置选项是可以用来控制task profiling行为的。比如对一个job,想要开启对其tasks的profiling功能,并设置profiling相应的HPROF参数,可以按如下方式:
conf.setProfileEnabled(true);
conf.setProfileParams("-agentlib:hprof=cpu=samples,heap=sites,depth=6," +
"force=n,thread=y,verbose=n,file=%s");
conf.setProfileTaskRange(true, "0-2");
第一行表示打开profiling task的功能,该功能默认情况下是关闭的。调用该接口相当于设置配置选项 mapred.task.profile=true,可以利用这种方式在hadoop job提交命令行上动态指定。
第二行是通过conf接口来设置对tasks进行HPROF 的profiling的采集参数,采用profiling enable的方式运行的tasks,会采用每个task一个独立的JVM的运行方式运行(即使enable了job的jvm reuse功能)。HPROF相关的采集参数设置,可以见其他资料。该选项也可以通过设置 mapred.task.profile.params 选项来指定。
第三行表示对job的哪些tasks需要进行profiling采集,第一true参数表示采集的是map tasks的性能数据,false的话表示采集reduce的性能数据,第二个参数表示只采集编号为0,1,2的tasks的数据,(默认为0-2)。如果想要采集除2,3,5编号的tasks,可以设置该参数为: 0-1,4,6-
Example
还是拿wordcount来举例,提交job命令如下:
bin/hadoop jar hadoop-examples-0.20.2-luoli.jar wordcount /
-D mapred.reduce.tasks=10 /
-D keep.failed.task.files=fales /
-D mapred.task.profile=true /
-D mapred.task.profile.params="-agentlib:hprof=cpu=samples,heap=sites,depth=6,force=n,thread=y,verbose=n,file=%s" /
$input /
$output
这样,当job运行时,就会对前三个task进行profiling的采集,采集信息包括cpu的采样信息,内存分配的信息数据,stack trace 6层的堆栈信息。这里需要注意的是,由于前三个tasks被进行了HPROF的性能采样,所以这几个tasks的执行效率会受到一定的影响,profiling的信息越详细,性能影响就越大。如下图,前三个map就明显比其他的map运行的要慢很多。
不过这种运行方式通常都不是线上运行方式,而是用来进行优化调试,所以关系不大。
而当job运行完成后,这三个tasks对应的profiling日志也会会传到提交机器上,供用户分析判断。如下图:
与此同时,tasks在tasktracker上也将这些profiling日志信息记录到了一个profile.out的日志文件中,该文件通常位于tasktracker机器上的上${HADOOP_HOME}/logs/userlogs/${attempt_id}下,和该task的stderr,stdout,syslog保存在同一个目录下,如下图:
该文件中的内容,还可以通过taskdetails.jsp的页面查看到。如下图:
有了这些信息,相信对于任何一位hadoop应用程序的开发者来说,就拥有了足够的定位job瓶颈的信息了。MR的应用程序开发同学,请优化您的job吧~~
所以在大多数情况下,写job,调试job,测试,上线运行,这套开发mapreduce应用程序的流程通常很多开发团队都走的很顺。但这并不是最难的,事情到这里也还远远不算完,程序哪里不高效,哪里消耗过多资源,哪里是瓶颈,如何优化,这一系列的问题,根据在下的经验,是开发团队考虑的相对不多的地方。
通常应用程序的开发者发现自己的hadoop job跑的不够高效,不够快的时候,第一时间想到的,是给hadoop平台的开发团队写邮件,说你hadoop平台又怎么怎么样,害的我的job跑的不够高效,然后在邮件的最后还附加上一句:“请hadoop平台开发团队多多考虑用户的建议和用户体验,优化hadoop,满足我这个什么什么job的需求,不然我就 @#¥%#¥%#”。而其实大部分情况下,只要稍微关注一下自己的程序,稍微进行一些优化,作业的执行效率就会高很多。说到这里内心又开始有些激动,还是言归正传吧……
刚才说到作业效率和瓶颈的问题,怎么发现作业的瓶颈呢?用户怎么知道他的作业的在哪个阶段最耗时,哪个地方最耗内存呢?其实hadoop提供了用户tunning自己job的方法,其中profiling tasks就是其中一种。
和debug task一样,profiling一个运行在分布式hadoop环境下的mapredeuce job是比较困难的。但在hadoop中,是可以让用户针对某些tasks进行profiling采集的,当这些task执行完后,将这些profiling日志保存的文件发送到作业的提交client机器上,然后用户就可以用自己熟悉的工具来分析这些profiling日志,进行tasks执行瓶颈的分析。
使用方法:
在JobConf中,有几个配置选项是可以用来控制task profiling行为的。比如对一个job,想要开启对其tasks的profiling功能,并设置profiling相应的HPROF参数,可以按如下方式:
conf.setProfileEnabled(true);
conf.setProfileParams("-agentlib:hprof=cpu=samples,heap=sites,depth=6," +
"force=n,thread=y,verbose=n,file=%s");
conf.setProfileTaskRange(true, "0-2");
第一行表示打开profiling task的功能,该功能默认情况下是关闭的。调用该接口相当于设置配置选项 mapred.task.profile=true,可以利用这种方式在hadoop job提交命令行上动态指定。
第二行是通过conf接口来设置对tasks进行HPROF 的profiling的采集参数,采用profiling enable的方式运行的tasks,会采用每个task一个独立的JVM的运行方式运行(即使enable了job的jvm reuse功能)。HPROF相关的采集参数设置,可以见其他资料。该选项也可以通过设置 mapred.task.profile.params 选项来指定。
第三行表示对job的哪些tasks需要进行profiling采集,第一true参数表示采集的是map tasks的性能数据,false的话表示采集reduce的性能数据,第二个参数表示只采集编号为0,1,2的tasks的数据,(默认为0-2)。如果想要采集除2,3,5编号的tasks,可以设置该参数为: 0-1,4,6-
Example
还是拿wordcount来举例,提交job命令如下:
bin/hadoop jar hadoop-examples-0.20.2-luoli.jar wordcount /
-D mapred.reduce.tasks=10 /
-D keep.failed.task.files=fales /
-D mapred.task.profile=true /
-D mapred.task.profile.params="-agentlib:hprof=cpu=samples,heap=sites,depth=6,force=n,thread=y,verbose=n,file=%s" /
$input /
$output
这样,当job运行时,就会对前三个task进行profiling的采集,采集信息包括cpu的采样信息,内存分配的信息数据,stack trace 6层的堆栈信息。这里需要注意的是,由于前三个tasks被进行了HPROF的性能采样,所以这几个tasks的执行效率会受到一定的影响,profiling的信息越详细,性能影响就越大。如下图,前三个map就明显比其他的map运行的要慢很多。
不过这种运行方式通常都不是线上运行方式,而是用来进行优化调试,所以关系不大。
而当job运行完成后,这三个tasks对应的profiling日志也会会传到提交机器上,供用户分析判断。如下图:
与此同时,tasks在tasktracker上也将这些profiling日志信息记录到了一个profile.out的日志文件中,该文件通常位于tasktracker机器上的上${HADOOP_HOME}/logs/userlogs/${attempt_id}下,和该task的stderr,stdout,syslog保存在同一个目录下,如下图:
该文件中的内容,还可以通过taskdetails.jsp的页面查看到。如下图:
有了这些信息,相信对于任何一位hadoop应用程序的开发者来说,就拥有了足够的定位job瓶颈的信息了。MR的应用程序开发同学,请优化您的job吧~~
分享到:
相关推荐
Hadoop的MapTask类源代码分析
springboot对hadoop增删改查源码,IE通过servlet访问hadoop图片,直接IE显示源码
Hadoop使用常见问题以及解决方法,简单实用
Hadoop使用常见问题以及解决方法.doc Hadoop使用常见问题以及解决方法.doc
Hadoop_进行分布式并行编程.doc Hadoop_进行分布式并行编程.doc
Hadoop搭建手册以及三种集群模式配置
在windows环境下开发hadoop时,需要配置HADOOP_HOME环境变量,变量值D:\hadoop-common-2.7.3-bin-master,并在Path追加%HADOOP_HOME%\bin,有可能出现如下错误: org.apache.hadoop.io.nativeio.NativeIO$Windows....
安装hadoop的时候或者使用的时候,会出现hadoop常见问题及解决方法
在分析Hadoop MapReduce作业执行模式后,提出了一种作业执行时间在线预测方法.该方法在结合历史信息的基础上,可根据作业在不同阶段的执行进度在线预测执行时间.该方法已在Hadoop-0.20.2中实现,并在一个包含19个节点的...
资源名称:linux hadoop搭建手册以及三种集群模式配置内容简介: linux hadoop搭建手册以及三种集群模式配置前半部分主要讲述了环境配置 环境配置环境配置;后半部分主要讲述Hadoop集群有三种运行模式,分别为单机...
Hadoop_eclipse-plugin编译方法
Hadoop_Hive安装--自己整理
hadoop学习整理的文档
hadoop+lucene 包含和solr、solrcloud对比
Java连接hadoop,对hadoop进行管理教程
hadoop安装时,会遇到不同问题,这里只是列举我自己遇到的问题
Hadoop+Hbase技术使用文档 1 目的 3 2 运行环境要求 4 2.1 支持的平台 4 2.2 硬件环境 4 2.3 软件环境 4 2.4 其他要求 5 3 安装jdk 5 3.1 查看本机的jdk版本 5 3.2 卸载低版本jdk 5 3.3 安装jdk 6 3.4 配置JDK1.6.0_...
apache hadoop架构作为mapreduce算法的一种开源应用,是应对海量数据的理想工具。项目负责人tomwhite透过本书详细阐述了如何使用hadoop构建可靠、可伸缩的分布式系统,程序员可从中探索如何分析海量数据集,管理员...
hadoop_tutorial hadoop入门经典 Hadoop 是一个能够对大量数据进行分布式处理的软件框架。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。...
hadoop相关的十几篇论文,有中文和英文的,学习hadoop很好的资料