0

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

我的用例是,我试图获取执行特定猪脚本所花费的时间,以及从 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 而言,每次运行都是不同的工作。在通过日志文件夹 grep 之后,我发现计数器在history/done/..文件夹中。是否存在组合结果的现有技术,或者我注定要编写自己的解析器来遍历每个日志文件。我认为用例对于现有解决方案来说已经足够普遍了——任何指针都会有所帮助。

谢谢。

4

2 回答 2

0

你有几个选择,我提前道歉,它们都没有特别吸引人的地方。

实施 PPNL

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


使用另一个收集指标的系统

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


解析您的日志文件

听起来你已经考虑过沿着这条路线走下去有几个原因:

  1. 所有其他选项都要求您非常了解另一个项目的内部结构,无论是 Pig、Lipstick 还是 Ambrose。如果您出于其他原因也打算深入研究其中之一,那么就去做吧,否则对于单个用例来说这是一笔巨大的投资。
  2. 所有其他选项仅限于 Pig 作业。如果您运行普通 Map/Reduce 作业或开始使用其他工具(如 hive、级联等),您将不会获得这些数据。如果您构建一些日志解析工具,将数据转换为众所周知的格式,那么得到处理后,您应该能够使用 hadoop 工具重用所有代码(实际解析除外)。
  3. 如果您的数据基于您的日志,并且您归档了所有日志,那么如果您在六个月后对之前未收集的某些数据点感兴趣,则始终可以回填。这在其他方法中是不可能的。
  4. 这是一种行之有效的既定模式。我无法指出很多在线资源讨论采用这种方法的人,但我遇到了很多独立采用这种方法并对此感到满意的人。
于 2013-10-08T22:59:14.563 回答
0

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

于 2014-03-30T20:09:17.483 回答