如何对Hadoop集群进行性能分析

时间:2015-06-26 17:47:22

标签: java hadoop mapreduce apache-spark profiling

有谁知道如何对Hadoop集群中运行的所有Java代码进行性能分析?

我将在一个简单的例子中解释。如果我们进行本地java开发,我们可以运行Yourkit来测量每个类的每个方法占用的CPU百分比。我们可以看到类A调用方法X,这占整个应用程序的90%的执行时间,然后修复代码中的低效率。

但是如果我们正在做mapreduce工作并在集群中运行它,我也希望看到什么是缓慢的:我们的map / reduce代码,或者框架本身。所以,我想有一个服务,它获取有关每个类/方法调用的信息和执行时间的百分比,将其收集到HDFS中,然后用CPU消耗分析调用树的方法。

Quetion:有人知道这样的解决方案是否存在?

P.S。 注意:我知道这样的事情会减慢集群的速度。我知道这样的事情应该在测试集群上或与客户达成协议。现在的问题是"是否存在这样的事情?"。感谢。

3 个答案:

答案 0 :(得分:4)

我解决了这个问题。在这里http://ihorbobak.com/index.php/2015/08/05/cluster-profiling/您可以找到有关如何执行此操作的详细说明。

简要概述如何完成分析:

  • 在集群的每个主机上,我们放置了一个特殊的jar文件(一个StatsD JVM Profiler的mod),其中包含一个javaagent,它将嵌入在该机器上运行的每个JVM进程中。
  • “javaagent”是一段代码,用于检测JVM上运行的程序。 Profiler的javaagent收集stacktraces 从JVM进程每秒100次,并将它们发送到专用 运行名为InfluxDB(https://influxdb.com)的NoSQL数据库的主机。
  • 运行分布式应用程序并收集堆栈跟踪后,我们在此数据库上运行一组脚本来提取数据 关于类/方法的执行以及使用Flame可视化这些数据 曲线图。

火焰图由Brendann Gregg http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html发明。 Brendan有一个非常好的视频解释了它的工作原理:https://www.youtube.com/watch?v=nZfNehCzGdw。本作者还有一本非常好的书“系统性能:企业和云”,我强烈建议您阅读。

答案 1 :(得分:1)

很抱歉碰到这个老线程,但我觉得这对其他人也很有用。

我们实际上遇到了类似的问题。我们的一项生产工作是产生次优的吞吐量而没有任何迹象表明原因。由于我们希望限制对clusternode的依赖性并对不同的框架(如Spark,Hadoop甚至非基于JVM的应用程序)进行采样,因此我们决定基于perf构建自己的分布式分析器,就像Ihor一样,我们使用FlameGraphs进行可视化

该软件目前处于alpha状态(https://github.com/cerndb/Hadoop-Profiler),目前仅支持CPU上的分析,但在分析此工作时已经显示出其潜力。

它在Hadoop上下文中基本上是这样的:

  1. 用户提供Hadoop应用程序ID。
  2. HProfiler将对YARN群集执行API请求以检索所有节点。但是,也可以指定特定的主机地址。
  3. 接下来,探查器将启动与所有节点的SSH会话,以检查映射器是否在主机上运行。
  4. 使用此信息,探查器将启动与实际运行作业的节点的新SSH会话,以便对其进行分析。在分析之后,构建Java映射(使用perf-map-agent)以将[unknown]方法映射到Java方法。
  5. 最后,将所有结果复制到入口点并进行聚合,以提供群集平均值。如果用户喜欢,他也可以进行“非典型节点检测”。这基本上意味着程序将识别与其他节点相比做不同事情的节点。
  6. 如果您愿意,我们会对此进行更详细的记录。

    https://db-blog.web.cern.ch/blog/joeri-hermans/2016-04-hadoop-performance-troubleshooting-stack-tracing-introduction

    我希望这有帮助!

答案 2 :(得分:0)

根据documentation,您可以使用默认情况下关闭的JobConf.setProfileEnabled(boolean)来配置Driver类中的设置。希望这能为您提供一个起点。

关于此过程中的挑战的好博客,以及tool。只是为了您的信息而不是支持