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