有人知道如何对Hadoop集群中运行的所有java代码进行性能分析吗?
我将以一个简单的例子进行解释。如果我们进行本地java开发,我们可以运行Yourkit来测量每个类的每个方法占用的CPU百分比。我们可以看到,类A调用方法X,这占用了整个应用程序90%的执行时间,然后解决了代码中的低效问题。
但是,如果我们正在做一项mapreduce工作并在集群中运行它,我还想看看什么是迟缓的:我们的map/reduce代码,或者框架本身。因此,我希望有一个服务,它可以获得关于每个类/方法调用的信息及其执行时间的百分比,它将这些信息收集到HDFS中,然后分析方法调用树和CPU消耗。
问:有人知道是否存在这样的解决方案吗?
p.S。注意:我知道这样的事情会减慢集群的速度。我知道这样的事情应该在测试集群上完成,或者与客户达成一致。现在的问题是"存在这样的东西吗?"。谢谢
我解决了这个问题。在这里http://ihorbobak.com/index.php/2015/08/05/cluster-profiling/你可以找到如何做到这一点的详细说明。
简要总结如何进行分析:
- 在集群的每一台主机上,我们都放置了一个特殊的jar文件(StatsDJVM Profiler的一个模块)和一个javaagent,该javaagent将嵌入该机器上运行的每个JVM进程中
- "javaagent"是一段代码,用于检测JVM上运行的程序。Profiler的javaagent收集堆栈争用从JVM每秒处理100次,并将它们发送到专用的运行名为InfluxDB的NoSQL数据库的主机(https://influxdb.com)
- 在我们运行分布式应用程序并收集堆栈后,我们在此数据库上运行一组脚本来提取数据关于类/方法执行,并使用Flame可视化这些数据图表
火焰图由Brendan Gregg发明http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html.Brendan有一个非常好的视频,解释了它的工作原理:https://www.youtube.com/watch?v=nZfNehCzGdw。还有一本非常好的书,作者"系统性能:企业和云",我强烈推荐阅读。
很抱歉撞到了这个旧线程,但我觉得这可能对其他人也有用。
实际上我们也遇到过类似的问题。我们的一项生产工作是生产次优吞吐量,但没有说明原因。由于我们想限制对集群代码的依赖,并对不同的框架(如Spark、Hadoop,甚至非JVM应用程序)进行采样,我们决定基于perf构建自己的分布式探查器,与Ihor一样,我们使用FlameGraphs进行可视化。
软件当前处于alpha状态(https://github.com/cerndb/Hadoop-Profiler),并且目前只支持基于CPU的评测,但在分析此作业时已经显示出了它的潜力。
它在Hadoop上下文中基本上是这样工作的:
- 用户提供Hadoop应用程序ID
- HProfiler将向YARN集群执行API请求以检索所有节点。但是,也可以指定特定的主机地址
- 接下来,探查器将启动与所有节点的SSH会话,以检查映射程序是否在主机上运行
- 使用这些信息,探查器将向实际运行作业的节点启动新的SSH会话,以便对作业进行探查。在分析之后,构建一个Java映射(使用perf-map代理),以便将[未知]方法映射到Java方法
- 最后,将所有结果复制到入口点并进行聚合,以提供集群平均值。如果用户喜欢,他还可以做"非典型节点检测"。这基本上意味着程序将识别与其他节点相比做事情不同的节点
如果你愿意的话,我们对此做了更详细的报道。
https://db-blog.web.cern.ch/blog/joeri-hermans/2016-04-hadoop-performance-troubleshooting-stack-tracing-introduction
我希望这能有所帮助!
根据文档,您可以使用默认关闭的JobConf.setProfileEnabled(boolean)
在Driver类中配置设置。希望这能给你一个起点。
还有一个关于过程中挑战的好博客和一个工具。仅供参考,不支持