有人知道如何对hadoop集群中运行的所有java代码进行性能评测吗?
我将用一个简单的例子来解释。如果我们进行本地java开发,我们可以运行yourkit来测量每个类的每个方法占用的cpu百分比。我们可以看到,类a调用方法x,这占用了整个应用程序90%的执行时间,然后修复了代码中的低效性。
但是,如果我们正在做一个mapreduce工作并在集群中运行它,我还想看看什么是迟钝的:我们的map/reduce代码,或者框架本身。因此,我希望有一个服务,它可以获得关于每个类/方法调用的信息和它执行的时间百分比,它将这些信息收集到hdfs中,然后用cpu消耗分析方法调用树。
问:有人知道这样的解决方案是否存在吗?
p、 注:我知道这样的事情会减慢集群的速度。我知道这样的事情应该在测试集群上进行,或者与客户达成一致。现在的问题是“有这样的东西吗?”。谢谢。
3条答案
按热度按时间62lalag41#
对不起,我把这条旧线弄坏了,但我觉得这对其他人也可能有用。
实际上我们也遇到了类似的问题。我们的一个生产任务是生产一个次优的吞吐量,没有任何迹象表明原因。由于我们想限制对clusternode的依赖,并对spark、hadoop甚至非jvm应用程序等不同的框架进行采样,因此我们决定基于perf构建我们自己的分布式探查器,并且像ihor一样,我们使用flamegraphs进行可视化。
软件目前处于alpha状态(https://github.com/cerndb/hadoop-profiler),并且当前仅支持on-cpu评测,但在分析此作业时,它已经显示出它的潜力。
它在hadoop环境中基本上是这样工作的:
用户提供hadoop应用程序id。
hprofiler将对yarn集群执行api请求,以检索所有节点。但是,也可以指定特定的主机地址。
接下来,探查器将启动一个与所有节点的ssh会话,以检查Map器是否在主机上运行。
使用此信息,探查器将向实际运行作业的节点发起新的ssh会话,以便对它们进行探查。评测之后,构建一个javaMap(使用perf map agent),以便将[未知]方法Map到java方法。
最后,将所有结果复制到入口点并进行聚合,以提供聚类平均值。如果用户愿意,他也可以做“非典型节点检测”。这基本上意味着程序将识别与其他节点不同的节点。
如果你愿意,我们对此做了更详细的总结。
https://db-blog.web.cern.ch/blog/joeri-hermans/2016-04-hadoop-performance-troubleshooting-stack-tracing-introduction
我希望这有帮助!
gc0ot86w2#
根据文档,您可以在driver类中使用
JobConf.setProfileEnabled(boolean)
默认情况下禁用。希望这能给你一个起点。一个关于过程中的挑战的好博客,一个工具。只是为了你的信息而不是背书
8hhllhi23#
我解决了这个问题。在这里http://ihorbobak.com/index.php/2015/08/05/cluster-profiling/ 你可以找到如何做这件事的详细说明。
简要总结分析是如何完成的:
在集群的每台主机上,我们放置一个特殊的jar文件(statsd jvm profiler的一个mod),其中包含一个javaagent,它将嵌入在该机器上运行的每个jvm进程中。
“javaagent”是一段代码,用于检测jvm上运行的程序。profiler的javaagent每秒100次从jvm进程收集stacktrace,并将它们发送到运行nosql数据库influxdb的专用主机(https://influxdb.com).
在我们运行一个分布式应用程序并收集stacktrace之后,我们在这个数据库上运行一组脚本来提取关于类/方法执行的数据,并使用flame-graph来可视化这些数据。
火焰图是由布伦丹·格雷格发明的http://www.brendangregg.com/flamegraphs/cpuflamegraphs.html. brendan有一段很好的视频解释了它的工作原理:https://www.youtube.com/watch?v=nzfnehczgdw . 还有一本作者写的非常好的书“系统性能:企业和云”,我强烈推荐阅读。