在编写完成MapReduce程序之后,调优就成为了一个大问题。如何使用现有工具快速地分析出任务的性能?
对于本地的java应用程序,进行分析可能稍微简单,但是hadoop是一个分布式框架,MapReduce任务可能在集群中的任意机器上被调度运行。而且本地Job运行器是一个与集群差异非常大的环境,数据流的形式也不同,应该在实际集群上对比新的执行时间和旧的执行时间。
hadoop的任务中可以选择启用profile,这可以在特定的Map/Reduce任务启动执行hprof分析。prof是一个JDK自带的分析工具,虽然只有基本功能,但是同样能够提供程序CPU运行和堆使用情况等相关的有用信息。
经过半天的摸索,大概使用方法介绍一下,所有的参数如下:
Option Name and Value Description Default --------------------- ----------- ------- heap=dump|sites|all heap profiling all cpu=samples|times|old CPU usage off monitor=y|n monitor contention n format=a|b text(txt) or binary output a file=<file> write data to file java.hprof[.txt] net=<host>:<port> send data over a socket off depth=<size> stack trace depth 4 interval=<ms> sample interval in ms 10 cutoff=<value> output cutoff point 0.0001 lineno=y|n line number in traces? y thread=y|n thread in traces? n doe=y|n dump on exit? y msa=y|n Solaris micro state accounting n force=y|n force output to <file> y verbose=y|n print messages about dumps y
CPU使用分析
cpu=samples
hprof工具通过抽样分析(定时)线程可以收集所有的运行线程,记录最频繁的StackTraces,官网上给出的例子,通过javac来进行性能分析:
Command used: javac -J-agentlib:hprof=cpu=samples Hello.java CPU SAMPLES BEGIN (total = 126) Fri Oct 22 12:12:14 2004 rank self accum count trace method 1 53.17% 53.17% 67 300027 java.util.zip.ZipFile.getEntry 2 17.46% 70.63% 22 300135 java.util.zip.ZipFile.getNextEntry 3 5.56% 76.19% 7 300111 java.lang.ClassLoader.defineClass2 4 3.97% 80.16% 5 300140 java.io.UnixFileSystem.list 5 2.38% 82.54% 3 300149 java.lang.Shutdown.halt0 6 1.59% 84.13% 2 300136 java.util.zip.ZipEntry.initFields 7 1.59% 85.71% 2 300138 java.lang.String.substring 8 1.59% 87.30% 2 300026 java.util.zip.ZipFile.open 9 0.79% 88.10% 1 300118 com.sun.tools.javac.code.Type$ErrorType.<init> 10 0.79% 88.89% 1 300134 java.util.zip.ZipFile.ensureOpen
count代表一个特定的StackTrace被采样的次数,而不是方法真实被调用了几次。这个选项不需要字节码注入,也不需要修改ClassLoader,不会对程序的正常执行造成多大的干扰。
cpu=times
hprof工具还可以通过字节码注入的方式分析每个方法的入口和出口,保存具体方法的调用次数和时间消耗,同样也会带来性能的消耗,比上一种方式要慢很多。
Command used: javac -J-agentlib:hprof=cpu=times Hello.java CPU TIME (ms) BEGIN (total = 103099259) Fri Oct 22 12:21:23 2004 rank self accum count trace method 1 5.28% 5.28% 1 308128 com.sun.tools.javac.Main.compile 2 5.16% 10.43% 1 308127 com.sun.tools.javac.main.Main.compile 3 5.15% 15.58% 1 308126 com.sun.tools.javac.main.Main.compile 4 4.07% 19.66% 1 308060 com.sun.tools.javac.main.JavaCompiler.compile 5 3.90% 23.56% 1 306652 com.sun.tools.javac.comp.Enter.main 6 3.90% 27.46% 1 306651 com.sun.tools.javac.comp.Enter.complete 7 3.74% 31.21% 4 305626 com.sun.tools.javac.jvm.ClassReader.listAll 8 3.74% 34.95% 18 305625 com.sun.tools.javac.jvm.ClassReader.list 9 3.24% 38.18% 1 305831 com.sun.tools.javac.comp.Enter.classEnter 10 3.24% 41.42% 1 305827 com.sun.tools.javac.comp.Enter.classEnter 11 3.24% 44.65% 1 305826 com.sun.tools.javac.tree.Tree$TopLevel.accept
这里的数据count代表了方法进入的真实次数。
Heap内存分析
heap=sites
hprof工具还可以打印出Java堆的相关对象信息。
下面的SITES纪录告诉我们最多的ZipEntry对象在一个特定的Site下,占用44%的总内存。
Command used: javac -J-agentlib:hprof=heap=sites Hello.java SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004 percent live alloc'ed stack class rank self accum bytes objs bytes objs trace name 1 44.73% 44.73% 1161280 14516 1161280 14516 302032 java.util.zip.ZipEntry 2 8.95% 53.67% 232256 14516 232256 14516 302033 com.sun.tools.javac.util.List 3 5.06% 58.74% 131504 2 131504 2 301029 com.sun.tools.javac.util.Name[] 4 5.05% 63.79% 131088 1 131088 1 301030 byte[] 5 5.05% 68.84% 131072 1 131072 1 301710 byte[]
还会打印如下的堆栈信息:
TRACE 302032: java.util.zip.ZipEntry.<init>(ZipEntry.java:101) java.util.zip.ZipFile$3.nextElement(ZipFile.java:435) java.util.zip.ZipFile$3.nextElement(ZipFile.java:413) com.sun.tools.javac.jvm.ClassReader.openArchive(ClassReader.java:1442) TRACE 302033: com.sun.tools.javac.util.List.<init>(List.java:43) com.sun.tools.javac.util.List.<init>(List.java:51) com.sun.tools.javac.util.ListBuffer.append(ListBuffer.java:98) com.sun.tools.javac.jvm.ClassReader.openArchive(ClassReader.java:1442)
每个栈帧都包含了类型名称,方法名称和行号,用户可以通过depth设置栈的深度(默认是4),堆栈信息揭露了哪些方法触发了堆内存分配。
heap=dump
如果想得到一个大而全的当前堆活动对象,可以使用这个选项,但是这会导致一个巨大的输出文件。
分析源码并使用
在hadoop的源码中,方法中指定了profile的使用:
org.apache.hadoop.mapred.MapReduceChildJVM public static List<String> getVMCommand(InetSocketAddress taskAttemptListenerAddr, Task task, ID jvmID) if (conf.getProfileEnabled()) { if (conf.getProfileTaskRange(task.isMapTask() ).isIncluded(task.getPartition())) { vargs.add( String.format( conf.getProfileParams(), getTaskLogFile(TaskLog.LogName.PROFILE) ) ); if (task.isMapTask()) { vargs.add(conf.get(MRJobConfig.TASK_MAP_PROFILE_PARAMS, "")); } else { vargs.add(conf.get(MRJobConfig.TASK_REDUCE_PROFILE_PARAMS, "")); } } }
hadoop任务中可以通过编码来设置profile:
conf.setProfileEnabled(true); conf.setProfileParams(…); conf.setProfileTaskRange...
也可以通过设置参数:
- mapreduce.task.profile=true,可以设置profile enabled状态,开启profile模式;
- mapreduce.task.profile.maps=0-2,我们不可能将所有map都进行profile,profile是非常消耗资源的(事实上能够看出使用profile的map/reduce执行速度明显变慢),不建议在生产环境中使用profiler,那么使用这个参数就可以指定执行profile的part;
- mapreduce.task.profile.reduces=0-2,同上;
- mapreduce.task.profile.params,指定profile的选项,默认值:-agentlib:hprof=cpu=samples,heap=sites,force=n,thread=y, verbose=n,file=%s,
最后的profiler文件放在<LOG_DIR>中,与stderr, stdout在同文件夹,名称为profile.out
hadoop jar命令中加入如下的参数:
-Dmapreduce.task.profile=true -Dmapreduce.task.profile.params="-agentlib:hprof=cpu=samples,heap=dump,force=y,interval=100,thread=y,verbose=n,file=%s"
经过实验采样分析后的CPU指数:
CPU SAMPLES BEGIN (total = 62259) Wed Nov 19 14:49:57 2014 rank self accum count trace method 1 34.01% 34.01% 21173 300882 sun.nio.ch.EPollArrayWrapper.epollWait 2 6.02% 40.02% 3746 301467 com.xxx.Counter.update 3 5.65% 45.68% 3518 301353 java.lang.String.split 4 2.66% 48.34% 1656 301358 java.lang.Double.parseDouble 5 2.28% 50.62% 1422 301240 java.io.FileInputStream.readBytes 6 2.27% 52.89% 1414 301354 java.lang.Double.parseDouble 7 2.08% 54.97% 1292 301349 java.util.HashMap.hash 8 2.07% 57.04% 1291 301346 sun.nio.cs.UTF_8$Decoder.decodeArrayLoop 9 1.35% 58.39% 842 301373 java.util.HashMap.hash 10 0.98% 59.37% 611 301364 org.apache.hadoop.io.compress.snappy.SnappyDecompressor.decompress
考虑到使用cpu=times时,使用字节码增强技术可能导致计算量增大,MR任务可能出现超时的情况(超时的日志如下,表明TaskTracker可能一段时间内没有向JobTracker发送必要的信息),如果进行测试工作,可以将超时参数暂时设置得稍大一点,以避免这种情况。
AttemptID:attempt_1413206225298_36800_m_000000_1 Timed out after 1200 secs
相关推荐
在本篇“Hadoop经典系列(十一)性能分析实验初步”中,我们将深入探讨Hadoop分布式计算框架的性能分析,这是大数据处理的关键环节。通过理解Hadoop的工作原理和优化策略,我们可以有效地提升集群效率,降低任务执行...
使用hadoop进行数据分析天气数据分析.zip使用hadoop进行数据分析天气数据分析.zip使用hadoop进行数据分析天气数据分析.zip使用hadoop进行数据分析天气数据分析.zip使用hadoop进行数据分析天气数据分析.zip使用hadoop...
如何使用hadoop进行数据分析.zip 如何使用hadoop进行数据分析.zip 如何使用hadoop进行数据分析.zip 如何使用hadoop进行数据分析.zip 如何使用hadoop进行数据分析.zip 如何使用hadoop进行数据分析.zip 如何使用hadoop...
从给定文件的描述来看,文中将对Hadoop分布式存储架构HDFS进行建模分析,并使用PEPA方法进行性能评估。研究的目的是为了更好地理解HDFS的性能表现,以及在云计算环境下Hadoop架构的优势和可能存在的不足,为优化提供...
Hive是建立在Hadoop之上的数据仓库工具,它允许用户使用SQL-like语言进行数据查询和分析,简化了大数据分析的过程。Hive将SQL语句转换为MapReduce任务运行在Hadoop集群上,提供了一种更易用的接口来处理Hadoop中的大...
本实验旨在利用Hadoop进行豆瓣电影数据的分析,以洞察电影产业的发展趋势。 Hadoop的核心组件包括: 1. **HDFS**(Hadoop Distributed File System):分布式文件系统,负责在多台计算机之间存储和管理数据,提供高...
在这个项目中,我们将分析豆瓣电影的影评数据,通过对用户的评价进行统计分析,找出最受欢迎的电影特征。具体来说,我们需要计算电影的平均分,统计评分分布,以及找出出现频次最高的十大词语。这有助于我们理解用户...
在Hadoop平台上,我们通常会使用Hive或Pig这样的数据仓库工具进行数据预处理和查询。Hive提供了一种SQL-like的语言,使得非程序员也能方便地操作大数据。Pig则采用脚本语言Pig Latin,适合复杂的转换操作。在这项...
然后,讨论了基于Hadoop的成绩分析系统的需求分析和开发工具。接着,详细介绍了Hadoop集群的搭建过程,包括VMWARE安装、CENTOS6.8安装和Hadoop的安装与配置。 在编码实现部分,本文介绍了使用MapReduce实现成绩分析...
本案例旨在介绍如何使用Hadoop这一强大的大数据处理工具来进行数据分析,具体场景设定在一个在线零售商的销售数据上。该数据包含了订单信息、产品信息以及客户信息。目标是对这些数据进行深入分析,以便于了解哪些...
总的来说,这篇论文深入研究了Hadoop在大数据环境下的应用及其性能优化,对于理解Hadoop的核心机制、推测执行策略以及MapReduce中的特定算法有重要价值。通过对Hadoop的深入研究,可以更好地应对大数据带来的挑战,...
基于Hadoop网站流量日志数据分析系统 1、典型的离线流数据分析系统 2、技术分析 - Hadoop - nginx - flume - hive - mysql - springboot + mybatisplus+vcharts nginx + lua 日志文件埋点的 基于Hadoop网站流量...
云计算大作业使用Hadoop对美国新冠肺炎疫情数据分析项目。 实验内容 统计指定日期下,美国每个州的累计确诊人数和累计死亡人数。 对实验1的结果按累计确诊人数进行倒序排序。(重写排序规则) 对实验1的结果再运算,...
解决Hadoop中文乱码问题的关键在于识别和匹配数据的正确编码,并在Hadoop组件和工具中设置相应的编码选项。在实际操作中,可能需要结合日志信息和源码调试来定位问题。同时,建立良好的编码规范,统一数据的编码格式...
Hive 是基于 Hadoop 的一个工具,提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。ZooKeeper 是高效的,可扩展的协调系统,存储和协调关键共享状态。 大数据应用分析 大数据应用建议包括...
Hadoop 的源代码分析可以帮助开发者更好地理解 Hadoop 的架构和实现机制,从而更好地使用 Hadoop 实现大数据处理和分析。 Hadoop 的关键部分集中在图中的蓝色部分,这也是我们考察的重点。Hadoop 的包的功能分析...
2. **Hive**:基于Hadoop的数据仓库工具,允许用户使用SQL-like语法查询和管理存储在HDFS中的大数据集,简化了大数据分析。 3. **Pig**:一种高级数据流语言和执行框架,用于构建大规模数据处理的管道。 4. **...