在正常的
Java开发中,如果我想提高应用程序的性能,我通常的程序是运行附加了分析器的程序,或者在应用程序中嵌入一组检测标记.在任何一种情况下,最直接的目标是确定应用程序的热点,然后能够衡量我所做的更改的影响.
当应用程序是在hadoop集群中运行的map / reduce作业时,正确的模拟是什么?
当作业运行速度比您在开发沙箱中运行等效逻辑所预测的要慢得多时,有哪些选项可用于收集性能数据?
最佳答案 地图/减少框架
在Job-Tracker中观察工作.在这里,您将看到映射器和减速器需要多长时间.一个常见的例子是如果你在减速器上做了太多工作.在这种情况下,您会注意到,当减速器需要永久性时,映射器很快完成.
看看你的所有地图制作者是否花费了相似的时间也可能会很有趣.也许这项工作被一些缓慢的任务所阻碍?这可能表明群集中存在硬件缺陷(在这种情况下,推测执行可能是答案),或者工作负载分布不均匀.
操作系统
观察节点(使用简单的顶部或监视器如munin或ganglia)来查看您的作业是cpu绑定还是io绑定.例如,如果您的减少阶段受到约束,则可以增加您使用的减速器数量.
您可能在此处检测到的其他内容是您的任务用于大量内存.如果任务分析器没有足够的RAM增加每个节点的任务数量可能实际上会损害性能.监视器系统可能会突出显示生成的交换.
单一任务
您可以单独运行Mapper / Reducers进行性能分析.在这种情况下,您可以使用您已经知道的所有工具.
如果您认为只有在群集中执行作业时才会出现性能问题,您可以使用System.nanoTime()测量代码的相关部分的时间,并使用System.outs输出一些粗略的性能数字.
当然,还可以选择将JVM参数添加到子JVM并远程连接分析器.