有谁知道如何对Hadoop集群中运行的所有Java代码进行性能分析?
我将在一个简单的例子中解释。如果我们进行本地java开发,我们可以运行Yourkit来测量每个类的每个方法占用的CPU百分比。我们可以看到类A调用方法X,这占整个应用程序的90%的执行时间,然后修复代码中的低效率。
但是如果我们正在做mapreduce工作并在集群中运行它,我也希望看到什么是缓慢的:我们的map / reduce代码,或者框架本身。所以,我想有一个服务,它获取有关每个类/方法调用的信息和执行时间的百分比,将其收集到HDFS中,然后用CPU消耗分析调用树的方法。
Quetion:有人知道这样的解决方案是否存在?
P.S。 注意:我知道这样的事情会减慢集群的速度。我知道这样的事情应该在测试集群上或与客户达成协议。现在的问题是"是否存在这样的事情?"。感谢。
答案 0 :(得分:4)
我解决了这个问题。在这里http://ihorbobak.com/index.php/2015/08/05/cluster-profiling/您可以找到有关如何执行此操作的详细说明。
简要概述如何完成分析:
火焰图由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上下文中基本上是这样的:
如果您愿意,我们会对此进行更详细的记录。
我希望这有帮助!
答案 2 :(得分:0)
根据documentation,您可以使用默认情况下关闭的JobConf.setProfileEnabled(boolean)
来配置Driver类中的设置。希望这能为您提供一个起点。
关于此过程中的挑战的好博客,以及tool。只是为了您的信息而不是支持