在编写完成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的成绩分析系统的需求分析和开发工具。接着,详细介绍了Hadoop集群的搭建过程,包括VMWARE安装、CENTOS6.8安装和Hadoop的安装与配置。 在编码实现部分,本文介绍了使用MapReduce实现成绩分析...
总的来说,这篇论文深入研究了Hadoop在大数据环境下的应用及其性能优化,对于理解Hadoop的核心机制、推测执行策略以及MapReduce中的特定算法有重要价值。通过对Hadoop的深入研究,可以更好地应对大数据带来的挑战,...
基于Hadoop网站流量日志数据分析系统 1、典型的离线流数据分析系统 2、技术分析 - Hadoop - nginx - flume - hive - mysql - springboot + mybatisplus+vcharts nginx + lua 日志文件埋点的 基于Hadoop网站流量...
云计算大作业使用Hadoop对美国新冠肺炎疫情数据分析项目。 实验内容 统计指定日期下,美国每个州的累计确诊人数和累计死亡人数。 对实验1的结果按累计确诊人数进行倒序排序。(重写排序规则) 对实验1的结果再运算,...
Hive 是基于 Hadoop 的一个工具,提供完整的 sql 查询功能,可以将 sql 语句转换为 MapReduce 任务进行运行。ZooKeeper 是高效的,可扩展的协调系统,存储和协调关键共享状态。 大数据应用分析 大数据应用建议包括...
Hadoop 的源代码分析可以帮助开发者更好地理解 Hadoop 的架构和实现机制,从而更好地使用 Hadoop 实现大数据处理和分析。 Hadoop 的关键部分集中在图中的蓝色部分,这也是我们考察的重点。Hadoop 的包的功能分析...
2. **Hive**:基于Hadoop的数据仓库工具,允许用户使用SQL-like语法查询和管理存储在HDFS中的大数据集,简化了大数据分析。 3. **Pig**:一种高级数据流语言和执行框架,用于构建大规模数据处理的管道。 4. **...
在Hadoop源码分析中,我们能看到这些Google技术的影子,例如Chubby和ZooKeeper,GFS和HDFS,BigTable和HBase,MapReduce和Hadoop。通过对比这些技术,学习者可以更容易地把握Hadoop的设计思路。 Hadoop源码复杂且...