当前位置: 首页 > 知识库问答 >
问题:

跨多个作业聚合Hadoop作业计数器

田镜
2023-03-14

Hadoop:(ver-1.2.1),(1+8节点集群)

我的用例是,我试图获得执行特定pig脚本所花费的时间,以及从mapreduce的角度来看,这些时间是如何花费的。我需要多次运行pig脚本(比如说100),以获得平均时间。我启用了pig.udf.profile,这使我在每个udf函数上花费时间作为mapreduce计数器。我还对每个作业报告的其他延迟、内存度量(cpu时间、堆使用率)感兴趣。我可以从jobtracker web UI(host:50030/jobdetails.jsp?jobid=blah)中看到这些计数器。现在,我的问题是,是否有一种方法可以跨作业聚合这些计数器。或者,我将如何构建一个看起来像

                        Run1   Run2   Run3 ...
Cpu time              |      |      |
Redcr wait            |      |      |
UdfCntr1(approx_us)   |      |      |
UdfCntr2(approx_invc) |      |      |
CounterY(approx_us)   |      |      |

就Hadoop而言,每次运行都是不同的工作。在浏览日志文件夹后,我发现计数器在history/done/..文件夹中。是否有一种现有的技术来组合结果,或者我注定要编写自己的解析器来遍历每个日志文件。我认为这个用例对于现有的解决方案来说已经足够常见了--任何指针都会有帮助。

多谢了。

共有2个答案

姜泰宁
2023-03-14

一个简单的方法是构建一个小的Java方法,它获取所有的计数器并将它们发送到Graphite。*安装Graphite*让所有作业通过一个中央主类运行,该主类在作业结束时获取计数器,转换为键值,其中键可以是..,Value是一个长数字的计数器值。*将这些键值报告为CSV格式,石墨可以使用端口2003读取并通过普通套接字发送(我认为它是默认的石墨端口)。*使用Graphite Web UI查看和分析数据。

韶云瀚
2023-03-14

你有几个选择,我提前道歉,没有一个是特别有吸引力的。

实现PPNL

PigProgressNotificationListener是一个Java接口,用于向任意客户端公开Pig作业过程中发生的事件。如果您实现了这个接口并附加了类的实例,那么您就可以获取hadoop计数器(以及许多其他M/R相关的度量)并将它们存储起来以备以后使用。注意,这需要对Pig内部构件有合理的理解,尽管不一定是专家水平的理解。


使用另一个收集度量的系统

现在你的选择是有限的Ambrose(由Twitter开源)和Lipstick(由Netflix开源)。我不确定Ambrose是否收集hadoop计数器,但它可以扩展到。口红确实收集hadoop计数器。使用这两种方法中的任何一种,您都可以以不同的难度分析计数器,这取决于您如何配置它们来存储数据。


分析日志文件

听起来你已经考虑过走这条路了,原因有几个:

  1. 所有其他选项都要求您非常了解另一个项目的内部内容,无论是Pig、Lipstick还是Ambrose。如果您计划为了其他原因而投入其中的一个,那么就去做吧,但除此之外,对于一个用户来说,这是一笔很大的投资。
  2. 所有其他选项仅限于Pig作业。如果运行vanilla Map/Reduce作业或开始使用其他工具(如hive、cascading等),则不会获得这些数据。如果构建了一些日志解析工具,将数据转换为一种众所周知的格式,然后进行处理,则应该能够使用hadoop工具重用所有代码(实际的解析除外)。
  3. 如果您的数据是基于日志的,并且您将所有日志归档,那么如果您对以前没有收集到的数据点感兴趣,那么您可以一直回填。这在其他方法中是不可能的。
  4. 这是一个行之有效的既定模式。我无法指出很多讨论采取这种方法的人的在线资源,但我遇到了相当多的人,他们独立地采取了这种方法,并对此感到满意。
 类似资料:
  • 我正在使用Hadoop处理一个mapreduce项目。我目前有3个连续的工作。 我想使用Hadoop计数器,但问题是我想在第一个作业中进行实际计数,却在第3个作业的reducer中访问计数器值。 我怎样才能做到这一点呢?我应该在哪里定义?我需要通过它扔第二个工作吗?这也将有助于看到一些代码示例这样做,因为我还没有找到任何东西。 注意:我使用的是Hadoop 2.7.2 编辑:我已经尝试了这里解释的

  • 现在我有一个4阶段的MapReduce作业,如下所示:

  • 假设我在Hadoop环境中资源有限,我不想安排长时间运行的作业(即需要几天时间才能完成)。我正在分析大量过去的时间序列数据。我想安排一次需要一天数据的mapreduce作业(这需要一个小时来处理)。 那么,我如何安排,使新的工作提交后,前一个工作完成?

  • 我试图运行WordCount示例的一个变体,这个变体是,映射器输出文本作为键和文本作为值,而还原器输出文本作为键和NullWritable作为值。 除了地图,减少签名,我把主要的方法是这样的:

  • 我试图使用这里定义的基本字数。当IntSumReducer执行context.write时,是否可能将该context.write传递给第二个reducer或输出类,该reducer或输出类将IntSumReducer给出的最终列表减少/更改到单个最大频率? 我对Hadoop/MapReduce和Java中的jobs概念相当陌生,所以我不确定我需要如何修改默认的WordCount以使其符合要求。我

  • 我有一个,每个月底运行一次。运行后,它会将一些数据保存到数据库中。 当我扩展应用程序时(例如有2个实例),两个实例都运行计划作业,并且都保存数据,在一天结束时,我的数据库有相同的数据。 所以我希望计划作业只运行一次,而不管云上的实例数量如何。