我正在寻找一种方法,以事件驱动的方式收集各个hadoop作业的所有计数器和指标,以便将所有这些数据存储在elasticsearch中,以便以后进行故障排除和分析。
目前我发现很少有方法可以满足要求:
使用指标导出程序,尤其是ContainerMetrics,允许获取每容器内存和cpu使用情况以及MRAppMetrics,但汇总所有指标所有的工作。
使用REST API轮询MR History Server非常简单,但需要大量HTTP调用来收集作业,任务及其尝试的所有计数器。
将其他自定义EventHandler插入MRAppMaster的事件dispatcher,但MRAppMaster没有相应的机制来注册自定义事件处理程序。
使用javaagents的黑魔法(java instrumentation api),字节码修改和类似aop的功能来拦截EventHandler#handle(T)方法的所有执行。这种方式应该能够解决所有需求,但需要额外配置MR-jobs,javaagent开发和注册,并且通常看起来相当复杂。
所以,我想问一下是否有更简单的方法来收集个人hadoop工作的指标和计数器?
答案 0 :(得分:1)
您可以将指标实际提供给任何收件人:实施您自己的MetricsSink并配置hadoop以使用它。
或者您可以使用已与Hadoop发行版捆绑在一起的MetricsSink,例如GraphiteSink,并在Graphite中获取指标。
请注意,在作业完成(成功与否)之前,某些计数器不可用。
此外,选项2也存在使HistoryServer陷入困境的风险(当您使用大量映射器轮询某个作业时,它可能是OOM)。